ALSA: snd_pcm_writei returns EAGAIN



我正在努力理解我在音频播放程序中做错了什么。我有一个线程可以从其他线程中获取缓冲区,并按照ALSA示例程序的方式播放它们:https://www.alsa-project.org/alsa-doc/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html我指的是write_loop((函数。这是PCM.C示例程序的设备配置设置(snd_pcm_dump((的输出(:

ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 1
  rate         : 44100
  exact rate   : 44100 (44100/1)
  msbits       : 16
  buffer_size  : 22050
  period_size  : 4410
  period_time  : 100000
  tstamp_mode  : NONE
  tstamp_type  : GETTIMEOFDAY
  period_step  : 1
  avail_min    : 4410
  period_event : 0
  start_threshold  : 22050
  stop_threshold   : 22050
  silence_threshold: 0
  silence_size : 0
  boundary     : 6206523236469964800

我看到的是在snd_pcm_writei((周围放置一些printf((是连续执行5次,并且每个下一个循环snd_pcm_writei((需要100ms才能完成。这正是我期望看到的。

这是我程序的设置:

ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : FLOAT_LE
  subformat    : STD
  channels     : 1
  rate         : 44100
  exact rate   : 44100 (44100/1)
  msbits       : 32
  buffer_size  : 13230
  period_size  : 4410
  period_time  : 100000
  tstamp_mode  : NONE
  tstamp_type  : GETTIMEOFDAY
  period_step  : 1
  avail_min    : 4410
  period_event : 0
  start_threshold  : 4410
  stop_threshold   : 13230
  silence_threshold: 0
  silence_size : 0
  boundary     : 7447827883763957760

发生的事情是snd_pcm_writei((运行5次(这还可以(,但是在此之后,每个新循环都会立即使用-eagain返回。连续重试100ms(100%CPU使用率(以播放相同的缓冲区最终会播放,SND_PCM_WRITEI((返回一个正数,对于下一个音频缓冲区,我立即获得100ms,以100ms;等等。但是,音频播放很好。

我不明白的是,为什么它不等待100ms播放新的缓冲区而不是立即返回 - eagain(在Alsa文档中找不到有关snd_pcm_writei((返回-EAGAIN的任何内容(。

事先感谢您的任何帮助!

PCM设备可以处于阻塞模式(等待(或非阻挡模式(返回-EGAIN(。

调用snd_pcm_open()或用snd_pcm_nonblock()

时,可以使用标志设置此模式

最新更新