問題タブ [jack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - エフェクト プロセッサ: ソフトウェア アーキテクチャ、プログラミング言語の選択、API に関する考察
私は現在、主要な要素がリアルタイムで信号処理を行うことができるソフトウェアであるプロジェクトに取り組んでいます。
基本的な考え方/コンセプトは次のとおりです。オーディオ データは、(USB) オーディオ インターフェイス (96 kHz、24 ビットで動作) から継続的にキャプチャされます。次に、「処理チェーン」(「仮想効果チェーン」など)を介して実行され、各要素がデータに対して任意の処理を実行できます。データは、シンクに到達するまで、ある要素から次の要素に渡されます。シンクに流れ込んだデータは、出力のためにオーディオ インターフェイスに送り返されます。
シグナル チェーンは、何らかの「処理」メソッドを実装する「オブジェクト」で構成され、1920 サンプル (20 ms) サイズのデータのチャンクで機能します (ただし、この数は変更される可能性があります)。
「疑似コード」における基本的な考え方。
オーディオ I/O に ALSA API を使用する最初のプロトタイプが Python で実装されました。3 つの個別のスレッドが開始されます。
最初のブロックは ALSA から継続的に読み取りを行い (これはブロッキング操作です)、データをキューに入れ、次のブロックの読み取りを続けます。(ALSA では、少なくとも 20 ミリ秒ごとに "read(...)" する必要があるため、そのためには非常に軽量なスレッドが必要です。これは、データの読み取りと保存のみを行うため、時間の制約を満たすことができます。)
2 つ目は、このキューからの入力からサンプルを読み取り、シグナル チェーンを介してそれらを配置し、最終的に出力用の別のキューに入れます。
3 番目のスレッドは、この出力キュー (ブロッキング操作) から読み取り、ブロックを ALSA に書き込みます。
ここには基本的に 2 つの「数値」変数があります。1 つはブロック サイズで、もう 1 つは処理を開始する前に出力キューに「プレポスト」するブロックの数です。 "出力バッファのアンダーランニングなし。さらに、これらのことを別のスレッドまたは別のプロセスで行うこともできます。
いくつかの深刻なデバッグ (信号発生器とオシロスコープの両方の使用が含まれます!) の後、私はついにこのアプローチを実行することができました。最大の問題は、ALSA API のバグでした。つまり、「読み書きされるフレーム数」として指定される「period_size」は、実際には読み取られたフレーム数のように見えますが、バイト数は書いた。入力と出力の両方に 1920 (96 kHz のサンプリング レートで 20 ミリ秒のオーディオ) を指定すると、出力の 1/4、無音の 3/4、出力の 1/4 しか得られません。入力と出力の両方に 1920 * 4 = 7680 を指定すると、デバイスのバッファがこの数のフレームを読み取るのに十分な大きさではないというエラーが表示されます。入力に 1920 を指定し、出力に 7680 を指定すると、完全に機能します (また、キューが「オーバーフィル」することもありません)。
それが解決された後も、深刻な問題が 1 つ残っています。それは、レイテンシです。
このプロジェクト全体は基本的に自分のエフェクトを作成するために始めたので、このソフトウェアをステージ/ライブ用のエフェクト ユニットとして動作させたいと考えています。2 つのイベントの間隔が 30 ミリ秒未満の場合、たとえば 2 つのストロボ ライトが 30 ミリ秒間隔で発射されると、人間の脳はどちらが最初でどちらが 2 番目であるかを判断できなくなると読んだことがあります。したがって、30 ミリ秒以下の遅延は、基本的に「瞬時」と認識されます。これは、イベントが「融合」し、「1 つ」として認識されるしきい値です。レイテンシーが非常に低い場合、どのイベントが最初であるかを判断できませんでした。たとえば、ギタリストは、弦を叩いてから PA から音が出たのか、それとも PA から音が出たのかを知ることができなくなりました。つまり、基本的に「ゼロ レイテンシー」のように感じられ、実際のアンプのようになります。
私が現在到達しているレイテンシーは...まあ...まだ正確に測定する機会はありませんでしたが、10分の1秒のオーダーで、200ミリ秒または300ミリ秒です. 行き過ぎです!I/O 用に個別のスレッドとプロセスの両方を試しました (Python では、「グローバル インタープリター ロック」によりスレッドが実際に高速になるかどうかわからないため)。プロセス間通信に関連するオーバーヘッドと、2 つの I/O プロセスが「集中的な」ことを何も行わないという事実。ブロッキング操作を待機し、高速 I/O を実行します。
別の発言として、ユーザーが信号パスを構成し、エフェクト「デバイス」のパラメーターを調整できるように、アプリケーションで Web サーバーを (もちろん別のスレッドまたはプロセスで) ホストする必要があると言いたいです。直感的な方法。
明らかに、レイテンシーを下げる必要があります。私には今、進むべき道がいくつかあります。
私の最初のアイデアは、ALSA を「低遅延」と言われる JACK に置き換えることです。欠点は、ADC/DAC での正確なレベルを制御できなくなることです (JACK は、ハードウェアが何をしようとも、既に [-1.0, 1.0] にスケーリングされている浮動小数点数で常に動作します) およびオーバーサンプリング レート (私がジャックはサンプリングレートを「指示」します-私はもう選択できません-ALSAを使用すると、使用したいサンプリングレートを選択でき、ハードウェアがそれから逸脱した場合、透過的にアップサンプル/ダウンサンプルします)、ブロッキング私/O (非常に優れたパラダイムだと思います) はコールバック メカニズムに置き換えられ、タイミングの制約を満たすのはおそらくはるかに困難です。(JACKで自分で「バッファリング」することはできません。常に一定の時間で処理を行う必要があります。)また、JACK API は、一般的に ALSA API よりも複雑に見えます。おそらくALSAをJACKに置き換えることができますが、ALSAがすでにかなり「低レベル」のAPIであり、JACKが構築されていることを考えると、どれだけ「勝つ」ことができるかわかりませんが、おそらく維持するために非常に具体的な方法で使用しますレイテンシーが低い。正直なところ、ALSA と「下」が原因でその遅延がどの程度なのか、「上位レイヤー」が原因でどの程度の遅延が生じているのか正確にはわかりません。
私は現在、解釈された、ガベージコレクションされた言語を利用しています。これは、リアルタイムの要件には適していません。しかし、代替手段は何ですか?もちろん、リアルタイム アプリケーションについて考えるときは C が思い浮かびますが、重大な欠点があります。
2.1 - ソフトウェアに Web ベースの UI が必要です。Python で Web サーバーを作成するのは簡単です。Python 標準ライブラリにそのためのクラスがあります。C で Web サーバーを作成するのは面倒です。基本的に、「Web」を実行できるCには何もありません。ソケット API だけに基づいてゼロから始める必要があります。幸運を!:-(
2.2 - Python は数値をサポートしています。numpy と scipy があるため、ベクトル データ型、行列乗算、高速フーリエ変換、高速畳み込み、補間 (スプラインなど) があります。これはすべて、ここで目前の問題に非常に役立ちます。C では、これらすべてが失われます。つまり、これを使わずに仕事を終わらせる必要があるか (ほとんどありません)、または C でこれらすべてを自分で再作成する必要があり、これには時間がかかり、エラーが発生します。傾向がある。
2.3 - Python には、マルチプロセッシングとマルチスレッドの「ハイレベル」サポートがあります。同期されたキューを介してプロセスとスレッド間で通信でき、「スレッド プール / レプリケートされたワーカー」スタイルの方法でソリューションを実装できます。C では、POSIX スレッドと、mutice のような低レベルの同期プリミティブに頼る必要があります。(「mutex」の正しい複数形ですか? 「Unix」のように --> 「Unices」?) 繰り返しますが、これには時間がかかり、エラーが発生しやすくなります。
使用する言語に関する提案はありますか? 私がよく知っている言語には、Python、C-Sharp、Java、C、Go、および少しの C++ が含まれます (その言語はまったく必要ありません。低レベルである場合は C を使用し、高レベルである場合は私が使用します)。ガベージコレクションされたインタープリターまたはバイトコードでコンパイルされた言語を使用する)、および一部の Web テクノロジ (特に、UI に関して役立つ AJAX を使用した JavaScript など)。
これらはすべてLinuxディストリビューションで実行する必要があり、できれば依存関係やライブラリをできるだけ少なくする必要があります。したがって、「標準」ライブラリは「エキゾチック」ライブラリよりも優先されます。プラットフォームに依存しないこと、特に Windows でも実行できることはプラスですが、厳密には必須ではありません。
UIが実際の処理(リアルタイムである必要がある場合は「Cで行う必要がある」かもしれません)とは異なる言語で実装されていても問題ありません(Webサーバーに行くことが頭に浮かびます)。これにより、両方が別々のプロセスで実行され、たとえばUnixドメインソケットを介して通信するため、非常に複雑になります。これにより、すべてのデータをバイトストリームとして表現するために前後に渡す必要があります)、したがって、プロセス間通信プロトコルを設計し、このレベルでも多くの解析を行う必要があります。この巨大なオーバーヘッドを回避し、単一の言語で実行する機会はありますか?
他のアイデアはありますか?具体的には、ALSA から JACK に移行することで何か得られることはありますか? まだ検討していない他の選択肢はありますか?
お時間をありがとうございました!
linux - PortAudio の信頼性が低い: 式 '...' が失敗しました
私は現在、リアルタイム信号処理を実験しているので、PortAudio (from C) を試してみました。
私のコンピュータには、オンボード サウンド (Intel HD Audio) と USB オーディオ インターフェイスの 2 つのオーディオ インターフェイスがあります。どちらも通常、Linux の ALSA で正常に動作します。また、Linux の JACK で USB オーディオ インターフェイスを試してみましたが、これも完璧に動作します。
私がやること:
私のコードは、PortAudio を初期化し、ストリームを開いて開始するだけです (1 つのチャネル、paInt32サンプル形式、/defaultLowInputLatencyにdefaultLowOutputLatency変更しようとしましたが、何も改善されませんでした)。paFloat32defaultHighInputLatencydefaultHighOutputLatency
コールバックが呼び出されるたびに、sizeof(int32_t) * frameCountバイトを経由memcpyして入力から出力バッファにコピーし、 を返しますpaContinue。コールバックでは他に何もしません。メモリの割り当ても、システム コールも、ブロックできるものもありません。読み取ったものを出力するだけです。コードは非常に単純ですが、それでも実行できません。
入力から出力バッファに型の要素をmemcpyコピーするループに置き換えても、何も変わりませんでした。frameCountint32_t
私が試したこと:
次のシナリオは、PortAudio で試行されました。
- USB オーディオ インターフェイス経由の入出力、PortAudio のコールバック メカニズム、ALSA バックエンド。
- USB オーディオ インターフェイス経由の入出力、1024 サンプル バッファ サイズ、ALSA バックエンドの PortAudio での I/O のブロック。
- USB オーディオ インターフェイス経由の入力、オンボード サウンド経由の出力、PortAudio のコールバック メカニズム、ALSA バックエンド。
- USB オーディオ インターフェイス経由の入力、オンボード サウンド経由の出力、1024 サンプル バッファー サイズの PortAudio での I/O のブロック、ALSA バックエンド。
- USB オーディオ インターフェイス、PortAudio のコールバック メカニズム、JACK バックエンドを介した入出力。
- USB オーディオ インターフェイス経由の入出力、1024 サンプル バッファ サイズ、JACK バックエンドの PortAudio での I/O のブロック。
私が遭遇した問題:
結果は以下の通り。(数字は上記のシナリオを表します。)
- デバイスからの出力がありません。
- デバイスからの出力が不安定 (中断)。常に多くのバッファ アンダーランが発生します。
- デバイスからの出力がありません。
- デバイスからの出力が実現不可能です。うまくいくこともあれば、うまくいかないこともあります。(何も変更せずに、実行可能ファイルを複数回実行するだけです。) 動作する場合、遅延は最初は低くなりますが、時間の経過とともに増加し、非常に顕著になります。
- デバイスからの出力がありません。
- デバイスからの出力がありません。
各試行の間に、ALSA がまだ応答しているかどうかがテストされ (完全に「ロックアップ」され、アプリケーションがサウンドを出力できなくなる場合がありました)、ALSA が「ロックアップ」した場合に備えてシステムを再起動し、テストを続けました。
詳細は、問題を追跡するときに役立つ場合があります。
出力がまったくないシナリオで、ALSA をバックエンドとして使用すると、次のエラー メッセージが表示されます。
JACK をバックエンドとして使用すると、次のエラー メッセージが表示されます。
さらに、どの方法を使用しても、常にこれらの警告が表示されます。
ALSA を使用していると、アンダーランに関する苦情も 1 つか 2 つありました。
私が呼び出した PortAudio 関数 ( Pa_Initialize、Pa_OpenStream、Pa_StartStream、Pa_StopStream、Pa_CloseStream、Pa_Terminateこの順序で) は、すべて を返しpaNoErrorます。
PortAudio に付属するpaex_read_write_wire.c(ブロッキング I/O) サンプルは、通常、デバイスにアクセスできますが、多くのアンダーランも発生します (私のテスト ケース 2 のように)。
どちらの場合でも、興味深いものは何も表示されませんdmesg。(ALSAにはカーネルレベルのコンポーネントがあるため、確認しました。)
私の質問:
ここで何が問題なのか、どうすれば修正できるのか、誰でも知っていますか? または、少なくとも、どうすればもう少し絞り込むことができますか?
audio - LAN 経由で JACK Audio/Netjack が動作しない
2 つのラズベリー pi 間で低遅延のオーディオをストリーミングしようとしています。gstreamer と ffmpeg の両方で、2 秒以上の遅延が発生します。
私はJack Audioをいじってみましたが、ローカルでは単一のpiで有望だと思われます。マイク入力をローカルでスピーカーにルーティングできますが、それはほぼ瞬時です。
ただし、Netjack を使用してデバイス間でルーティングするのに問題がありました。
ここから取得した起動オプションのほとんどhttp://wiki.linuxaudio.org/wiki/raspberrypi#using_jack。正直に言うと、彼らが何をしているのかよくわかりません。
クライアント jackd の出力には、次のようなメッセージが表示されます。
サーバーの jack_netsource の出力は次のようになります。
サーバーjackdの出力は次のようになります
-dnetoneフラグは Netjack2 を使用することを示していると思います。私がフラグで試した Netjack 1 は、 jack_netsource から-dnetの単一のNot Connectedメッセージと次の結果になります。
クライアントjackdから。
android - Androidスタジオに* .jackを追加するには?
android M では、android は jack をサポートし、ライブラリをコンパイルすると、3d.jar ではなく 3d.jack になります。
私の質問は、3d.jack をライブラリとして追加して、3d のライブラリに依存するアプリを構築する方法です。
ライブラリが 3d.jar の場合、ライブラリを追加する方法を知っています。しかし、同じように 3d.jack を libs フォルダーにコピーし、*.jack に変更しようとしましたが、うまくいきません。
誰でもそれを行う方法を知っていますか?
audio - 処理中に複数のオーディオ入力を取得する
現在、複数のオーディオ入力にアクセスする必要がある Processing スケッチを作成していますが、Processing ではデフォルトのライン入力にしかアクセスできません。Java ミキサー (Processing 内でアクセス) からラインを直接取得しようとしましたが、まだ信号しか取得できません。私のマシンで現在デフォルトに設定されている行から。
ここで推奨されているように、SuperCollider から OSC 経由でサウンドを送信することを検討し始めました。ただし、私は SuperCollider に非常に慣れておらず、そのドキュメントとサポートは入力へのアクセスよりもサウンドの生成に重点を置いているため、次のステップは、ここで提案されているように、ビーズとジャックをいじることになるでしょう。
(1) 他の提案、または (2) SuperCollider または Beads/Jack から Processing への複数の入力を取得する具体的な例はありますか?
前もって感謝します!
編集: サウンドは、カスタムの音楽ビジュアライゼーションを強化するために使用されます (iTunes ビジュアライザーを考えてください。ただし、より曲固有のものです)。これは複数の mp3 で動作します。今私が必要としているのは、各マイクから float[] バッファを取得できることです。9 種類のマイクがあることを望んでいますが、それが可能であれば 4 つで解決します。
ハードウェアについては、現時点ではマイクと XLR から USB へのケーブルのみを使用しています。(プリアンプも検討しましたが、今のところこれで十分です。) 現在は Windows ですが、最終的には Mac に切り替えると思います。
これがビーズだけでの私の試みでした(ラップトップでは問題なく動作します。最初にビーズを実行するためですが、ヘッドセットバッファーにはすべて0があります。それらを切り替えてヘッドセットを最初に配置すると、ヘッドセットバッファーは正しくなりますが、ラップトップすべての 0 が含まれます):
Jack を追加しようとすると、次の行が含まれます。
しかし、私はエラーが発生します:
また、Jack にいるときは、自分のマイクが表示されません (Jack はまったくの初心者ですが、これは大きな危険信号のように思えます)。この AudioContext は Jack の入力として表示されますか? またはその逆 -- まずマイクを見つけてから、Jack から Processing に渡しますか?
(私の経験不足をお許しください。またよろしくお願いします。Jack に関する知識が不足しているため、代わりに SuperCollider を再検討する必要があるかどうか疑問に思います...)