NAudio асинхронный звук

Я хочу иметь возможность асинхронно выгружать звуковые файлы на аудиовыход на протяжении всей жизни приложения. Мне нужно иметь возможность запросить файл для воспроизведения и смешать его с любыми файлами, которые уже воспроизводятся. Один и тот же файл может вызываться несколько раз. Подходит ли вам WaveMixerStream? Безопасно ли/рекомендуется ли держать поток проигрывателя и микшера открытым на протяжении всего срока службы приложения или это вызовет проблемы с производительностью?

//globals
IWavePlayer _Context;
WaveMixerStream32 _Mixer;

//constructor
_Context = new DirectSoundOut();
_Mixer = new WaveMixerStream32();
_Context.Init( Instance._Mixer );
_Context.Play();

//asynchronous sound output, on demand from user interface
_Mixer.AddInputStream( sound.FileWaveStream );

person chisel    schedule 17.10.2012    source источник


Ответы (1)


Есть несколько способов сделать это, но вот один из вариантов. Создайте плеер и микшер открытым все время. Я бы использовал MixingSampleProvider в качестве микшера, передавая его через SampleToWaveProvider или SampleToWaveProvider16 в качестве входных данных для проигрывателя.

Чтобы гарантировать, что воспроизведение никогда не останавливается, вам нужно либо настроить MixingSampleProvider так, чтобы Read всегда возвращал количество запрошенных семплов, даже если нет активных входных данных, либо добавить фиктивный ввод, который представляет собой бесконечный поток тишины.

Теперь, чтобы воспроизвести звук, просто передайте ISampleProvider (например, AudioFileReader) в AddMixerInput вашего микшера, и он воспроизведет его. Он автоматически удаляет входы, когда они достигают конца.

Альтернативой является создание нового объекта проигрывателя для каждого воспроизводимого звука. Недостатком является разработка способа сохранить объект проигрывателя живым до остановки воспроизведения (возможно, путем сохранения в словаре, а затем удаления и извлечения его при срабатывании события PlaybackStopped). Преимущество заключается в том, что вы не держите звуковое устройство открытым, когда вам это не нужно, и вы можете легко воспроизводить звуки с разной частотой дискретизации / количеством каналов.

person Mark Heath    schedule 17.10.2012