J'utilise naudio avec le code SineWaveProvider32 directement à http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.html pour générer des signaux sinusoïdaux. Le code correspondant dans la classe SineWaveProvider32:naudio SineWaveProvider32 donne des clics lors du changement d'amplitude
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;
}
return sampleCount;
}
Je recevais des clics/bat chaque seconde, alors j'ai changé
if (sample >= sampleRate) sample = 0;
à
if (sample >= (int)(sampleRate/Frequency)) sample = 0;
Ce fixe les clics chaque seconde (si cet "échantillon" était toujours relatif à un passage à zéro, pas le taux d'échantillonnage).
Cependant, chaque fois que je définis la variable Amplitude, j'obtiens un clic. J'ai essayé de le régler seulement quand le tampon [] était à un passage à zéro, pensant qu'un saut soudain d'amplitude pourrait causer le problème. Cela n'a pas résolu le problème. Je suis en train de l'amplitude des valeurs comprises entre 0,25 et 0,0
J'ai essayé adusting la latence et le nombre de tampons comme suggéré dans NAudio change volume in runtime mais n'a eu aucun effet non plus.
Mon code qui change la Amplitude:
public async void play(int durationMS, float amplitude = .25f)
{
PitchPlayer pPlayer = new PitchPlayer(this.frequency, amplitude);
pPlayer.play();
await Task.Delay(durationMS/2);
pPlayer.provider.Amplitude = .15f;
await Task.Delay(durationMS /2);
pPlayer.stop();
}