Aufnahme von ALSA - Verstehen der Speicherzuordnung

Ich versuche, ALSA zu verwenden, um die Eingabe von einem USB-Audiogerät zu nehmen und sie als eine Reihe von auf die Festplatte zu schreibensigned short Werte. Was ich am Ende habe, sind Blöcke mit scheinbar gültigen Daten, die mit großen Nullblöcken durchsetzt sind. Ich vermute, dass ich meine Puffer falsch eingerichtet habe und die Speicherzuordnung nicht richtig verwende.

Was ich versuche:

Abtastrate: 8K (dies wird vom Gerät erzwungen)Puffergröße: 2048Periodengröße: 512ein Kanal

Das Gerät scheint ordnungsgemäß geöffnet zu sein und akzeptiert die verschiedenen Parameter. Nach einigen Einstellungen läuft die Schleife wie folgt ab:

snd_pcm_avail_update   
snd_pcm_mmap_begin   
   memcpy data from mmap buffer to array of short   
snd_pcm_mmap_commit   

Der memcpy ist ein Zeiger auf das Array von short und wird um die Anzahl der Frames erhöht, die bei jedem Durchlauf zurückgegeben werden.

Nachdem dies einige Sekunden lang aufgezeichnet wurde, schließe ich es und schreibe den nachfolgenden Puffer als einzelnen kurzen Wert in jede Zeile auf die Festplatte. Was ich erwarte, sind ein oder zwei Sekunden PCM-Daten, die zwischen 1200 und 2300 Hz variieren. Was ich bekomme, sind einige Daten mit vielen Nullen.

Was ich mich frage, ist: Sind meine Werte für Puffer und Periode rational? Hat es jemand geschafft, die Speicherzuordnungsausgabe von ALSA zu verwenden?

EDIT: Etwas Code

const snd_pcm_channel_area_t *areas;  
snd_pcm_uframes_t offset, frames, size;   
short* pCID = (short*)malloc( 50000 * sizeof( short ));  
short* ppCID = pCID;
while( size > 0 )  
{  
   frames = size;  
   snd_pcm_mmap_begin (device, &areas, &offset, &frames);     
   short* pd = (short*)areas[0].addr;   
   memcpy( ppCID, (pd + (offset*sizeof(short))), frames * sizeof( short ));  
   ppCID += frames;  
   snd_pcm_mmap_commit(device, offset, frames);  

   size -= frames;
}

(Fehlerprüfung zur Verdeutlichung entfernt)
Wenn alles gesagt und getan ist, durchlaufe ich pCID und schreibe auf die Festplatte. Ein Wert pro Zeile.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage