Воспроизведение аудио на двух разных аудиоустройствах одновременно с Naudio

Мой вопрос похож на один здесь: Воспроизведение аудио на двух разных аудиоустройствах одновременно с Наудио

Но я спрашиваю это здесь снова, так как на него нет четкого ответа в приведенной выше ссылке.

У меня также есть это по адресу: Воспроизведение звука как в динамике, так и в гарнитуре wpf

Источник вдохновения: Воспроизведение звука на определенном устройстве с помощью C#

Я добавляю исходный код и добавляю сюда тег NAudio.

У меня есть приложение wpf, и я использую класс soundPlayer для воспроизведения звука (например, для рингтона). В настоящее время звук воспроизводится либо через динамики, либо через гарнитуру (если она подключена). Я хотел бы, чтобы приложение воспроизводило тон на динамике, даже когда подключены гарнитуры. Я знаю, что в Android есть способы сделать это, но не смог найти их в wpf. Я также хотел бы, чтобы пользователь мог выбирать устройства, в которых он хотел бы слышать звук. Любая помощь приветствуется. Спасибо !

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();

Я по-прежнему слышу рингтон только на одном устройстве (в гарнитуре или динамиках), используя приведенный выше код.


person user2054702    schedule 27.03.2014    source источник


Ответы (1)


Вам нужно два экземпляра WaveOut, по одному на каждую звуковую карту. И тогда самый простой способ, если вы играете из файла, - это также иметь два экземпляра WaveFileReader. Боюсь, вы не можете легко синхронизировать их, вам просто нужно запустить их вместе и надеяться на лучшее.

Классы wave1, wave2 и wave3 в приведенном выше коде абсолютно ничего не делают. Звук будет воспроизводиться с помощью устройства WaveOut, созданного вами в playSound. Кажется, у вас есть одно свойство класса, называемое output, и другое свойство, называемое waveReader, когда вам нужно по два каждого из них.

person Mark Heath    schedule 28.03.2014
comment
Спасибо ! У меня он воспроизводится на обоих устройствах, и звук не идеально синхронизирован (что меня устраивает), но на одном из устройств звук нарушен. На другом устройстве играет нормально. Любые предложения по улучшению этого? - person user2054702; 31.03.2014
comment
зависит от того, что вы подразумеваете под беспокойством. Можете ли вы воспроизвести его при игре только на одном устройстве? - person Mark Heath; 31.03.2014
comment
Под нарушением я подразумеваю, что звук кажется нарезанным и искаженным всегда на одном устройстве, в то время как на другом устройстве он воспроизводится просто отлично. Я пробовал USB-гарнитуры разных производителей, а динамики моего ПК — Realtek. Не постоянно на каком устройстве звук искажается. - person user2054702; 01.04.2014
comment
Еще один быстрый вопрос. Будет ли это решение (воспроизведение звука на двух устройствах) работать и на Windows XP? Потому что API изменились со времен Windows XP и, следовательно, мой вопрос. Спасибо ! - person user2054702; 01.04.2014