尝试在 Naudio 中播放 ISampleProvider 时获取 NullReferenceException (c#)
Getting NullReferenceException when attempting to play an ISampleProvider in Naudio (c#)
我正在使用 Naudio 在 C# 中创建自己的软件合成器,并从生成一些简单的正弦波开始,然后播放它们。我想自己做,而不是使用 Naudio 的内置 SignalGenerator
。
将我的自定义对象 sine
传递给 WaveOutEvent.Init
以生成正弦波(实现 ISampleProvider
)时,我得到一个 NullReferenceException
。我在调用 init 之前创建了 class SineWave
的实例,但我仍然得到 NullReferenceException
.
我测试了我的WaveOutEvent
(wo
)和SineWave
(sine
)对象是否都是null
,if
命令,像这样:
if (sineWave != null)
{
Console.WriteLine("sine is not null");
}
if (waveOut != null)
{
Console.WriteLine("wo is not null");
}
这两个语句都通过了,并且 sine is not null
和 wo is not null
都被写入了控制台。
namespace AddSynth
{
public class SineWave : ISampleProvider
{
public WaveFormat WaveFormat { get; }
int frequency = 440;
int sampleRate = 44100;
double amp = 0.25;
int phase = 0;
public int Read(float[] buffer, int offset, int count)
{
int sampleCount = sampleRate / frequency;
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = (float)(amp * Math.Sin(2 * Math.PI * frequency * i + phase));
}
return sampleCount;
}
}
public class Playback
{
static void Main()
{
Playback playBack = new Playback();
playBack.playAudio();
}
public void playAudio()
{
WaveOutEvent waveOut = new WaveOutEvent();
SineWave sineWave = new SineWave();
if (sineWave != null)
{
Console.WriteLine("sine is not null");
}
if (waveOut != null)
{
Console.WriteLine("wo is not null");
}
waveOut.Init(sineWave.ToWaveProvider());
waveOut.Play();
Console.ReadKey();
}
}
}
我希望通过计算机的音频播放正弦波。我希望我已经添加了足够的信息。
编辑:刚刚意识到我可能也应该添加堆栈跟踪,所以在这里,如果它有帮助的话:
at NAudio.Wave.SampleProviders.SampleToWaveProvider..ctor(ISampleProvider source)
at NAudio.Wave.WaveExtensionMethods.ToWaveProvider(ISampleProvider sampleProvider)
at AddSynth.Playback.playAudio() in C:\Users\User1\source\repos\AddSynth\AddSynth\Program.cs:line 44
at AddSynth.Playback.Main() in C:\Users\User1\source\repos\AddSynth\AddSynth\Program.cs:line 29
正如 Nkosi 所说,问题是我从未分配 WaveFormat 变量。
我正在使用 Naudio 在 C# 中创建自己的软件合成器,并从生成一些简单的正弦波开始,然后播放它们。我想自己做,而不是使用 Naudio 的内置 SignalGenerator
。
将我的自定义对象 sine
传递给 WaveOutEvent.Init
以生成正弦波(实现 ISampleProvider
)时,我得到一个 NullReferenceException
。我在调用 init 之前创建了 class SineWave
的实例,但我仍然得到 NullReferenceException
.
我测试了我的WaveOutEvent
(wo
)和SineWave
(sine
)对象是否都是null
,if
命令,像这样:
if (sineWave != null)
{
Console.WriteLine("sine is not null");
}
if (waveOut != null)
{
Console.WriteLine("wo is not null");
}
这两个语句都通过了,并且 sine is not null
和 wo is not null
都被写入了控制台。
namespace AddSynth
{
public class SineWave : ISampleProvider
{
public WaveFormat WaveFormat { get; }
int frequency = 440;
int sampleRate = 44100;
double amp = 0.25;
int phase = 0;
public int Read(float[] buffer, int offset, int count)
{
int sampleCount = sampleRate / frequency;
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = (float)(amp * Math.Sin(2 * Math.PI * frequency * i + phase));
}
return sampleCount;
}
}
public class Playback
{
static void Main()
{
Playback playBack = new Playback();
playBack.playAudio();
}
public void playAudio()
{
WaveOutEvent waveOut = new WaveOutEvent();
SineWave sineWave = new SineWave();
if (sineWave != null)
{
Console.WriteLine("sine is not null");
}
if (waveOut != null)
{
Console.WriteLine("wo is not null");
}
waveOut.Init(sineWave.ToWaveProvider());
waveOut.Play();
Console.ReadKey();
}
}
}
我希望通过计算机的音频播放正弦波。我希望我已经添加了足够的信息。
编辑:刚刚意识到我可能也应该添加堆栈跟踪,所以在这里,如果它有帮助的话:
at NAudio.Wave.SampleProviders.SampleToWaveProvider..ctor(ISampleProvider source)
at NAudio.Wave.WaveExtensionMethods.ToWaveProvider(ISampleProvider sampleProvider)
at AddSynth.Playback.playAudio() in C:\Users\User1\source\repos\AddSynth\AddSynth\Program.cs:line 44
at AddSynth.Playback.Main() in C:\Users\User1\source\repos\AddSynth\AddSynth\Program.cs:line 29
正如 Nkosi 所说,问题是我从未分配 WaveFormat 变量。