Загрузка данных


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();
            }
        }
    }
}