Java Sound API -MIDIデバイスのスキャン
-
04-10-2019 - |
質問
javax.sound.midiライブラリを使用して、MIDIハードウェアからMIDIイベントを受信するJavaプロジェクトに取り組んでいます。ドキュメントでは、それが言っています MidiSystem.getMidiDeviceInfo()
接続されているすべてのMIDIハードウェアのリストを返します。それは私にとってはうまくいきますが、問題は一度だけ動作することです。実際にデバイスをスキャンするのに初めて時間がかかりますが、その後、新しいデバイスが接続されていても、すぐに同じリストを返します。それを強制する方法はありますか?アプリケーションが再起動された場合は再実行されますが、新しいMIDIデバイスを接続すると、ユーザーが再起動する必要はありません。
ところで、私はMac OS Xを使用しています... OSが異なる場合、動作は異なる可能性があることが指摘されています。
解決
MidiSystem.getMidiDeviceInfo()
完全なプロバイダーリストを取得し、各プロバイダーからデバイスの情報を抽出します。
MIDISプロバイダーリストは、JDKアンダーレイクラスから回収されます com.sun.media.sound.jdk13Services, 、静的方法を介して getProviders()
public static同期リストgetProviders(クラスServiceClass)要求されたサービスのプロバイダーのインストールインスタンスを含むリストを取得します。プロバイダーのリストは、CachingPeriodによって与えられた期間、キャッシュされています。この期間中、同じタイプのプロバイダーに対して同じリストインスタンスが返されます。この期間の後、新しいインスタンスが構築され、返されます。返されたリストは不変です。
したがって、このクラスはあなたのプロバイダーリストをキャッシュに保持しているようで、特定の期間の後にはリロードされます。この期間をメソッドを使用してカスタム値に設定できます setCachingPeriod(int seconds)
. 。私が知っている限り、デフォルトのキャッシュ期間は60秒に設定されています。
例として、このキャッシュを毎秒更新するために、この行をコードに追加することを確認してください。
com.sun.media.sound.JDK13Services.setCachingPeriod(1);
このソリューションは太陽のプロポエタリクラスを利用しているため、100%ポータブルになることはできません。
他のヒント
私の仕事のPCにMIDIデバイスや、実際にあらゆる種類のMacが不足しているので、適切にテストできるとは思いませんが...
Midisystemクラスは使用しているようです com.sun.media.sound.JDK13Services.getProviders(Class providerClass)
システム上のデバイスのリストを見つける。 このクラスのAPIドキュメント リストは、 cachingPeriod
, 、電話をかけることで便利に設定できます setCachingPeriod(int seconds)
.
運が良ければ、アプリケーションの開始時にこれを一度呼び出して、5秒か何かに設定できます。魔法のように機能します。ただし、ドキュメントには「この方法はテストを目的としている」とも述べているため、このアプローチがどれほど効果的であるかはわかりません。
うまくいけば、これがあなたを始めるのに十分であり、その間に私はこれを行うためのよりクリーンな方法を見つけることができるかどうかを確認するためにあふれ続けます。
私はこれに答えました JavaのMIDIデバイスのリストを更新します 同様に、しかし、ここに巻き込まれている人々のために、これを正しくサポートするライブラリがあります。 https://github.com/derekcook/coremidi4j
ライブラリはMIDIサブシステムのデバイスプロバイダーを動作するため、基本的にドロップインであり、既存のコードはすべて機能します。
私は著者ではありませんが、それは私のニーズに合ったものであり、見つけるのにかなりの検索が必要なので、問題に遭遇した他の人のためにここに投稿しています。
これは、os specifxバグである可能性があるように聞こえますが、私は逃げることを考えることができます。
Javaでは、OSに外部コマンドを実行できます。 (簡単なGoogle、この例を教えてくれました http://www.javafaq.nu/java-example-code-186.html それは大丈夫に見え、あなたにアイデアを与えます)。
新しいデバイスをチェックすると、外部コマンドを送信して、midisystem.getMididididididideviceInfo()を使用してMIDIデバイスをすばやく照会し、結果をテキストファイルに出力するか、BefferedReaderオブジェクトから出力を取得することができます。
また、MIDIデバイスを照会するために使用される外部プログラムは、Javaの場合にJavaに記述する必要がないことを忘れないでください。または、接続されたデバイスのOSをクエリするだけで、GREPを使用して結果をフィルタリングすることもできます。
お役に立てれば。