6

私は、36 個のキーボードと 36 個の USB サウンド カードを 1 台のコンピューターに接続する必要がある教育的なマルチシート プロジェクトに取り組んでいます。3.6.3-030603-generic カーネルで Ubuntu Linux 12.04 を実行しています。

これまでのところ、36 のキーボードから入力を取得し、カーネル パニック (カーネルの更新前に発生) を発生させることなく 36 のサウンド カードを認識することができました。$ lsusb | grep "Audio" -c出力36. _

ただし、$ aplay -l合計で 32 の再生デバイスがリストされています (「内部」サウンド カードを含む)。また、$ alsamixer -c 32「無効なカード インデックス: 32」と表示されます (0 から 31 までしか機能しません。合計でも 32 です)。

私の質問は、これらのコマンドでリストされていない場合、他のサウンド カードにアクセスするにはどうすればよいですか? 私は Python でアプリケーションを作成しており、選択できるライブラリがいくつかありますが、このため、合計で 32 台のデバイスに制限されるのではないかと心配しています。どんなガイダンスも役に立ちます。

ありがとう。

4

2 に答える 2

7

あなたが提起する質問は基本的に次のとおりです。ALSA によって制御されるシステムに 32 を超えるサウンド カードを配置できますか? USB コントローラは、接続されているすべてのサウンド カードを認識していますが、ALSA システムは認識していないようです。

ここで何が起こっているかを確認するために、カーネル ソースに入りましょう。サウンド カードの最大数の問題に関する詳細は/sound/core/sound.c、次のサイトで確認できます。

  39 static int cards_limit = 1;
  40 
  41 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
  42 MODULE_DESCRIPTION("Advanced Linux Sound Architecture driver for soundcards.");
  43 MODULE_LICENSE("GPL");
  44 module_param(major, int, 0444);
  45 MODULE_PARM_DESC(major, "Major # for sound driver.");
  46 module_param(cards_limit, int, 0444);
  47 MODULE_PARM_DESC(cards_limit, "Count of auto-loadable soundcards.");
  48 MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
  49 
  50 /* this one holds the actual max. card number currently available.
  51  * as default, it's identical with cards_limit option.  when more
  52  * modules are loaded manually, this limit number increases, too.
  53  */
  54 int snd_ecards_limit;
  55 EXPORT_SYMBOL(snd_ecards_limit);

コードとそのコメントから、次の 2 つのことがわかりました。

  1. 変数 cards_limit はモジュール パラメータです。インストール時にこのパラメーターが 32 に設定されていると仮定します。ALSA サポートがカーネルに組み込まれている場合は、このオプションを変更したカスタム カーネルを構築できます。ALSA サポートが組み込まれておらず、モジュールとして読み込まれている場合は、モジュールの読み込み中にこのパラメーターを設定できます。これを行うには、システム構成を変更するか ( man modprobe.d)、モジュールをアンロードしてから、オプションで再ロードします ( man modprobe)。

  2. 制限は、自動的にロードされるサウンドカードの数のみを制限するように記述されています。この制限を克服するには、サウンドカードを担当するモジュールを手動でロードするだけで十分な場合があります。手動で追加されたサウンドカードについて、カーネルには制限が設定されていません。

ソース:カーネル 2.8 Git

于 2013-01-07T18:41:57.697 に答える
3

サウンドカードの制限は、の記号として定義されていSNDRV_CARDSますinclude/sound/core.h

snd_cards_lock7年前にこれを増やしたとき、カードインデックスがの変数のビットインデックスとして使用されていたため、32を超えませんでしたsound/core/init.c。また、必要以上に変更したくありませんでした。

64ビット変数を作成snd_cards_lockし、すべてのアクセスを64ビット型を使用するように変更し、私が忘れていた可能性のあるその他の副作用を調整すると、カーネルにさらに多くのALSAカードを持たせることができるはずです。

この制限はalsa-libパッケージにも存在します。少なくともチェックインを変更する必要がありsnd_ctl_hw_openますsrc/control/control_hw.c

于 2013-01-07T20:25:58.723 に答える