NAudio - Как отправить синусоиду только на один аудиоканал на разъеме

Я взял существующий пример моно (не стерео) NAudio для Visual Studio 2010 из:

http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.html

и изменил его, чтобы иметь двухканальный стереозвук, как показано ниже:

public abstract class WaveProvider32 : IWaveProvider 
{ 
  public WaveProvider32() : this(44100, 2) // Was 44100, 1
  {
  }
.
.
. 
}

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

Я вижу ту же самую частоту, в 10 раз меньшую амплитуду синусоидальной волны, не совпадающую по фазе, на левом канале по сравнению с правым каналом.

Это из-за какого-то просачивания сигнала или я не понимаю, как должен работать код?

Вот пример того, как я изменил WaveProvider32:

public class SineWaveProvider32 : WaveProvider32 
{
.
.
.
public override int Read(float[] buffer, int offset, int sampleCount) 
{ 
  int sampleRate = WaveFormat.SampleRate; 
  for (int n = 0; n < sampleCount; n += 1) 
  { 
    buffer[n+offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) /    sampleRate)); 

    buffer[n+offset+1] = (float)(0); 
    sample++; 

    if (sample >= sampleRate) 
    {
      sample = 0; 
    }
  } 
  return sampleCount; 
}
}

Любые советы о том, что я делаю неправильно?

С Уважением

Примечание. Проект NAudio находится по адресу:

http://naudio.codeplex.com/


person Chuck Sherman    schedule 21.09.2011    source источник
comment
Вы сэкономили мне довольно много времени! Спасибо. К сожалению, этот пример все время воспроизводит несколько неприятных кликов. github.com/naudio/sinegenerator-sample — этот пример с похожей концепцией играет более плавно (щелчки стали тише).   -  person Artem Bobritsky    schedule 20.03.2018
comment
В обоих случаях я просто получаю клики и не контролирую баланс (конечно, с исправлением в ответе здесь). Мне интересно, работает ли это вообще   -  person Erdal G.    schedule 06.11.2019


Ответы (1)


Ваш цикл for должен иметь += 2, а не += 1.

for (int n = 0; n < sampleCount; n += 2)
person Mark Heath    schedule 22.09.2011