using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;



namespace Bouncer
{
    class Sound
    {
        /// <summary>
        /// массив байтов, содержащий данные о звуке
        /// </summary>
        private byte[] soundBytes;

        /// <summary>
        /// Управление звуком в игре (Включать или выключать)
        /// </summary>
        public static bool Enabled = true;

        private enum Flags
        {
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001,
            SND_NODEFAULT = 0x0002,
            SND_MEMORY = 0x0004,
            SND_LOOP = 0x0008,
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000,
            SND_ALIAS = 0x00010000,
            SND_ALIAS_ID = 0x00110000,
            SND_FILENAME = 0x00020000,
            SND_RESOURCE = 0x00040004
        }


        /// <summary>
        /// Функция Windows API для воспроизведения звука. 
        /// </summary>
        /// <param name="szSound">Массив байтов, содержащих данные</param>
        /// <param name="hMod">Дескриптор к модулю, содержащим звуковой ресурс</param>
        /// <param name="flags">Флаги для управления звуком</param>
        /// <returns></returns>
        [DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        private extern static int WCE_PlaySoundBytes(
        byte[] szSound,
        IntPtr hMod,
        int flags);


        /// <summary>
        /// Создание экземпляра sound и хранение данных о звуке
        /// </summary>
        /// <param name="soundStream">Поток для чтения звука</param>
        public Sound(Stream soundStream)
        {
            // создаем массив байтов для приема данных
            soundBytes = new byte[soundStream.Length];
            // читаем данные из потока
            soundStream.Read(soundBytes, 0, (int)soundStream.Length);
        }

        /// <summary>
        /// Проигрываем звук
        /// </summary>
        public void Play()
        {
            if (Sound.Enabled)
            {
                WCE_PlaySoundBytes(
                   soundBytes,
                   IntPtr.Zero,
                   (int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
            }
        }

    }
}
