Linux Alsalib mmap直接写入

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

我只是在摆弄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,&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

当有多个通道时,帧大于一个采样