2013-01-07 4 views
6

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

これまでのところ、36個のキーボードから入力を得ることができ、カーネルのパニック(カーネルをアップデートする前に起こった)を起こさずに36個のサウンドカードを認識しました。 $ lsusb | grep "Audio" -cの出力が36であるため、36個のサウンドカードが認識されています。

ただし、$ aplay -lには合計32個の再生デバイス(「内部」サウンドカードを含む)が記載されています。また、$ alsamixer -c 32には「無効なカードインデックス:32」と表示されています(0〜31の範囲で使用でき、合計で32個まで使用できます)。

私の質問は、これらのコマンドでもリストされていない場合、他のサウンドカードにどうやってアクセスできますか?私はPythonでアプリケーションを書いていますが、そこからいくつかのライブラリを選ぶことができますが、私はこれらのため合計32個のデバイスに制限されることになります。どんな指針も役に立つでしょう。

ありがとうございました。

+2

あなたは恐れていますか、それともテストしましたか? – Crisfole

+0

私はpyaudioを試してみました。get_device_count()は32個のエイリアスを含んでいます。だから私はもっと少ないデバイスにアクセスすることができます。 – picheto

+1

どのようにこれらのデバイスをすべてPCに接続しましたか? これはバスの帯域幅にあまりにも大きすぎませんか? 実際に現在の31個のデバイスをすべて同時に使用できますか? –

答えて

7

基本的な質問は次のとおりです。ALSAによって制御されるシステムに32以上のサウンドカードが存在することはありますか?あなたのUSBコントローラはあなたが接続したすべてのサウンドカードを知っていますが、ALSAシステムはそうではありません。

ここで何が起きているのかを確認するためにカーネルソースに入ることができます。 /sound/core/sound.cであなたが最大のサウンドカードの問題の詳細を見つける:

39 static int cards_limit = 1; 
    40 
    41 MODULE_AUTHOR("Jaroslav Kysela <[email protected]>"); 
    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); 

コードとそのコメントから、私は二つのことを読んで:

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

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

出典:Kernel 2.8 Git

+1

'cards_limit'の影響を受ける自動ロードメカニズムは、USBサウンドカードには使用されていません。 'snd-usb-audio'を手動でロードすると、36台のデバイスすべてで同じドライバになるので何も変更できません。 –

3

サウンドカードの限度はinclude/sound/core.h内のシンボルSNDRV_CARDSとして定義されます。

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

snd_cards_lockを64ビット変数にして、すべてのアクセスを64ビットタイプに変更し、忘れてしまった可能性のある他の副作用を調整すると、カーネルにより多くのALSAカード。

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

+0

これをチェックします – picheto

関連する問題