13

javax.sound.midi ライブラリを使用して midi ハードウェアから midi イベントを受け取る Java プロジェクトに取り組んでいます。ドキュメントでは、MidiSystem.getMidiDeviceInfo()接続されているすべての MIDI ハードウェアのリストを返すと書かれています。それは私にとってはうまくいきますが、問題は、一度しか機能しないことです。初めて実際にデバイスをスキャンするのに少し時間がかかりますが、その後は毎回、新しいデバイスが接続されていても同じリストがすぐに返されます。強制的に再スキャンする方法はありますか?アプリケーションが再起動されると再スキャンされますが、ユーザーが新しい MIDI デバイスを接続する場合に再起動する必要はありません。

ところで、私は Mac OS X を使用しています... OS によって動作が異なる可能性があることが指摘されています。

4

5 に答える 5

7

MidiSystem.getMidiDeviceInfo()完全なプロバイダーリストを取得し、各プロバイダーからデバイスの情報を抽出します。

MIDIプロバイダーリストは、静的メソッドを介して、JDKアンダーレイクラスcom.sun.media.sound.JDK13Servicesから復元されます。getProviders()

public staticsynchronized List getProviders(Class serviceClass) 要求されたサービスのプロバイダーのインストール済みインスタンスを含むリストを取得します。プロバイダーのリストは、cachingPeriodによって指定された期間キャッシュされます。この期間中、同じタイプのプロバイダーに対して同じリストインスタンスが返されます。この期間の後、新しいインスタンスが作成されて返されます。返されるリストは不変です。

したがって、このクラスはプロバイダーリストをキャッシュに保持しているようです。このリストは一定期間後にリロードされます。メソッドを使用して、この期間をカスタム値に設定できますsetCachingPeriod(int seconds)。私の知る限り、デフォルトのキャッシュ期間は60秒に設定されています。

例として、このキャッシュを毎秒更新するには、次の行をコードに追加します。

com.sun.media.sound.JDK13Services.setCachingPeriod(1);

このソリューションはSunの独自クラスを利用しているため、100%移植可能ではないことに注意してください。

于 2010-09-29T10:04:46.727 に答える
3

仕事用のPC、または実際にあらゆる種類のMacにMIDIデバイスがないため、正しくテストできるとは思えませんが...

MidiSystemクラスはcom.sun.media.sound.JDK13Services.getProviders(Class providerClass)、システム上のデバイスのリストを見つけるために使用しているようです。このクラスのAPIドキュメントには、リストは、の外部の連続した呼び出しで再作成されると記載されています。cachingPeriodこれは、を呼び出すことで簡単に設定できますsetCachingPeriod(int seconds)

運が良ければ、アプリケーションの開始時にこれを1回呼び出して、5秒程度に設定するだけで、魔法のように機能します。ただし、ドキュメントには「この方法はテストのみを目的としています」と記載されているため、このアプローチがどれほど効果的かはわかりません。

うまくいけば、これであなたが始めるのに十分です、そして私はこれを行うためのよりクリーンな方法を見つけることができるかどうかを確認するためにその間ずっと突っつい続けます。

于 2010-09-29T10:04:03.053 に答える
-1

これは OS 固有のバグのように思えますが、回避策を考えることができます。

Java では、OS に対して外部コマンドを実行できます。(簡単なグーグルは、私にこの例を与えましたhttp://www.javafaq.nu/java-example-code-186.htmlそれは問題なく見え、あなたにアイデアを与えます)。

新しいデバイスをチェックする際に、外部コマンドを送信して、MidiSystem.getMidiDeviceInfo() を使用して midi デバイスをすばやく照会し、結果をテキスト ファイルに出力する単純な Java プログラムを実行するか、BufferedReader オブジェクトから出力を取得することができます。

また、Java がさらに問題を引き起こす場合に備えて、MIDI デバイスのクエリに使用する外部プログラムを Java で記述する必要がないことも覚えておいてください。または、接続されているデバイスの OS を照会し、grep を使用して結果をフィルタリングすることもできます。

お役に立てれば。

于 2010-09-24T11:09:02.610 に答える