Grabación de ALSA - comprensión de la asignación de memoria

Estoy intentando usar ALSA para tomar la entrada de un dispositivo de audio USB y escribirla en el disco como una serie designed short valores. Lo que estoy terminando son bloques de lo que parecen ser datos válidos intercalados con grandes bloques de ceros. Supongo que tengo la configuración incorrecta de mis búferes y no estoy usando la asignación de memoria correctamente.

Lo que estoy tratando

frecuencia de muestreo: 8 K (esto es forzado por el dispositivo)tamaño del búfer: 2048tamaño del período: 512un canal

El dispositivo parece estar abierto correctamente y acepta los distintos parámetros. Después de alguna configuración, el bucle se ejecuta como:

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

El memcpy es un puntero a la matriz de corto y se incrementa por el número de cuadros devueltos cada pase.

Después de estos registros durante unos segundos, lo cierro y escribo el búfer posterior en el disco como un solo valor corto en cada línea. Lo que estoy esperando es un segundo o dos de datos PCM que varían entre 1200 y 2300 Hz. Lo que estoy obteniendo es algunos datos con muchos ceros.

Lo que me pregunto es: ¿son mis valores para el búfer y el período racionales? ¿Alguien ha logrado usar la salida asignada en memoria de ALSA?

EDIT: Algún código

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;
}

(comprobación de errores eliminada para mayor claridad)
Cuando todo está dicho y hecho, recorro en pCID y escribo en el disco. Un valor por línea.

Respuestas a la pregunta(2)

Su respuesta a la pregunta