NAudio을 사용하여 블로그 게시물 Playback of Sine Wave in NAudio에서 주어진 주파수의 사인파를 재생합니다. 난 단지 x 밀리 초 동안 소리를 내고 멈추게하고 싶다.NAudio는 C#을 사용하여 x 밀리 초 동안 사인파를 재생합니다.
나는 thread.sleep을 시도했지만 소리가 곧바로 멈 춥니 다. 나는 타이머를 시도했지만, WaveOut이 제거되면 크로스 스레드 예외가 발생합니다.
이 코드를 시도했지만 경고음을 울리면 프로그램이 멈 춥니 다.
public class Beep
{
public Beep(int freq, int ms)
{
SineWaveProvider32 sineWaveProvider = new SineWaveProvider32();
sineWaveProvider.Amplitude = 0.25f;
sineWaveProvider.Frequency = freq;
NAudio.Wave.WaveOut waveOut = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback());
waveOut.Init(sineWaveProvider);
waveOut.Play();
Thread.Sleep(ms);
waveOut.Stop();
waveOut.Dispose();
}
}
public class SineWaveProvider32 : NAudio.Wave.WaveProvider32
{
int sample;
public SineWaveProvider32()
{
Frequency = 1000;
Amplitude = 0.25f; // Let's not hurt our ears
}
public float Frequency { get; set; }
public float Amplitude { get; set; }
public override int Read(float[] buffer, int offset, int sampleCount)
{
int sampleRate = WaveFormat.SampleRate;
for (int n = 0; n < sampleCount; n++)
{
buffer[n + offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency)/sampleRate));
sample++;
if (sample >= sampleRate)
sample = 0;
}
}
@Hans - 이것은 Read 메서드가하는 일입니다. 사운드 카드에 더 많은 데이터가 필요할 때마다 호출됩니다. –