Загрузка данных
using System;
using System.IO;
using System.Media;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using NAudio.Wave; // Для записи с микрофона
namespace Lab19_Multimedia
{
public partial class Form1 : Form
{
// =============================================================
// ИМПОРТ ФУНКЦИИ WINDOWS API ДЛЯ ВОСПРОИЗВЕДЕНИЯ MP3/WMA
// =============================================================
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
private static extern int mciSendString(
string strCommand,
StringBuilder strReturnString,
int cchReturn,
IntPtr hwndCallback);
// Переменные для записи звука с микрофона (NAudio)
private WaveInEvent waveSource = null;
private WaveFileWriter waveFile = null;
private string recordedFilePath = Path.Combine(Application.StartupPath, "my_record.wav");
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "Практическая работа №19: Мультимедиа и Справка CHM";
btnStopRecord.Enabled = false;
}
// =============================================================
// 1. ВОСПРОИЗВЕДЕНИЕ WAV ЧЕРЕЗ КЛАСС SoundPlayer
// =============================================================
private void btnPlayWav_Click(object sender, EventArgs e)
{
try
{
// Если записан собственный файл с микрофона — играем его, иначе системный звук Windows
string wavPath = File.Exists(recordedFilePath)
? recordedFilePath
: @"C:\Windows\Media\tada.wav";
if (File.Exists(wavPath))
{
SoundPlayer player = new SoundPlayer(wavPath);
player.Play(); // Воспроизведение в фоновом асинхронном режиме
}
else
{
// Системный сигнал динамика, если wav-файл отсутствует на диске
SystemSounds.Asterisk.Play();
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка воспроизведения WAV: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// =============================================================
// 2. ВОСПРОИЗВЕДЕНИЕ MP3/WMA ЧЕРЕЗ API mciSendString
// =============================================================
private void btnPlayMp3_Click(object sender, EventArgs e)
{
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Filter = "Аудиофайлы (*.mp3;*.wma;*.wav)|*.mp3;*.wma;*.wav|Все файлы (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
// Закрываем предыдущий аудиопоток, если он был открыт
mciSendString("close MyMusic", null, 0, IntPtr.Zero);
// Открываем выбранный файл под псевдонимом "MyMusic"
string openCommand = $"open \"{ofd.FileName}\" type mpegvideo alias MyMusic";
mciSendString(openCommand, null, 0, IntPtr.Zero);
// Запускаем воспроизведение
mciSendString("play MyMusic", null, 0, IntPtr.Zero);
}
}
}
private void btnStopMp3_Click(object sender, EventArgs e)
{
// Остановка и закрытие дескриптора MCI
mciSendString("stop MyMusic", null, 0, IntPtr.Zero);
mciSendString("close MyMusic", null, 0, IntPtr.Zero);
}
// =============================================================
// 3. ЗАПИСЬ ЗВУКА С МИКРОФОНА ЧЕРЕЗ NAUDIO
// =============================================================
private void btnStartRecord_Click(object sender, EventArgs e)
{
try
{
// Проверяем наличие устройств ввода (микрофонов)
if (WaveInEvent.DeviceCount == 0)
{
MessageBox.Show("В системе не найдены микрофоны!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
waveSource = new WaveInEvent();
// Стандартное качество CD: 44100 Гц, 16 бит, стерео (2 канала)
waveSource.WaveFormat = new WaveFormat(44100, 16, 2);
// Обработчик поступления порции аудиоданных с микрофона
waveSource.DataAvailable += (s, a) =>
{
if (waveFile != null)
{
waveFile.Write(a.Buffer, 0, a.BytesRecorded);
waveFile.Flush();
}
};
// Обработчик окончания записи
waveSource.RecordingStopped += (s, a) =>
{
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
lblRecordStatus.Text = "Микрофон: запись завершена и сохранена!";
};
waveFile = new WaveFileWriter(recordedFilePath, waveSource.WaveFormat);
waveSource.StartRecording();
lblRecordStatus.Text = "Микрофон: идет запись...";
btnStartRecord.Enabled = false;
btnStopRecord.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show("Ошибка инициализации микрофона: " + ex.Message);
}
}
private void btnStopRecord_Click(object sender, EventArgs e)
{
if (waveSource != null)
{
waveSource.StopRecording();
btnStartRecord.Enabled = true;
btnStopRecord.Enabled = false;
MessageBox.Show($"Звук сохранен в файл:\n{recordedFilePath}", "Запись завершена", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
// =============================================================
// 4. ВЫЗОВ ФАЙЛА СПРАВКИ CHM (Help.ShowHelp)
// =============================================================
private void btnOpenChm_Click(object sender, EventArgs e)
{
// В качестве примера берем файл справки Windows или заданный путь
string helpFile = @"C:\Windows\Help\Windows\Index.chm";
if (!File.Exists(helpFile))
{
// Запасной стандартный путь к справке на случай разных сборок Windows
helpFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "Help", "help.chm");
}
if (File.Exists(helpFile))
{
// Стандартный вызов окна справки CHM
Help.ShowHelp(this, helpFile);
}
else
{
// Если скомпилированного chm нет, показываем диалог выбора любого доступного CHM файла
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Filter = "Файлы справки (*.chm)|*.chm|Все файлы (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
Help.ShowHelp(this, ofd.FileName);
}
}
}
}
// Освобождение ресурсов при закрытии программы
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mciSendString("close MyMusic", null, 0, IntPtr.Zero);
if (waveSource != null)
{
waveSource.StopRecording();
}
}
}
}