Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Звуковой Краткий обзор Архитектуры

Цели проекта

API Звука Java является низкоуровневым API для осуществления и управления вводом и выводом аудио носителей. Это обеспечивает явное управление возможностями, обычно требуемыми для аудиовхода и вывода в платформе, которая способствует расширяемости и гибкости.

Поскольку звук является так основным принципом, Звук Java выполняет потребности широкого диапазона клиентов. Области возможного применения включают:

Звук Java позволяет приложениям расширить аудио поддержку с помощью специализированных возможностей, и интегрирует хорошо с архитектурой, которая обеспечивает высокоуровневые интерфейсы и интеграцию с другими типами носителей.

Звук Java обеспечивает самый низкий уровень аудио поддержки на платформе Java. Это обеспечивает высокую степень управления аудио-специфичной функциональностью. Например, это обеспечивает механизмы для того, чтобы они установили, получили доступ, и управляли системными ресурсами, такими как цифровое аудио и MIDI (Цифровой интерфейс музыкальных инструментов) устройства. Это не включает сложные звуковые редакторы и инструменты GUI; скорее это обеспечивает ряд возможностей, на которые могут быть созданы такие приложения. Это подчеркивает низкоуровневое управление, кроме того обычно ожидаемое конечным пользователем, кто извлекает выгоду из высокоуровневых интерфейсов, созданных сверху Звука Java.

Отметьте: Всюду по этому документу слово "приложение" обращается в общем к апплетам Java так же как приложениям Java.

 

Пакеты

API Звука Java включает поддержку и цифрового аудио и данных MIDI. Эти два главных модуля функциональности обеспечиваются в отдельных пакетах:

javax.sound.sampled
Этот пакет определяет интерфейсы для получения, смешивания, и воспроизведения цифрового (выбранного) аудио.

javax.sound.midi
Этот пакет обеспечивает интерфейсы для синтеза MIDI, упорядочивания, и транспорта события.

Два других пакета разрешают поставщикам услуг (в противоположность разработчикам приложений) создавать пользовательские компоненты, которые могут быть установлены на системе:

javax.sound.sampled.spi
javax.sound.midi.spi

Следующий раздел этого документа обсуждает выбранную аудиосистему, включая краткий обзор API javax.sound.sampled. Заключительный раздел покрывает систему MIDI и API javax.sound.midi.

 

Выбранное Аудио

Пакет javax.sound.sampled обрабатывает данные цифрового аудио, также называемые выбранным аудио. ("Выборки" обращаются к последовательным снимкам сигнала, который в случае цифрового аудио является звуковой волной. Например, аудио, записанное для хранения на компакт-дисках, выбирается 44100 раз в секунду. Как правило, выбранное аудио прибывает из звукозаписи, но звук мог вместо этого быть искусственно сгенерирован. Термин "выбранное аудио" относится к типу данных, не его источнику. Выбранное аудио может считаться звуком непосредственно, тогда как данные MIDI могут считаться рецептом для создания музыкального звука.)

Звук Java не принимает определенную аудио аппаратную конфигурацию; это разрабатывается, чтобы позволить различным видам аудио компонентов быть установленными на системе и полученными доступ API. Звук Java поддерживает общую функциональность, такую как ввод и вывод от звуковой карты (например для записи и воспроизведения звуковых файлов) так же как смешивание многократных потоков аудио. Вот один пример типичной аудио архитектуры, для которой мог бы использоваться Звук Java:

Логика вытекает из устройства ввода данных к микшеру программного обеспечения и finaly к устройству вывода. У каждого устройства есть различные порты ввода и вывода.

Типичная Аудио Архитектура

В этом примере у устройства, такого как звуковая карта есть различные порты ввода и вывода, и смешивание обеспечивается в программном обеспечении. Синтезатор MIDI, показанный как один из mixer⠀™ s аудиовходы, мог бы также быть функцией звуковой карты, или это могло бы быть реализовано в программном обеспечении. (Пакет javax.sound.midi, обсужденный позже, предоставляет интерфейс Java для синтезаторов.)

Главные понятия, используемые в пакете javax.sound.sampled, описываются в разделах ниже.


Строки

Строка является элементом цифрового аудио "конвейер", такой как аудиовход или выходной порт, микшер, или путь аудиоданных в или из микшера. Аудиоданные, текущие через строку, могут быть моно или многоканальными (например, стерео). Каждый тип строки будет описан коротко, но сначала некоторые из их функциональных отношений будут иллюстрированы, показывая поток аудио через "конвейер". Следующая схема показывает различные типы строк в простой системе аудиовыхода:

Следующий контекст описывает эту графику.

Возможная Конфигурация Строк для Аудиовыхода

В этом примере приложение попросило у микшера одного или более доступные клипы и строки исходных данных. Клип является вводом микшера, в который можно загрузить аудиоданные до воспроизведения; строка исходных данных является вводом микшера, который принимает поток в реальном времени аудиоданных. Приложение предварительно загружает аудиоданные от звукового файла в клипы, и затем продвигает другие аудиоданные в строки исходных данных. Микшер читает данные из этих строк, у каждой из которых могут быть своя собственная реверберация, усиление, и средства управления панорамированием, и использует настройки реверберации, чтобы смешать "сухие" аудиосигналы с отраженным ("влажным") соединением. Микшер поставляет свой окончательный результат один или более выходные порты, такие как динамик, гнездо для наушников, и разъем строки.

Хотя различные строки изображаются как отдельные прямоугольники в схеме, они все "принадлежат" микшеру, и могут считаться неотъемлемыми частями микшера. Реверберация, усиление, и прямоугольники панорамирования представляют средства управления обработкой (а не строки), который может быть применен микшером к данным, текущим через строки. (Отметьте, что это - только один пример возможной аудиосистемы, которая поддерживается API. Не у всех аудио конфигураций будут все функции иллюстрированными. Отдельная строка исходных данных не могла бы поддерживать панорамирование, микшер не мог бы реализовать реверберацию и так далее.)

Простая система аудиовхода могла бы быть подобной:

Следующий контекст описывает эту графику.

Возможная Конфигурация Строк для Аудиовхода

Здесь, потоки данных в к микшеру от один или более входные порты, обычно микрофон или строка - в разъеме. Усиление и панорамирование применяются, и микшер поставляет полученные данные приложению через целевую строку данных микшера. Целевая строка данных является выводом микшера, содержа смесь переданных потоком входных звуков. У самого простого микшера есть только одна целевая строка данных, но некоторые микшеры могут поставить полученные данные многократным целевым строкам данных одновременно.

Различные типы строки будут теперь исследованы более близко. Несколько типов строки определяются подынтерфейсами основного Line интерфейс. Иерархию интерфейса показывают ниже.

См. длинное описание[D]

Иерархия Линейного интерфейса

Основной интерфейс, Line, описывает минимальную функциональность, характерную для всех строк:

Ports простые строки для ввода или вывода аудио к или от аудиоустройств. Port у интерфейса есть внутренний class, Port.Info, это определяет тип порта. Некоторые общие типы являются микрофоном, вводом строки, дисководом для компакт-дисков, динамиком, наушником, и выводом строки.

Mixer интерфейс представляет аппаратные средства или устройство программного обеспечения, которое имеет один или более входные строки и один или более выходные строки. Это определение означает, что микшер не должен фактически смешать данные; у этого могло бы быть только единственный ввод. Mixer API предназначается, чтобы охватить множество устройств, но типичный случай поддерживает смешивание.

Mixer интерфейс обеспечивает методы для того, чтобы они получили строки микшера. Они могут включать целевые строки данных, из которых приложение может считать полученные аудиоданные, строки исходных данных, в которые приложение может записать аудиоданные для воспроизведения (рендеринг), и клипы, в которых приложение может предварительно загрузить звуковые данные для воспроизведения. Микшер может заблокировать эти ресурсы. Например, если у микшера будет только одна целевая строка данных, и это уже находится в использовании, то попытка приложения, чтобы получить целевую строку данных заставит исключение быть брошенным.

Можно запросить микшер для строк различных типов, передавая соответствующий тип Line.Info. Можно также спросить микшер, сколько строк определенного типа он поддерживает.

Микшер поддерживает текстовую информацию о своем определенном устройстве, вводят внутренний вызванный class Mixer.Info. Эта информация включает имя продукта, версию, и поставщика, наряду с текстовым описанием.

Заметьте что обобщение Line интерфейс не обеспечивает средство запустить и остановить воспроизведение или запись. Для этого Вы нуждаетесь в строке данных. DataLine взаимодействуйте через интерфейс предоставляет следующие дополнительные связанные с носителями функции вне таковых a Line:

Приложение может получить строку данных из микшера. Если строка данных не может быть выделена из-за ограничений ресурса (например, если микшер поддерживает только одну целевую строку данных, и это уже находится в использовании), исключение выдается.

A TargetDataLine получает аудиоданные от микшера. Обычно, микшер получил аудиоданные от порта, такого как микрофон; это могло бы обработать или смешать это полученное аудио прежде, чем поместить данные в целевой буфер строки данных. TargetDataLine интерфейс обеспечивает методы для того, чтобы они считали данные из целевого буфера строки данных и для того, чтобы определить, сколько данных в настоящий момент доступно для чтения. Если приложение пытается считать больше данных, чем доступно, блоки метода чтения, пока требуемый объем данных не доступен. Это применяется, даже если объем данных, который требуют, больше чем размер буфера строки. Возвраты метода чтения, если строка закрывается, приостановились, или сбросили.

Приложения, записывающие аудио, должны считать данные из целевой строки данных достаточно быстро, чтобы избежать переполнения буфера, который приводит к разрывам в полученных данных. Если буфер действительно переполняется, самые старые данные с очередями отбрасываются и заменяются новыми данными.

A SourceDataLine получает аудиоданные для воспроизведения. Это обеспечивает методы для того, чтобы они записали данные в буфер строки исходных данных для воспроизведения, и для того, чтобы определить, сколько данных строка готовится получить без блокирования. Если приложение пытается записать больше данных, чем доступно, блоки метода чтения, пока требуемый объем данных не может быть записан. Это применяется, даже если объем данных, который требуют, больше чем размер буфера строки. Метод записи также возвращается, если строка закрывается, приостанавливается, или сбрасывается.

Приложения играя аудио должны записать данные в строку исходных данных достаточно быстро, чтобы избежать потери значимости (освобождение) от буфера, который может привести к разрывам в воспроизведении аудио. Если воспроизведение аудио останавливается должный потерять значимость, a STOP событие сгенерировано. A START событие сгенерировано, когда представление возобновляется.

A Clip строка данных, в которую аудиоданные могут быть загружены до воспроизведения. Поскольку данные предварительно загружаются, а не передаются потоком, clip⠀™ s продолжительность известен перед воспроизведением, и можно выбрать любую стартовую позицию в носителях. Клипы могут быть циклично выполнены, означая, что на воспроизведение, все данные между двумя указанными точками цикла повторят конкретное количество времен, или неопределенно.

A GroupLine синхронизируемая группа строк данных. Если микшер поддерживает групповые строки, можно определить, какие строки данных должны быть обработаны как группа. Затем можно запустить, остановиться, или закрыть все те строки данных, отправляя единственное сообщение группе, вместо того, чтобы иметь необходимость управлять каждой строкой индивидуально.

Средства управления

У строк данных и портов часто есть ряд средств управления, которые влияют на аудиосигнал, проходящий через строку. Путь, которым влияют на сигнал, зависит от типа управления. API Звука Java определяет следующие подклассы Control:

Программно, Вы получаете определенный объект управления от строки до ссылки на control⠀™ s class. Можно также получить массив всех средств управления для той строки.


AudioSystem

AudioSystem class служит точкой входа приложения для того, чтобы получить доступ к установленным ресурсам выбранного аудио. Можно запросить AudioSystem, чтобы изучить то, что сортирует аудио компонентов, были установлены, и затем можно получить доступ к ним. Например, приложение могло бы начаться, спрашивая AudioSystem class, есть ли микшер, у которого есть определенная конфигурация, такая как одна из конфигураций ввода или вывода, иллюстрированных ранее в обсуждении строк. От микшера приложение тогда получило бы строки данных и так далее.

Вот некоторые из ресурсов, которые приложение может получить из AudioSystem:



Конфигурация системы (классы SPI)

Интерфейсы поставщика услуг для выбранной аудиосистемы определяются в javax.sound.sampled.spi пакет. Поставщики услуг могут расширить классы, определенные здесь так, чтобы их собственные аудиоустройства, синтаксические анализаторы звукового файла и писатели, и отформатировали преобразователи, может быть установлен и сделан доступный реализацией Звука Java.



MIDI

Интерфейсы, описывающие транспорт события MIDI, синтез, и упорядочивание, определяются в javax.sound.midi пакет. Главные понятия, используемые в пакете, описываются в разделах ниже.


Функциональный Краткий обзор

Схема ниже иллюстрирует функциональные отношения между главными компонентами в типичной конфигурации MIDI Звука Java. (Звук Java разрешает множеству устройств быть установленным и соединенным. Система, показанная здесь, является только одним возможным сценарием.) Поток данных между компонентами обозначается стрелками. Данные могут быть в стандартном формате файла, или (как обозначено ключом в правом нижнем углу схемы), это могут быть аудио, необработанные байты MIDI, или Звук Java MidiEvent объекты.

Следующий контекст описывает эту графику

Типичная Конфигурация MIDI

В этом примере приложение готовит музыкальное представление, загружая музыкальный счет, который сохранен как Стандартный Файл MIDI на диске (левый нижний угол схемы). Стандартные файлы MIDI содержат дорожки, каждая из которых является списком привязанных ко времени событий MIDI. Этот файл MIDI читается в a Sequence объект, структура данных которого отражает файл. A Sequence содержит ряд Track объекты, каждый из которых содержит ряд MidiEvent объекты. Sequence тогда "выполняется" a Sequencer. A Sequencer выполняет его музыку, передаваясь MidiEvents к некоторому другому устройству, такому как внутренний или внешний синтезатор.

Как иллюстрировано, MidiEvents должен быть преобразован в необработанный (непривязанный ко времени) MIDI прежде, чем быть отправленным через выходной порт MIDI к внешнему синтезатору. Это преобразование выполняется УСТРОЙСТВО ВЫВОДА MIDI, названное a StreamGenerator. Точно так же необработанные данные MIDI, входя в компьютер из внешнего источника MIDI преобразовываются в MidiEvents a StreamParser.

Внутренний синтезатор (прямоугольник отмеченный "Синтезатор" в схеме) принимает MidiEvents непосредственно от Sequencer или StreamParser. Это анализирует каждое событие и обычно диспетчеризирует соответствующую команду (такой как noteOn) к одному из MidiChannel объекты, согласно номеру канала MIDI, определенному в конечном счете. (Спецификация MIDI призывает к 16 каналам MIDI, таким образом, a Synthesizer обычно имеет 16 MidiChannel объекты.)

MidiChannel использует информацию о примечании в этих сообщениях, чтобы синтезировать музыку. Например, a noteOn сообщение определяет подачу примечания и "скорость" (объем). Однако, информация о примечании недостаточна; синтезатор также требует точных инструкций по тому, как создать аудиосигнал для каждого примечания. Эти инструкции представляются Instrument. Каждый Instrument обычно эмулирует различный реальный музыкальный инструмент или звуковой эффект. Instruments мог бы стать предварительными установками с синтезатором, или они могли бы быть загружены из soundbank файлов. В синтезаторе, Instruments располагаются числом банка (строки в схеме) и числом программы (столбцы). Instrument может использовать сохраненное цифровое аудио, включенное как Sample объекты в soundbank. Например, чтобы играть звук трубы, играя 5-секундное длинное примечание, синтезатор мог бы циклично выполниться (цикл) через полувторой отрывок записи трубы.

Теперь, когда компоненты были представлены с функциональной точки зрения, мы возьмем беглый взгляд в API с программируемой точки зрения.


MidiEvent

A MidiEvent объект определяет тип, длину данных, и байт состояния необработанного сообщения MIDI, для которого это служит оберткой. Кроме того, это обеспечивает значение галочки, которое используется устройствами, включенными в синхронизацию MIDI, такими как секвенсеры.

Есть три категории событий, каждый представленный a MidiEvent подкласс:


MidiDevice

Основной интерфейс для устройств MidiDevice. Все устройства обеспечивают методы для того, чтобы они перечислили набор режимов MIDI, которые они поддерживают, и для запросов и установки текущего режима. (Режим является комбинацией режима MIDI Omni и Моно режима / режима Поликристаллического кремния.) Устройства могут быть открыты и закрыты, и они обеспечивают описания себя через a MidiDevice.Info объект.

Следующая схема иллюстрирует MidiDevice иерархия интерфейса. Также изображенный два класса, соединенные пунктирными линиями с MidiDevice интерфейсы они реализуют.

Следующий контекст описывает эту графику

Иерархия MidiDevice

Устройства являются обычно или передатчиками или получателями MidiEvents. Transmitter подынтерфейс MidiDevice включает методы для установки и запросов получателей, к которым передается передатчик MidiEvents. С точки зрения передатчика эти получатели попадают в две категории: MIDI и MIDI Через. Передатчик отправляет события, которые он генерирует самостоятельно к его MIDI получатели. Если передатчик является самостоятельно также получателем, он проводит события, которые он получил откуда-либо к его MIDI Через получатели. Receiver подынтерфейс MidiDevice состоит из единственного метода для того, чтобы получить MidiEvents. Как правило, этот метод вызывается a Transmitter.

Звук Java включает реальные классы для того, чтобы преобразовать между MidiEvent объекты и необработанный поток байтов, используемый в MIDI, соединяют протокол проводом. A StreamGenerator a Receiver это принимает MidiEvent объекты от a Transmitter и выписывает необработанный поток байтов MIDI. Точно так же a StreamParser a Transmitter это принимает необработанный поток байтов MIDI и пишет соответствие MidiEvent объекты к Receiver.


Синтез

A Synthesizer тип MidiDevice это генерирует звук. Synthesizer интерфейс расширяет обоих Receiver и Transmitter. Это обеспечивает методы для того, чтобы они управляли soundbanks и инструментами. Кроме того, это обеспечивает доступ к ряду каналов MIDI, через которые фактически производится звук. A Synthesizer получает MidiEvents и вызывает соответствующий MidiChannel сообщения.

MidiChannels имейте методы, представляющие общие речевые сообщения MIDI, такие как "примечание по", и "управляют изменением." Они также разрешают запросы текущего состояния канала.


Упорядочивание

Как Synthesizer, Sequencer интерфейс расширяет обоих Transmitter и Receiver (и поэтому MidiDevice). Sequencer добавляют методы для основных операций упорядочивания MIDI. Секвенсер может загрузиться и воспроизвести последовательность, запрос и установить темп, и управлять основными и ведомыми синхронизирующими режимами. Приложение может зарегистрироваться, чтобы быть уведомленным, когда секвенсер обрабатывает MetaEvents и события контроллера. (Событие контроллера имеет место, когда MIDI-контроллер, такой как колесо изгиба подачи или ползунок данных, изменяет свое значение. Эти события не MidiEvents, но создаются когда Sequencer встречается бесспорный ShortEvents в Sequence.)

Sequence объект представляет последовательность MIDI как одну или более дорожек и связанную информацию о синхронизации. Дорожка содержит список событий MIDI с меткой времени. Последовательности могут быть считаны из файлов MIDI, или созданы с нуля и отредактированы, добавляя Tracks к Sequence (или удаление их). Точно так же MidiEvents может быть добавлен к или удален из Tracks.

Дорожка содержит список событий MIDI с меткой времени. Последовательности могут быть считаны из файлов MIDI, или созданы с нуля и отредактированы, добавляя Tracks к Sequence (или удаление их). Точно так же MidiEvents может быть добавлен к или удален из Tracks.

Не необходимо загрузить файл MIDI в a Sequence объект прежде, чем играть файл. setSequence(java.io.InputStream) метод Sequencer позволяет Вам читать файл MIDI непосредственно в a Sequencer, не создавая a Sequence объект сначала.


MidiSystem

MidiSystem действия как точка входа приложения к музыкальной системе MIDI. Это предоставляет информацию о, и доступ к, набор установленных устройств, включая передатчики, получатели, синтезаторы, и секвенсеры.

MidiSystem class обеспечивает методы для того, чтобы они считали файлы MIDI, чтобы создать Sequence объекты, и для того, чтобы записать Sequences к файлам MIDI. Файл Типа 0 MIDI содержит только одну дорожку, в то время как файл Типа 1 может содержать любое число. MidiSystem также обеспечивает методы, чтобы создать Soundbank объекты, анализируя soundbank файлы.


Конфигурация системы (интерфейсы SPI)

Конфигурация системы MIDI обрабатывается в javax.sound.midi.spi package. Абстрактные классы в этом пакете позволяют поставщикам услуг предоставлять и устанавливать свои собственные MIDI-устройства, средства чтения файлов MIDI и писателей, и soundbank средства чтения файлов.


Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами