سؤال

أنا أعمل على مشروع Java يتلقى أحداث MIDI من MIDI Hardware باستخدام مكتبة javax.sound.midi. في الوثائق ، تقول ذلك MidiSystem.getMidiDeviceInfo() إرجاع قائمة بجميع أجهزة MIDI المتصلة. إنه يعمل بالنسبة لي ، لكن المشكلة هي أنها تعمل مرة واحدة فقط. يستغرق الأمر لحظة لأول مرة للمسح الضوئي للأجهزة ، ولكن في كل مرة ستُرجع ذلك على الفور هذه القائمة نفسها حتى لو تم توصيل الأجهزة الجديدة. هل هناك طريقة لإجبارها على أنسان؟ سيتم إعادة تشغيله إذا تم إعادة تشغيل التطبيق ، لكنني لا أريد أن يضطر المستخدمون إلى إعادة التشغيل إذا قاموا بتوصيل جهاز MIDI جديد.

راجع للشغل ، أنا أستخدم Mac OS X ... لقد تمت الإشارة إلى أن السلوك قد يكون مختلفًا عن نظام التشغيل مختلفًا.

هل كانت مفيدة؟

المحلول

ال MidiSystem.getMidiDeviceInfo() يحصل على قائمة مقدمي الخدمات الكاملة ، ويستخرج معلومات الجهاز من كل مزود.

يتم استرداد قائمة مزودات MIDIS من فئة JDK Legreshing Class com.sun.media.sound.jdk13services, من خلال الطريقة الثابتة getProviders()

قائمة متزامنة عامة ثابتة (ServiceClass)يحصل على قائمة تحتوي على مثيلات مثبتة لمقدمي الخدمات للخدمة المطلوبة. يتم تخزين قائمة مقدمي الخدمات مؤقتًا لفترة زمنية قدمها Cachingperiod. خلال هذه الفترة ، يتم إرجاع نفس مثيل القائمة لنفس النوع من المزود. بعد هذه الفترة ، يتم بناء مثيل جديد وإعادته. القائمة التي تم إرجاعها غير قابلة للتغيير.

لذلك ، يبدو أن هذه الفئة تحمل قائمة مقدمي الخدمات في ذاكرة التخزين المؤقت ، سيتم إعادة تحميلها بعد فترة معينة. يمكنك تعيين هذه الفترة على قيمة مخصصة باستخدام الطريقة setCachingPeriod(int seconds). طالما أعلم ، يتم تعيين فترة التخزين المؤقت الافتراضية على 60 ثانية.

على سبيل المثال ، لتحديث ذاكرة التخزين المؤقت هذه كل ثانية ، يمكنك إضافة هذا السطر إلى الكود الخاص بك:

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

من فضلك ، لاحظ أن هذا الحل يستخدم طبقة من أشعة الشمس ، لذلك لا يمكن أن يكون محمولًا بنسبة 100 ٪.

نصائح أخرى

تفتقر إلى أي أجهزة MIDI على جهاز الكمبيوتر الخاص بي ، أو في الواقع أي نوع من نوع MAC ، أشك في أنني سأكون قادرًا على اختباره بشكل صحيح ، ولكن ...

يبدو أن فئة MIDISYSTER تستخدم com.sun.media.sound.JDK13Services.getProviders(Class providerClass) للعثور على قائمة الأجهزة على النظام. ال مستندات API لهذا الفصل اذكر أن القائمة يتم إعادة إنشائها على مكالمة متتالية خارج أ cachingPeriod, ، والتي يمكن تعيينها بسهولة عن طريق الاتصال setCachingPeriod(int seconds).

مع أي حظ ، يمكنك فقط الاتصال بهذا مرة واحدة في بداية التطبيق الخاص بك وتعيينه على 5 ثوان أو شيء من هذا ، وسوف يعمل بطريقة سحرية. ومع ذلك ، تشير المستندات أيضًا إلى "هذه الطريقة مخصصة فقط للاختبار." ، لذلك لست متأكدًا تمامًا من مدى فعالية هذا النهج.

نأمل أن يكون هذا كافياً لتبدأ ، وسأواصل الالتفاف في هذه الأثناء لمعرفة ما إذا كان بإمكاني العثور على طريقة أنظف للقيام بذلك.

أجبت هذا قائمة تحديث أجهزة MIDI في Java كذلك ، ولكن للأشخاص الذين ينتهي بهم الأمر هنا ، هناك الآن مكتبة تدعم هذا بشكل صحيح: https://github.com/derekcook/coremidi4j

تعمل المكتبة على مزود جهاز لنظام MIDI ، لذلك فهو في الأساس عبارة عن قطرة وسيعمل جميع التعليمات البرمجية الحالية.

أنا لست المؤلف ، لكنه يعمل بشكل جيد لاحتياجاتي ، وقد استغرق الأمر القليل من البحث للعثور عليه ، لذلك أنا نشرها هنا للآخرين الذين يواجهون المشكلة.

هذا يبدو أنه يمكن أن يكون خطأ OS specifx ولكن يمكنني التفكير في التجول.

في Java ، يمكنك تشغيل أوامر خارجية إلى نظام التشغيل. (جوجل سريع ، أعطاني هذا المثال http://www.javafaq.nu/java-example-code-186.html يبدو جيدًا ويمنحك الفكرة).

عند التحقق من الأجهزة الجديدة ، يمكنك إرسال أمر خارجي لتشغيل برنامج Java بسيط يتسلف بسرعة من أجهزة MIDI باستخدام MIDISYSTEM.GETMIDIDEVICEINFO () وإخراج النتائج إلى ملف نصي أو يمكنك الحصول على الإخراج من كائن BufferReaderer.

تذكر أيضًا أن البرنامج الخارجي المستخدم للاستعلام عن أجهزة MIDI لا يجب كتابته في Java incase Java يسبب لك المزيد من المشكلات. بدلاً من ذلك ، يمكنك فقط الاستعلام عن نظام التشغيل للأجهزة المتصلة واستخدام GREP لتصفية النتائج.

أتمنى أن يساعدك هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top