私は ALSA ドライバーを Ubuntu 14.04、64 ビット、3.16.0-30-generic カーネルで実行しています。
ハードウェアは独自のものであるため、詳細をあまり提供できません。
既存のドライバー実装は次のとおりです。
- ドライバーには、モジュール パラメータを介して入力として channel_count が提供されます。(要件により、モジュール パラメータを介して ch 数を提供する必要があります)
- ドライバーは、alsa snd_pcm_hardware 構造を、playback->channels_min = channel_count &、playback->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 の構成が壊れています: 使用可能な構成がありません」と報告します。channel_count が '3' の wave ファイルの場合
例: WAVE './xxx.wav' を再生: 符号付き 16 ビット リトルエンディアン、レート 48000 Hz、チャネル 3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) スレーブ PCM は使用できません
aplay: set_params:1204: この PCM の設定が壊れています: 設定が利用できません
以下の変更により、少し前進することができました:
方法1:
- ドライバーにはモジュールパラメータ経由で入力としてchannel_count '3'が提供されます
- ドライバを修正し、snd_pcm_hardware 構造体を payback->channels_min = 2 & playback->channels_min = 3 として埋めました。キャプチャ パスにも同様の値を設定します。
- 使用中のウェーブファイルには3つのチャンネルがあるのに、aplay/arecordは「チャンネル数が利用できません」と報告する
例: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav WAVE './xxx.wav' を再生中: 符号付き 16 ビット リトルエンディアン、レート 48000 Hz、チャネル 3
aplay: set_params:1239: チャンネル数が利用できません
- plughwでaplay/arecordを試したところ、aplay/arecordが先に進みました
modprobe my_driver.ko チャネル=3
arecord -D plughw:CARD=xxx,DEV=0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav
aplay -D plughw:CARD=xxx,DEV=0 ./xxx.wav
録音 WAVE './xxx_rec0.wav': 符号付き 16 ビット リトルエンディアン、レート 48000 Hz、チャンネル 3
WAVE './xxx.wav' を再生中: 符号付き 16 ビット リトルエンディアン、レート 48000 Hz、チャネル 3
テスト終了
aplay/arecord 中に、ドライバーで "runtime->channels" 値がチェックされると、値 2 が返されます。ただし、再生された wavefile の ch 数は 3 です...
録音されたファイルのデータを確認すると、すべて無音である
方法2:
ドライバーにはモジュールパラメータ経由で入力としてchannel_count '3'が提供されます
ドライバーを修正し、snd_pcm_hardware 構造体を playback->channels_min = 3 & playback->channels_min = 4 として埋めました。キャプチャ パスにも同様の値を設定します。
使用中のウェーブファイルには3つのチャンネルがあるのに、aplay/arecordは「チャンネル数が利用できません」と報告する
plughwでaplay/arecordを試したところ、aplay/arecordが先に進みました
aplay/arecord 中に、ドライバーで "runtime->channels" 値がチェックされると、値 4 が返されます。ただし、再生された wavefile の 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_再生レート、
xxx_playback.rate_min、xxx_playback.rate_max、
xxx_playback.チャンネル_min、xxx_playback.チャンネル_max
(キャプチャ側のsnd_pcm_hardware構造体で同様に値が置き換えられます)