Ich habe ein Problem, Tonausgabe, wenn ich eine kleine Puffergröße (1920 Frames) habe. Wenn ich bei 48kHz
abtastet und die Puffergröße 480000
mache, wird die Sinuswelle für 1 Sekunde korrekt wiedergegeben. Was ich damit machen will spiele nur die Sinuswelle für 40ms
.Große Puffergrößen spielt, kleine Größe nicht
Ich habe berechnet, dass 48000 samples/sec * 1sec/1000ms * 40ms = 1920 frames
sein. Wenn ich jedoch versuche, snd_pcm_writei
mit nur 1920 Rahmen anzurufen, kommt nichts heraus!
Hier ist der Code in Frage:
void PCM::playSound(float freqHz, uint16_t durationMs)
{
int FRAMES_LEN=48000;
//Send the sine_buffer to sound card, with correct buffer length
snd_pcm_sframes_t frames = snd_pcm_writei(handle, sine_buffer, FRAMES_LEN);
if (frames < 0){
HW_INFO() << "PCM::playSound-- snd_pcm_writei failed,trying to recover:"
<< snd_strerror(frames);
frames = snd_pcm_recover(handle, frames, 0);
}
if (frames < 0) {
HW_INFO() << "PCM::playSound-- snd_pcm_writei recovery failed: "
<< snd_strerror(frames);
}
HW_INFO() << "Wrote " << frames << " frames";
return;
}
Wenn FRAMES_LEN
48000
ist dieser Code funktioniert gut und erzeugt eine Sinuswelle, die mit 1 Sekunde dauern.
Wenn FRAMES_LEN
1920
ist, kann ich keine Sinuswelle überhaupt hören, aber das Protokoll besagt, dass Wrote 1920 frames
.
Was passiert?
40 ms ist eine unglaublich kurze Zeit und Sie bei den meisten würden einen Pop oder klicken hören. – Jason
Ich höre immer noch nichts mit einer Dauer von 250ms, also 12.000 Frames – kburbach
Versuchen Sie, die FRAMES_LEN von 48.000 herunter auf 2.000 oder so in Schritten von vielleicht 2.000 zu verringern und sehen Sie, wenn Sie hören, was produziert wird. –