我正在 Ubuntu 14.04、64 位元、3.16.0-30-generic 核心上執行 ALSA 驅動程式。
硬體是專有的,因此無法提供太多細節。
以下是現有的驅動程式實作:
- 透過模組參數向驅動程式提供channel_count 作為輸入。 (由於要求需要透過模組參數提供通道數)
- 驅動程式將 alsa snd_pcm_hardware 結構填入playback->channels_min =channel_count & forplayback->channels_max =channel_count;捕獲側的值相同。
- 硬體根據channel_count配置時鐘,並且驅動程式成功註冊到ALSA層
- aplay/arecord 在channel_count = 1/2/4 時運作正常
- 在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 的配置已損壞:沒有可用的配置
透過以下更改,我能夠向前邁進一點:
方法一:
- 透過模組參數為驅動程式提供channel_count“3”作為輸入
- 修改驅動程式以將 snd_pcm_hardware 結構填入 payback->channels_min = 2 &playback->channels_min = 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: 通道數不可用
- 嘗試使用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
測試結束
在aplay/arecord期間,在驅動程式中,當檢查“runtime->channels”值時,它會傳回值2!但播放的波形檔案有 ch 數 3...
當檢查記錄檔案中的資料時,它完全靜音
方法二:
透過模組參數為驅動程式提供channel_count“3”作為輸入
修改驅動程式以將 snd_pcm_hardware 結構填入playback->channels_min = 3 &playback->channels_min = 4;捕獲路徑的相似值
aplay/arecord 報告為“通道數不可用”,儘管正在使用的波形檔案有 3 個通道
嘗試使用plughw進行aplay/arecord,並且aplay/arecord繼續前進
在 aplay/arecord 期間,在驅動程式中,當檢查“runtime->channels”值時,它會傳回值 4!但播放的波形檔案有 ch 數 3...
當檢查記錄檔案中的資料時,它完全靜音
因此,從上面的觀察來看,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 結構中替換值)