Spec-Zone .ru
спецификации, руководства, описания, API
|
Глава 13, "Введение в Интерфейсы Поставщика услуг," объяснил что javax.sound.sampled.spi
и javax.sound.midi.spi
пакеты определяют абстрактные классы, которые будут использоваться разработчиками звуковых служб. Реализовывая подкласс одного из этих абстрактных классов, поставщик услуг может создать новую службу, которая расширяет функциональность системы времени выполнения. Глава 14, покрытая использование javax.sound.sampled.spi
пакет. Существующая глава обсуждает, как использовать javax.sound.midi.spi
пакет, чтобы предоставить новые услуги для того, чтобы обработать MIDI-устройства и файлы.
Программисты приложений, которые только используют существующие службы MIDI в их программах, могут безопасно пропустить эту главу. Для краткого обзора MIDI и использования установленных служб MIDI в прикладной программе, см. Вторую часть, "MIDI", Руководства этого Программиста. Эта глава предполагает, что читатель знаком с методами API Звука Java, которые прикладные программы вызывают, чтобы получить доступ к установленным службам MIDI.
Есть четыре абстрактных класса в javax.sound.midi.spi
пакет, которые представляют четыре различных типов служб, что можно предусмотреть систему MIDI:
MidiFileWriter
предоставляет услуги записи файла MIDI. Эти службы позволяют прикладной программе сохранить, к файлу MIDI, MIDI Sequence
то, что это генерировало или обработало. MidiFileReader
предоставляет читающие файл услуги, которые возвращают MIDI Sequence
от файла MIDI для использования в прикладной программе. MidiDeviceProvider
экземпляры предоставлений одного или более определенные типы MIDI-устройства, возможно включая устройства. SoundbankReader
предоставления soundbank читающие файл службы. Конкретные подклассы SoundbankReader
проанализируйте данный soundbank файл, производя a Soundbank
объект, который может быть загружен в a Synthesizer
.Прикладная программа не будет непосредственно создавать экземпляр объекта службы — ли объект провайдера, такой как a MidiDeviceProvider
, или объект, такой как a Synthesizer
, это предоставляется объектом провайдера. И при этом программа непосредственно не отнесется к классам SPI. Вместо этого прикладная программа обращается с просьбами к MidiSystem
объект в javax.sound.midi
пакет, и MidiSystem
поочередно подклассы бетона использования javax.sound.midi.spi
классы, чтобы обработать эти запросы.
Есть три стандартных форматов файлов MIDI, все из которых реализация API Звука Java может поддерживать: Тип 0, Тип 1, и Тип 2. Эти форматы файлов отличаются по своему внутреннему представлению данных последовательности MIDI в файле, и являются подходящими для различных видов последовательностей. Если реализация самостоятельно не поддерживает все три типа, поставщик услуг может предоставить поддержку нереализованных. Есть также разновидности стандартных форматов файлов MIDI, некоторые из них собственные, который так же мог поддерживаться сторонним поставщиком.
Возможность записать файлы MIDI обеспечивается конкретными подклассами MidiFileWriter
. Этот абстрактный class непосредственно походит javax.sampled.spi.AudioFileWriter
. Снова, методы группируются в методы запроса для того, чтобы изучить то, что типы файлов могут быть записаны, и методы для того, чтобы фактически записать файл. Как с AudioFileWriter
, два из методов запроса конкретны:
boolean isFileTypeSupported(int fileType) boolean isFileTypeSupported(int fileType, Sequence sequence)Первый из них предоставляет общую информацию о том, может ли писатель файла когда-либо писать указанный тип типа файла MIDI. Второй метод является более определенным: это спрашивает, может ли определенная Последовательность быть записана указанному типу файла MIDI. Обычно, Вы не должны переопределить ни один из этих двух конкретных методов. В реализации по умолчанию каждый вызывает один из двух других соответствующих методов запроса и выполняет итерации по возвращенным результатам. Будучи абстрактным, эти другие два метода запроса должны быть реализованы в подклассе:
abstract int[] getMidiFileTypes() abstract int[] getMidiFileTypes(Sequence sequence)Первый из этих возвратов массив всех типов файла, которые поддерживаются вообще. Типичная реализация могла бы инициализировать массив в конструкторе писателя файла и возвратить массив из этого метода. От того набора типов файла второй метод находит подмножество, в которое писатель файла может записать данную Последовательность. В соответствии со спецификацией MIDI, не все типы последовательностей могут быть записаны всем типам файлов MIDI.
write
методы a MidiFileWriter
подкласс выполняет кодирование данных в данном Sequence
в корректный формат данных для требуемого типа файла MIDI, пишущий кодированный поток или в файл или в поток вывода:
abstract int write(Sequence in, int fileType, java.io.File out) abstract int write(Sequence in, int fileType, java.io.OutputStream out)Сделать это,
write
метод должен проанализировать Sequence
выполняя итерации по его дорожкам, создайте соответствующий заголовок файла, и запишите заголовок и дорожки к выводу. Формат заголовка файла MIDI, конечно, определяется спецификацией MIDI. Это включает такую информацию как "магическое число", идентифицирующее это как файл MIDI, продолжительность заголовка, число дорожек, и информация о синхронизации последовательности (тип подразделения и разрешение). Остальная часть файла MIDI состоит из данных дорожки в формате, определенном спецификацией MIDI. Кратко давайте смотреть на то, как прикладная программа, система MIDI, и поставщик услуг сотрудничают в письменной форме файл MIDI. В типичной ситуации у прикладной программы есть определенный MIDI Sequence
сохранить к файлу. Программа запрашивает MidiSystem
объект видеть, какие форматы файлов MIDI, если таковые вообще имеются, поддерживаются для детали Sequence
под рукой, прежде, чем попытаться записать файл. MidiSystem.getMidiFileTypes(Sequence)
метод возвращает массив всех типов файла MIDI, в которые система может записать определенную последовательность. Это делает это, вызывая соответствие getMidiFileTypes
метод для каждого из установленных MidiFileWriter
службы, и сбор и возврат результатов в массиве целых чисел, которые могут считаться основным списком всех типов файла, совместимых с данным Sequence
. Когда дело доходит до записи Sequence
к файлу, звонку MidiSystem.write
передается целое число, представляющее тип файла, наряду с Sequence
быть записанным и выходной файл; MidiSystem
использует предоставленный тип, чтобы решить, который устанавливал MidiFileWriter
должен обработать запрос записи, и диспетчеризирует соответствие write
к соответствующему MidiFileWriter
.
MidiFileReader
абстрактный class непосредственно походит javax.sampled.spi.AudioFileReader
class. Оба состоят из двух перегруженных методов, каждый из которых может взять a File
, URL
, или InputStream
параметр. Первый из перегруженных методов возвращает формат файла указанного файла. В случае MidiFileReader
, API:
abstract MidiFileFormat getMidiFileFormat(java.io.File file) abstract MidiFileFormat getMidiFileFormat( java.io.InputStream stream) abstract MidiFileFormat getMidiFileFormat(java.net.URL url)Конкретные подклассы должны реализовать эти методы, чтобы возвратить заполненный
MidiFileFormat
объект, описывающий формат указанного файла MIDI (или поток или URL), предполагая, что файл имеет тип, поддерживаемый средством чтения файлов и что это содержит допустимую информацию о заголовке. Иначе, InvalidMidiDataException
должен быть брошен. Другой перегруженный метод возвращает MIDI Sequence
от данного файла, потока, или URL:
abstract Sequence getSequence(java.io.File file) abstract Sequence getSequence(java.io.InputStream stream) abstract Sequence getSequence(java.net.URL url)
getSequence
метод выполняет фактическую работу парсинга байтов во входном файле MIDI и построении соответствия Sequence
объект. Это - по существу инверсия процесса, используемого MidiFileWriter.write
. Поскольку есть взаимно-однозначное соответствие между содержанием файла MIDI как определено спецификацией MIDI и a Sequence
возразите как определено API Звука Java, детали парсинга являются прямыми. Если файл, к которому передают getSequence
содержит данные, которые не может проанализировать средство чтения файлов (например, потому что файл был поврежден или не соответствует спецификации MIDI), InvalidMidiDataException
должен быть брошен.
A MidiDeviceProvider
может считаться фабрикой, которая предоставляет один или более определенных типов MIDI-устройства. class состоит из метода, который возвращает экземпляр MIDI-устройства, так же как методы запроса, чтобы изучить, какие виды устройств этот провайдер может предоставить.
Как с другим javax.sound.midi.spi
службы, разработчики приложений получают косвенный доступ к a MidiDeviceProvider
служба посредством звонка MidiSystem
методы, в этом случае MidiSystem.getMidiDevice
и MidiSystem.getMidiDeviceInfo
. Цель разделить на подклассы MidiDeviceProvider
должен предоставить новый вид устройства, таким образом, разработчик службы должен также создать сопроводительный class для возвращаемого устройства — как мы видели с MixerProvider
в javax.sound.sampled.spi
пакет. Там, class возвращенного устройства, реализованный javax.sound.sampled.Mixer
интерфейс; здесь это реализует javax.sound.midi.MidiDevice
интерфейс. Это могло бы также реализовать подынтерфейс MidiDevice
, такой как Synthesizer
или Sequencer
.
Поскольку единственный подкласс MidiDeviceProvider
может обеспечить больше чем один тип MidiDevice
, getDeviceInfo
метод class возвращает массив MidiDevice.Info
объекты, перечисляющие различное MidiDevices
доступный:
abstract MidiDevice.Info[] getDeviceInfo()
Возвращенный массив может содержать единственный элемент, конечно. Типичная реализация провайдера могла бы инициализировать массив в своем конструкторе и возвратить его сюда. Это позволяет MidiSystem
выполнить итерации по всем установленным MidiDeviceProviders
создать список всех установленных устройств. MidiSystem
может тогда возвратить этот список (MidiDevice.Info[]
массив) к прикладной программе.
MidiDeviceProvider
также включает конкретный метод запроса:
boolean isDeviceSupported(MidiDevice.Info info)Этот метод разрешает системе запрашивать провайдера об определенном виде устройства. Обычно, Вы не должны переопределить этот метод удобства. Реализация по умолчанию выполняет итерации по массиву, возвращенному getDeviceInfo, и сравнивает параметр каждому элементу.
Третье и заключительное MidiDeviceProvider
метод возвращает требуемое устройство:
abstract MidiDevice getDevice(MidiDevice.Info info)Этот метод должен сначала протестировать параметр, чтобы удостовериться, что это описывает устройство, которое может предоставить этот провайдер. Если это не делает, это должно бросить
IllegalArgumentException
. Иначе, это возвращает устройство.
A SoundBank
ряд Instruments
это может быть загружено в a Synthesizer
. Instrument
реализация алгоритма синтеза звука, который производит определенный вид звука, и включает сопроводительное имя и информационные строки. A SoundBank
примерно соответствует банку в спецификации MIDI, но это - более обширный и адресуемый набор; это может, возможно, лучше считаться набором банков MIDI. (Для большего количества вводной информации о SoundBanks
и Synthesizers
, см. Главу 12, "Синтезируя Звук.")
SoundbankReader
состоит из единственного перегруженного метода, который система вызывает, чтобы считать a Soundbank
объект от soundbank файла:
abstract Soundbank getSoundbank(java.io.File file) abstract Soundbank getSoundbank(java.io.InputStream stream) abstract Soundbank getSoundbank(java.net.URL url)
Конкретные подклассы SoundbankReader
будет работать в тандеме с определенными определенными с помощью провайдера реализациями SoundBank
, Instrument
, и Synthesizer
позволить системе загружать a SoundBank
от файла в экземпляр детали Synthesizer
class. Методы синтеза могут отличаться дико от одного Synthesizer
другому, и, как следствие, данным, хранившим в Instrument
или SoundBank
обеспечение управления или данных спецификации для процесса синтеза a Synthesizer
может взять множество форм. Один метод синтеза может потребовать только нескольких байтов данных параметра; другой может быть основан на обширных звуковых выборках. Ресурсы, существующие в a SoundBank
будет зависеть от природы Synthesizer
в который они загружаются, и поэтому реализация getSoundbank
метод a SoundbankReader
у подкласса есть доступ к знанию детали отчасти SoundBank
. Кроме того, определенный подкласс SoundbankReader
понимает определенный формат файла для того, чтобы сохранить SoundBank
данные. Тот формат файла может быть специфичным для поставщика и собственным.
SoundBank
только интерфейс, с только слабыми ограничениями на содержание a SoundBank
объект. Методы объект должны поддерживать, чтобы реализовать этот интерфейс (getResources
, getInstruments
, getVendor
, getName
, и т.д.), налагают свободные требования к данным, чтобы объект содержал. Например, getResources
и getInstruments
может возвратить пустые массивы. Фактическое содержание разделенного на подклассы SoundBank
объект, в особенности его инструменты и его неинструментальные ресурсы, определяется поставщиком услуг. Таким образом механизм парсинга soundbank файла зависит полностью от спецификации того определенного вида soundbank файла.
Файлы Soundbank создаются вне API Звука Java, обычно поставщиком синтезатора, который может загрузить такой soundbank. Некоторые поставщики могли бы предоставить инструменты конечного пользователя для того, чтобы создать такие файлы.