2016-05-18 13 views
2

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_LEN48000 ist dieser Code funktioniert gut und erzeugt eine Sinuswelle, die mit 1 Sekunde dauern.

Wenn FRAMES_LEN1920 ist, kann ich keine Sinuswelle überhaupt hören, aber das Protokoll besagt, dass Wrote 1920 frames.

Was passiert?

+3

40 ms ist eine unglaublich kurze Zeit und Sie bei den meisten würden einen Pop oder klicken hören. – Jason

+0

Ich höre immer noch nichts mit einer Dauer von 250ms, also 12.000 Frames – kburbach

+3

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. –

Antwort

0

Dies ist sinnvoll, wenn mit einem Filter der Länge> = 1920 Frames irgendeine Art von Nachbearbeitung stattfindet. Eine solche Filterung kann beispielsweise Klickgeräusche löschen. Der ganze Grund für die Verwendung von ALSA, anstatt nur mit einem D/A-Wandler zu sprechen, ist eine audiospezifische Verarbeitung.

0

Ihr Logging liegt Ihnen nicht vor. Du hast darum gebeten, 1920 Samples auf das Gerät zu schreiben und es hat es getan. Da Ihr 48000 Sample-Experiment einen Sound von einer Sekunde lang abgespielt hat, muss Ihre Hardware mit 48 kHz arbeiten. Angenommen, 1920 Frames würden vier Hundertstelsekunden dauern. Abhängig von der Frequenz des Sinus in Ihrem Sinus-Puffer können Sie das nicht hören.

Hier ist eine tiefere Diskussion: https://sound.stackexchange.com/q/28163

Verwandte Themen