Использование NAudio для микширования волноводов


Я использую NAudio для генерации и воспроизведения звуковых волн во время выполнения.

Мне удалось получить синусоидальную волну, сгенерированную с помощью этого учебника: http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.html

Однако-что мне действительно нужно, так это иметь возможность добавлять много отдельных волн в поток WaveMixerStream во время выполнения.

Я понимаю, что для этого мне нужны отдельные волновые потоки, но я не знаю, как превратить выход из WaveProvider в WaveStream чтобы добавить в поток Wavemixer.

Я предполагаю, что это невозможно, поэтому изменил код, чтобы дать производный класс WaveStream.

Я добавил:

public override long Length
    {
        get { return long.MaxValue; }
    }

Но я не уверен, как получить позицию:

public override long Position
{
    get
    {
        return //What here?
    }
    set
    {
        // What here? = value;
    }

}
Таким образом, вопрос состоит в следующем: 1. Сработает ли это? 2. Как мне получить / установить позицию?

Заранее благодарю.

1 2

1 ответ:

Разница между IWaveProvider и WaveStream заключается в том, что WaveStream поддерживает длину отчета и позицию и установку позиции. Однако, поскольку вы проходите в IWaveProvider, вы не знаете длину и не можете установить позицию. Просто ничего не делайте в сеттере Position, а для геттера Position верните общее количество байтов, которые были возвращены из метода Read до сих пор (просто имейте частную переменную типа long для хранения этого).

Другой подход заключается в простом копировании кода из WaveMixerStream и превратите его в IWaveProvider вместо WaveStream. Это на самом деле упростит его совсем немного, большая сложность WaveMixerStream заключается в правильном перемещении всех входов микшера при перемещении. (Кстати, в будущем я буду поощрять людей использовать интерфейс ISampleProvider, и уже есть MixingSampleProvider, который делает именно то, что вы хотите. Я еще не приступил к написанию учебников по этому вопросу, но все это есть)