gpt4 book ai didi

linux - Alsalib mmap直写

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:52 24 4
gpt4 key购买 nike

我只是在摆弄 ALSA 库,无法真正弄清楚如何通过直接写入进行回放。我正在使用 SND_PCM_ACCESS_MMAP_INTERLEAVED。我正在尝试写一个方波。

我创建了一个短裤缓冲器来容纳方波。我已经使用 snd_pcm_writei 对其进行了测试,它可以正常工作。

然后我调用 snd_pcm_begin 并使用 area 给出的指针写入设备:

while(1)
{
int msg;
frames_available = snd_pcm_avail_update(handle);
snd_pcm_mmap_begin(handle,&areas,&offset,&limit_frames);

frames_to_write = frames; //frames is the size of the buffer in frames

if (frames_to_write > limit_frames)
frames_to_write = 0;

int offset_frames = (areas[0].first + offset*areas[0].step)/16;
short* write_ptr = (short*)areas[0].addr + offset_frames;

// fill the buffer with stuff
for(int i =0; i < frames_to_write;i++)
{
write_ptr[i] = buffer[i];
}

msg = snd_pcm_mmap_commit(handle,offset,frames_to_write);
}

产生的声音断断续续,很快就被切断了。它被切断,因为 limit_frame 达到 0。我注意到即使有 frames_available,limit_frames 也会保持在 0。

编辑:我使用 memcpy() 而不是 for 循环,这解决了断断续续的问题。仍然被切断。现在我很好奇为什么 memcpy() 解决了断断续续的问题。 for 循环和 memcpy 以及 for 循环不应该连续复制内存吗?

最佳答案

如果您所做的只是从另一个缓冲区复制样本,那么使用 mmap 就没有意义;这与 snd_pcm_writei() 所做的完全相同。

无论如何,在调用snd_pcm_mmap_begin()之前,您必须将它的最后一个参数设置为您打算写入的帧数,当它返回一个较小的数字时,您应该写那个数字,而不是 0。

当您有多个 channel 时,一帧大于一个样本。

关于linux - Alsalib mmap直写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com