Для поставщиков услуг и разработчиков API предоставляется краткий обзор исходного кода Java Sound.

javax.sound.sampled.AudioSystem - это точка входа в JavaSound для получения ресурсов; т.е. микшеры, линии и т. д. И каждый метод AudioSystem включает в себя получение поставщиков некоторой службы - MixerProvider [], FormatConversionProvider [], AudioFileReader [] или AudioFileWriter []. Затем метод переходит к получению определенной информации или выполнению некоторой задачи. В том, как работают эти методы, есть много общего. Давайте посмотрим, как работает getMixerInfo ().

Ниже представлена ​​диаграмма последовательности работы getMixerInfo () в AudioSystem.java:

Sequence diagram of getMixerInfo() in AudioSystem.java

getMixerInfo() в AudioSystem сначала вызывает getMixerProviders(), частный статический метод AudioSystem. Первое, что делает getMixerProviders(), - это пытается загрузить sun.misc.Service. Если выбрано исключение, это означает, что используется JRE до 1.3 и отсутствует механизм поиска поставщика услуг. Если выбрасывается исключение, то sun.media.sound.DefaultServices используется для получения поставщиков сервисов (не изображенных на диаграмме выше). Если присутствует механизм 1.3, то вызывается getJDK13Serives() (показано выше) с аргументом «javax.sound.sampled.spi.MixerProvider».

getJDK13Services() - еще один частный статический метод AudioSystem. Он пытается загрузить класс для "com.sun.media.sound.JDK13Services" и, если это удается, устанавливает для него значение Class jdk13Services. Затем выполняется небольшая хитрость с использованием Class.getMethod() для получения метода getProviders() из jdk13Services, который возвращается как объект Method m. Затем вызывается метод, который вызывает getProviders ("javax.sound.sampled.spi.MixerProvider") на JDK13Services. Это, в свою очередь, использует метод provider() объекта sun.misc.Service для возврата вектора поставщиков микшера MixerProvider[]. Затем для каждого элемента вектора вызывается метод getMixerInfo() MixerProvider, чтобы вернуть информацию (Mixer.info) для всех микшеров всех поставщиков микшеров.

Аналогичным образом обрабатываются и другие службы. Например, getTargetEncodings() вызывает getFormatConversionProviders(), getAudioFileFormat() вызывает getAudioFileReaders() и т. Д., Которые имеют структуру, аналогичную getMixerProviders().

 

Предыдущая Следующая