Запись из 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 и записываю на диск. Одно значение в строке.