使用通道數 3 的 Linux ALSA 驅動程式

使用通道數 3 的 Linux ALSA 驅動程式

我正在 Ubuntu 14.04、64 位元、3.16.0-30-generic 核心上執行 ALSA 驅動程式。

硬體是專有的,因此無法提供太多細節。

以下是現有的驅動程式實作:

  1. 透過模組參數向驅動程式提供channel_count 作為輸入。 (由於要求需要透過模組參數提供通道數)
  2. 驅動程式將 alsa snd_pcm_hardware 結構填入playback->channels_min =channel_count & forplayback->channels_max =channel_count;捕獲側的值相同。
  3. 硬體根據channel_count配置時鐘,並且驅動程式成功註冊到ALSA層
  4. aplay/arecord 在channel_count = 1/2/4 時運作正常
  5. 在aplay/arecord期間,在驅動程式中,當檢查“runtime->channels”值時,它反映了配置的channel_count,這對我來說聽起來是正確的。記錄資料與播放資料匹配,因為這是一個環回測試。

但是當我使用channel_count = 3時,aplay或arecord都報告“此PCM的配置已損壞:沒有可用的配置”!對於通道計數為“3”的波形文件

例如:播放 WAVE './xxx.wav':帶符號 16 位元 Little Endian,速率 48000 Hz,頻道 3

ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) 從屬 PCM 不可用

aplay: set_params:1204: 此 PCM 的配置已損壞:沒有可用的配置


透過以下更改,我能夠向前邁進一點:

方法一:

  1. 透過模組參數為驅動程式提供channel_count“3”作為輸入
  2. 修改驅動程式以將 snd_pcm_hardware 結構填入 payback->channels_min = 2 &playback->channels_min = 3;捕獲路徑的相似值
  3. aplay/arecord 報告為“通道數不可用”,儘管正在使用的波形檔案有 3 個通道

ex: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav 播放 WAVE './xxx.wav' : 有符號 16 位元 Little Endian,速率 48000 Hz,頻道 3

aplay: set_params:1239: 通道數不可用

  1. 嘗試使用plughw進行aplay/arecord,並且aplay/arecord繼續前進

modprobe my_driver.ko 通道=3

arecord -Dplughw:CARD=xxx,DEV=0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav

aplay -Dplughw:CARD=xxx,DEV=0 ./xxx.wav

錄製 WAVE './xxx_rec0.wav':帶符號 16 位元 Little Endian,速率 48000 Hz,通道 3

播放 WAVE './xxx.wav':帶符號 16 位元 Little Endian,速率 48000 Hz,頻道 3

測試結束

  1. 在aplay/arecord期間,在驅動程式中,當檢查“runtime->channels”值時,它會傳回值2!但播放的波形檔案有 ch 數 3...

  2. 當檢查記錄檔案中的資料時,它完全靜音


方法二:

  1. 透過模組參數為驅動程式提供channel_count“3”作為輸入

  2. 修改驅動程式以將 snd_pcm_hardware 結構填入playback->channels_min = 3 &playback->channels_min = 4;捕獲路徑的相似值

  3. aplay/arecord 報告為“通道數不可用”,儘管正在使用的波形檔案有 3 個通道

  4. 嘗試使用plughw進行aplay/arecord,並且aplay/arecord繼續前進

  5. 在 aplay/arecord 期間,在驅動程式中,當檢查“runtime->channels”值時,它會傳回值 4!但播放的波形檔案有 ch 數 3...

  6. 當檢查記錄檔案中的資料時,它完全靜音

因此,從上面的觀察來看,runtime->channels 要么是 2,要么是 4,但 alsa 堆疊從未使用過 3 個通道(儘管請求)。當使用 Plughw 時,alsa 正在將資料轉換為在 2 或 4 通道下運行。

誰能幫我解釋為什麼我無法使用通道數 3?如果需要,將提供更多資訊。提前致謝。

答案1

感謝您的答覆。

將問題放在 stackoverflow 中。

如果您可以進一步提供協助,這就是您所要求的。

定義 DEFAULT_PERIOD_SIZE (4096)

定義 DEFAULT_NO_OF_PERIODS (1024)

靜態結構 snd_pcm_hardware xxx_playback =

{

.info                   = SNDRV_PCM_INFO_MMAP |
                          SNDRV_PCM_INFO_INTERLEAVED |
                          SNDRV_PCM_INFO_MMAP_VALID |
                          SNDRV_PCM_INFO_SYNC_START,
.formats                = SNDRV_PCM_FMTBIT_S16_LE,
.rates                  = (SNDRV_PCM_RATE_8000 | \
                           SNDRV_PCM_RATE_16000 | \
                           SNDRV_PCM_RATE_48000 | \
                           SNDRV_PCM_RATE_96000),
.rate_min               = 8000,
.rate_max               = 96000,
.channels_min           = 1,
.channels_max           = 1,
.buffer_bytes_max       = (DEFAULT_PERIOD_SIZE * DEFAULT_NO_OF_PERIODS),
.period_bytes_min       = DEFAULT_PERIOD_SIZE,
.period_bytes_max       = DEFAULT_PERIOD_SIZE,
.periods_min            = DEFAULT_NO_OF_PERIODS,
.periods_max            = DEFAULT_NO_OF_PERIODS,

};

捕捉側 snd_pcm_hardware 結構的類似值。

請注意,根據目前音訊測試配置,以下值將在播放開啟入口點中替換:(使用者透過模組參數提供音訊格式、音訊速率、通道數作為驅動程式的輸入,這些值將在 snd_pcm_hardware 中重新填充結構)

xxx_playback.formats,

xxx_playback.rates,

xxx_playback.rate_min、xxx_playback.rate_max、

xxx_playback.channels_min、xxx_playback.channels_max

(類似地,在捕獲端的 snd_pcm_hardware 結構中替換值)

相關內容