Linux Alsalib mmap直接写入
我只是在摆弄alsa库,真的不知道如何用直接写入进行播放。我使用的是访问类型mmap交织。 我想写一个方波 我用短裤做了一个缓冲垫来保持方波。我已经用snd_pcm_writei测试了它,它可以正常工作 然后我调用snd_pcm_begin并使用区域中给出的指针写入设备:Linux Alsalib mmap直接写入,linux,audio,mmap,alsa,Linux,Audio,Mmap,Alsa,我只是在摆弄alsa库,真的不知道如何用直接写入进行播放。我使用的是访问类型mmap交织。 我想写一个方波 我用短裤做了一个缓冲垫来保持方波。我已经用snd_pcm_writei测试了它,它可以正常工作 然后我调用snd_pcm_begin并使用区域中给出的指针写入设备: while(1){ int msg; frames_available = snd_pcm_avail_update(handle); snd_pcm_mmap_begin(handle,&areas,&am
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);
while(1){
int-msg;
帧可用=snd\U pcm\U可用\U更新(句柄);
snd_pcm_mmap_begin(手柄、区域、偏移和限制帧);
frames\u to\u write=frames;//frames是缓冲区的大小(以帧为单位)
如果(帧写入>限制帧)
帧到写入=0;
int offset_frames=(区域[0]。第一个+偏移*区域[0]。步长)/16;
short*write_ptr=(short*)区域[0]。添加+偏移_帧;
//用东西填满缓冲区
for(int i=0;i
}
产生的声音是起伏的,很快就会被切断。它会被切断,因为限制帧达到0。我注意到,即使有可用的帧,limit_frames仍保持为0
编辑:
我用memcpy()代替for循环,这就解决了这个问题。但还是被切断了。现在我很好奇为什么memcpy()解决了这个问题。for循环、memcpy和for循环不应该在内存上连续复制吗 如果您所做的只是从另一个缓冲区复制样本,那么使用mmap是没有意义的;这与
snd\u pcm\u writei()的功能完全相同
无论如何,在调用snd\u pcm\u mmap\u begin()
之前,必须将其最后一个参数设置为要写入的帧数,当它返回一个较小的数字时,应该写入该数字,而不是0
当有多个通道时,帧大于一个采样