Tôi cố gắng sử dụng ALSA để lấy đầu vào từ thiết bị âm thanh USB và ghi nó ra đĩa dưới dạng một loạt giá trị signed short
. Những gì tôi kết thúc với là những khối có vẻ là dữ liệu hợp lệ xen kẽ với các khối không lớn. Tôi đoán rằng tôi có bộ đệm của tôi thiết lập không chính xác và không sử dụng ánh xạ bộ nhớ đúng cách.Ghi âm từ ALSA - hiểu bản đồ bộ nhớ
Những gì tôi đang cố gắng:
- mẫu tỷ lệ: 8K (điều này được buộc bởi các thiết bị)
- kích thước bộ đệm: 2048
- kích thước khoảng thời gian: 512
- một kênh
Thiết bị có vẻ như đã được mở rly và chấp nhận các thông số khác nhau. Sau khi thiết lập một số vòng lặp chạy như sau:
snd_pcm_avail_update
snd_pcm_mmap_begin
memcpy data from mmap buffer to array of short
snd_pcm_mmap_commit
Memcpy là một con trỏ tới mảng ngắn và được tăng lên bởi số khung được trả về mỗi lần truyền.
Sau khi bản ghi này trong vài giây, tôi đóng nó và ghi bộ đệm tiếp theo vào đĩa dưới dạng một giá trị ngắn trên mỗi dòng. Những gì tôi mong đợi là một hoặc hai giây dữ liệu PCM thay đổi từ 1200 đến 2300 Hz. Những gì tôi nhận được là một số dữ liệu với nhiều số không.
Điều tôi đang tự hỏi là: giá trị của tôi cho bộ đệm và thời gian hợp lý? Có ai đã thành công trong việc sử dụng đầu ra được ánh xạ bộ nhớ từ ALSA không?
EDIT: Một số mã
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;
}
(kiểm tra lỗi xóa do rõ ràng)
Khi tất cả được nói và làm tôi vòng qua PCID và ghi vào đĩa. Một giá trị trên mỗi dòng.