Запись из ALSA - понимание карт памяти

Я пытаюсь использовать ALSA, чтобы взять ввод с аудиоустройства USB и записать его на диск в виде серииsigned short ценности. Что я'm заканчиваются блоками, которые кажутся действительными данными, перемежающимися с большими блоками нулей. Я'Я предполагаю, что мои буферы настроены неправильно и я не использую отображение памяти должным образом.

Что я'я пытаюсь:

частота дискретизации: 8K (это форсируется устройством)размер буфера: 2048размер периода: 512один канал

Устройство, кажется, открыто должным образом и принимает различные параметры. После некоторой настройки цикл запускается так:

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

Memcpy является указателем на массив short и увеличивается на количество кадров, возвращаемых за каждый проход.

После этой записи на несколько секунд я закрываю ее и записываю последующий буфер на диск в виде одного короткого значения в каждой строке. Что я'Ожидается, что это секунда или две данных PCM, варьирующихся от 1200 до 2300 Гц. Что я'Я получаю некоторые данные с большим количеством нулей.

Что я'мне интересно: мои значения для буфера и периода рациональны? Кому-нибудь удалось использовать отображенный в памяти вывод от ALSA?

РЕДАКТИРОВАТЬ: некоторый код

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

(проверка ошибок удалена для ясности)

Когда все сказано и сделано, я перебираю pCID и записываю на диск. Одно значение в строке.

Ответы на вопрос(2)

Ваш ответ на вопрос