チャネル数 3 を使用する Linux ALSA ドライバー

チャネル数 3 を使用する Linux ALSA ドライバー

私は ALSA ドライバーを Ubuntu 14.04、64 ビット、3.16.0-30-generic カーネルで実行しています。

ハードウェアは独自のものであるため、詳細をあまり提供できません。

既存のドライバー実装は次のとおりです。

  1. ドライバーには、モジュール パラメータを介して入力として channel_count が提供されます。(要件により、モジュール パラメータを介して ch 数を提供する必要があります)
  2. ドライバーは、alsa snd_pcm_hardware 構造を、playback->channels_min = channel_count &、playback->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 の構成が壊れています: 使用可能な構成がありません」と報告します。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:

  1. ドライバーにはモジュールパラメータ経由で入力としてchannel_count '3'が提供されます
  2. ドライバを修正し、snd_pcm_hardware 構造体を payback->channels_min = 2 & playback->channels_min = 3 として埋めました。キャプチャ パスにも同様の値を設定します。
  3. 使用中のウェーブファイルには3つのチャンネルがあるのに、aplay/arecordは「チャンネル数が利用できません」と報告する

例: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav WAVE './xxx.wav' を再生中: 符号付き 16 ビット リトルエンディアン、レート 48000 Hz、チャネル 3

aplay: set_params:1239: チャンネル数が利用できません

  1. 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

テスト終了

  1. aplay/arecord 中に、ドライバーで "runtime->channels" 値がチェックされると、値 2 が返されます。ただし、再生された wavefile の ch 数は 3 です...

  2. 録音されたファイルのデータを確認すると、すべて無音である


方法2:

  1. ドライバーにはモジュールパラメータ経由で入力としてchannel_count '3'が提供されます

  2. ドライバーを修正し、snd_pcm_hardware 構造体を playback->channels_min = 3 & playback->channels_min = 4 として埋めました。キャプチャ パスにも同様の値を設定します。

  3. 使用中のウェーブファイルには3つのチャンネルがあるのに、aplay/arecordは「チャンネル数が利用できません」と報告する

  4. plughwでaplay/arecordを試したところ、aplay/arecordが先に進みました

  5. aplay/arecord 中に、ドライバーで "runtime->channels" 値がチェックされると、値 4 が返されます。ただし、再生された wavefile の 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_再生レート、

xxx_playback.rate_min、xxx_playback.rate_max、

xxx_playback.チャンネル_min、xxx_playback.チャンネル_max

(キャプチャ側のsnd_pcm_hardware構造体で同様に値が置き換えられます)

関連情報