簡體   English   中英

ALSA:snd_pcm_writei返回EAGAIN

[英]ALSA: snd_pcm_writei returns EAGAIN

我正在努力了解音頻播放例程中的錯誤之處。 我有一個線程會從其他線程獲取緩沖區,並以與alsa示例程序相同的方式播放它們: https : //www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html我m指代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()都需要100毫秒才能完成。 這正是我期望看到的。

這是我的程序的設備設置:

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()返回一個正數,對於下一個音頻緩沖區,我立即獲得-EAGAIN,持續100ms; 等等。 但是,音頻播放很好。

我不明白的是為什么它不等100ms播放新緩沖區而不是立即返回-EAGAIN(在ALSA文檔中找不到有關snd_pcm_writei()返回-EAGAIN的任何內容)。

在此先感謝您的幫助!

PCM設備可以處於阻塞模式(等待)或處於非阻塞模式(返回-EAGAIN)。

可以在調用snd_pcm_open()時使用標志或snd_pcm_nonblock()來設置此模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM