使用Naudio同时在两个不同的audiodevice上播放音频

本文关键字:audiodevice 播放 音频 两个 Naudio 使用 | 更新日期: 2023-09-27 17:54:31

我的问题类似于这里的一个:使用Naudio

同时播放音频到两个不同的audiodevice

但我在这里再问一遍,因为上面的链接没有明确回答。

我也有它在:在扬声器和耳机中播放声音wpf

灵感来源:使用c#

在特定设备上播放声音

我在这里添加源代码和添加NAudio标签。

我有一个wpf应用程序,我正在使用soundPlayer类播放声音(例如铃声)。目前,该声音在扬声器或耳机上播放(如果插入)。我想应用程序播放扬声器上的音调,即使当耳机被插入。我知道在android中有办法做到这一点,但在wpf中找不到任何方法。我还想让用户选择他想听到声音的设备的UI。任何帮助都是感激的。谢谢!

public void detectDevices()
{
    int waveOutDevices = WaveOut.DeviceCount;
    switch (waveOutDevices)
    {
        case 1:
            var wave1 = new WaveOut();
            wave1.DeviceNumber = 0;
            playSound(0); 
            break;
        case 2:
            var wave2 = new WaveOut();
            wave2.DeviceNumber = 0;
            playSound(0);
            var wave3 = new WaveOut();
            wave3.DeviceNumber = 1;
            playSound(1); 
            break;
    }
}
public void playSound(int deviceNumber)
{
    disposeWave();// stop previous sounds before starting
    waveReader = new NAudio.Wave.WaveFileReader(fileName);
    var waveOut = new NAudio.Wave.WaveOut();
    waveOut.DeviceNumber = deviceNumber;
    output = waveOut;
    output.Init(waveReader);
    output.Play();
}
public void disposeWave()
{
    if (output != null)
    {
        if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
        {
            output.Stop();
            output.Dispose();
            output = null;
        }
    }
    if (wave != null)
    {
        wave.Dispose();
        wave = null;
    }
}
case eSelector.startIncomingRinging:
            fileName = ("Ring.wav");
            detectDevices();

使用上面的代码,我仍然只在一个设备(耳机或扬声器)上听到铃声。

使用Naudio同时在两个不同的audiodevice上播放音频

您需要两个WaveOut实例,每个声卡一个。最简单的方法是如果你从文件播放,也有两个WaveFileReader实例。恐怕你不能轻易地同步它们,你只能让它们一起玩,然后期待最好的结果。

上面代码中的wave1, wave2和wave3类完全不做任何事情。音频将使用你在playSound中创建的WaveOut设备播放。您似乎有一个单独的类属性称为output,另一个称为waveReader,当您需要两个时。