Воспроизведение асинхронного файла WAV несколько раз - PullRequest
4 голосов
/ 13 декабря 2010

У меня есть приложение, которое мне нужно для воспроизведения wav-файла при нажатии клавиши, я использую класс SoundPlayer, но если при нажатии новой клавиши воспроизводится другой звук, он останавливает звук и воспроизводит его снова, делая егоВыглядит ужасно ...

есть ли способ воспроизвести тот же самый звук снова, даже если есть другой воспроизводимый?

спасибо!

Ответы [ 4 ]

5 голосов
/ 13 декабря 2010

Используйте PlaySound из Windows API в сочетании с флагами SND_ASYNC и SND_NOSTOP.

http://www.pinvoke.net/default.aspx/winmm.playsound

Использование

//And the actual usage
PlaySound (fileName, UIntPtr.Zero, (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_ASYNC | SoundFlags.SND_NOSTOP));

Объявления

[Flags]
public enum SoundFlags
{
    /// <summary>play synchronously (default)</summary>
    SND_SYNC = 0x0000,    
    /// <summary>play asynchronously</summary>
    SND_ASYNC = 0x0001,
    /// <summary>silence (!default) if sound not found</summary>
    SND_NODEFAULT = 0x0002,
    /// <summary>pszSound points to a memory file</summary>
    SND_MEMORY = 0x0004,
    /// <summary>loop the sound until next sndPlaySound</summary>
    SND_LOOP = 0x0008,    
    /// <summary>don't stop any currently playing sound</summary>
    SND_NOSTOP = 0x0010,
    /// <summary>Stop Playing Wave</summary>
    SND_PURGE = 0x40,
    /// <summary>don't wait if the driver is busy</summary>
    SND_NOWAIT = 0x00002000,
    /// <summary>name is a registry alias</summary>
    SND_ALIAS = 0x00010000,
    /// <summary>alias is a predefined id</summary>
    SND_ALIAS_ID = 0x00110000,
    /// <summary>name is file name</summary>
    SND_FILENAME = 0x00020000,
    /// <summary>name is resource name or atom</summary>
    SND_RESOURCE = 0x00040004
}

[DllImport("winmm.dll", SetLastError=true)]
static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);

Обновление

Извините, вы правы.API нельзя использовать для одновременного воспроизведения звуков.Вы должны использовать API waveOut.Посмотрите на эту статью: http://www.codeproject.com/KB/audio-video/cswavrec.aspx

1 голос
/ 13 декабря 2010

Существует бесплатная (для некоммерческих приложений) библиотека звуков для .NET, которая называется Irrklang , которая поддерживает воспроизведение нескольких звуков (по крайней мере, wav и mp3 из того, что я могу собрать) одновременно, их учебник специально охватывает этот случай как базовое использование библиотеки.

1 голос
/ 13 декабря 2010

NAudio может предложить то, что вам нужно. Я сам этим не пользовался, но он относительно популярен.

0 голосов
/ 13 декабря 2010

Если вы спросите: «Как я могу воспроизвести несколько звуков одновременно», SoundPlayer никогда не будет ответом. PlaySound, я считаю, также ограничен.

Вы можете посмотреть этот вопрос и этот вопрос , чтобы узнать больше о звуковых API. Я быстро взглянул на SDL и SDL Mixer и подумал, что SDL слишком примитивен (вы должны сами микшировать звуки), а SDL Mixer был слишком тяжелым (все это и пакет фишек - неограниченное количество каналов сведение и музыка (mp3, ogg, midi и т. д.)). Я не смог увидеть онлайн-ссылку на привязки BASS C #, но она бесплатна для некоммерческого использования.

...