Глюки при использовании SoundTouchWaveStream и SmbPitchShiftingSampleProvider с NAudio - PullRequest
0 голосов
/ 16 мая 2019

У меня есть аудио приложение .NET, которое позволяет пользователю независимо регулировать темп и высоту воспроизводимого аудио. Я в настоящее время использую NAudio.

Чтобы включить настройку темпа и высоты тона, я использую следующий код.

class NativeAudioPlayer
{
    readonly NAudio.Wave.AudioFileReader _audioFileReader;
    readonly WaveOutEvent _waveOutEvent;
    readonly SoundTouchWaveStream _tempoControl;
    readonly SmbPitchShiftingSampleProvider _pitchControl;

    public NativeAudioPlayer(string filePath)
    {
        _audioFileReader = new NAudio.Wave.AudioFileReader(filePath);
        var stream16 = new Wave32To16Stream(_audioFileReader);
        _tempoControl = new SoundTouchWaveStream(stream16);
        var sampleProvider = NAudioConverter.ConvertWaveProviderIntoSampleProvider(_tempoControl);
        _pitchControl = new SmbPitchShiftingSampleProvider(sampleProvider);
        _waveOutEvent = new WaveOutEvent { DesiredLatency = 150, NumberOfBuffers = 3 };
        _waveOutEvent.Init(_pitchControl);
    }
}

На одной из моих машин (Windows 10 x64 i7-6820HQ CPU @ 2,70 ГГц, 2701 МГц, 4 ядра (-ей), 8 логических процессоров (-ей)), это, кажется, работает нормально при загрузке процессора около 7%.

Однако на другом компьютере с более низкой спецификацией (процессор Windows 10 x64 i3-3120M @ 2,50 ГГц, 2500 МГц, 2 ядра (-ей), 4 логических процессора (-ов)) при воспроизведении звука наблюдаются заметные сбои. На этой машине плохое воспроизведение связано с использованием ЦП около 20%. При удалении как темпа, так и высоты тона воспроизведение нормальное, а загрузка процессора составляет около 2,5%.

Performance figures

Увеличение задержки до 300 мс улучшает воспроизведение, но увеличивает проблемы с мониторингом текущей позиции воспроизведения.

В какой-то момент я захочу добавить другие компоненты обработки звука, например, EQ. Как увеличить производительность воспроизведения без увеличения задержки каждый раз, когда я добавляю новый компонент обработки?

...