小编mig*_*elg的帖子

ALSA:snd_pcm_writei调用缓冲区欠载

在运行我最近从灰烬中带回来的旧程序时,我得到缓冲区欠载.

程序将原始声音文件完全加载到内存中(2100字节长,525帧)并准备ALSA输出(44.1khz,2个通道,16位有符号):

if ((err = snd_pcm_set_params(audio_handle,
                              SND_PCM_FORMAT_S16_LE,
                              SND_PCM_ACCESS_RW_INTERLEAVED,
                              2,
                              44100,
                              1,
                              sound.playback_us)) < 0) {
  printf("E: Failed to prepare PCM: %s\n", snd_strerror(err));
  return -1;
}
Run Code Online (Sandbox Code Playgroud)

PCM状态PREPARED在首次播放声音之前.声音第一次正确播放,然而,第二次播放时,状态为RUNNING-EPIPE("断管")被抛出snd_pcm_writei.播放逻辑:

frames = snd_pcm_writei(audio_handle,
                        sound.data,
                        write_size);

if(frames < 0) {
  printf("E: %s: attempting to recover\n", snd_strerror(frames));
  frames = snd_pcm_recover(audio_handle, frames, 0);

  if(frames < 0) {
    printf("E: snd_pcm_writei failed\n");
    break;
  }
} else if(frames > 0 && frames < write_size)
  printf("E: Short write (expected %li, wrote %li)\n", write_size, …
Run Code Online (Sandbox Code Playgroud)

linux alsa

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

alsa ×1

linux ×1