2

我希望能够在应用程序的整个生命周期中异步地将声音文件转储到音频输出。我需要能够请求要播放的文件并将其与任何已经播放的文件混合。同一个文件可能会被调用多次。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 );
4

1 回答 1

1

有几种方法可以做到这一点,但这里有一种选择。创建一个始终打开的播放器和混音器。我会使用 MixingSampleProvider 作为混音器,通过 SampleToWaveProvider 或 SampleToWaveProvider16 作为播放器的输入。

为了确保播放永不停止,您需要自定义 MixingSampleProvider 以便即使没有活动输入,Read 也始终返回请求的样本数,或者添加一个虚拟输入,它是一个永无止境的静音流。

现在要播放声音,只需将 ISampleProvider(例如 AudioFileReader)传递到混音器的 AddMixerInput 中,它就会播放它。当输入到达末尾时,它会自动删除输入。

另一种方法是为每个要播放的声音创建一个新的播放器对象。缺点是想办法让播放器对象保持活动状态直到播放停止(可能通过存储在字典中,然后在 PlaybackStopped 事件触发时将其释放并取出)。优点是您不需要在不需要时保持声音设备打开,并且您可以轻松地以不同的采样率/通道数播放声音。

于 2012-10-17T12:33:24.460 回答