Spec-Zone .ru
спецификации, руководства, описания, API
|
Примечания
|
API Звука Java проявляет гибкий подход к конфигурации системы. Различные виды аудио устройств (микшеры) могут быть установлены на компьютере. API делает немного предположений о том, какие устройства были установлены и каковы их возможности. Вместо этого это обеспечивает пути к системе, чтобы сообщить о доступных аудио компонентах, и путях к Вашей программе получать доступ к ним.
Этот раздел показывает, как Ваша программа может изучить, какие ресурсы выбранного аудио были установлены на компьютере, и как это может получить доступ к доступным ресурсам. Между прочим ресурсы включают микшеры и различные типы строк, принадлежавших микшерам.
AudioSystem
класс действует как расчётная палата для аудио компонентов, включая встроенные службы и отдельно установленные службы от сторонних провайдеров. AudioSystem
служит точкой входа прикладной программы для того, чтобы получить доступ к этим установленным ресурсам выбранного аудио. Можно запросить AudioSystem
чтобы учиться, что сортирует ресурсов, были установлены, и затем можно получить доступ к ним. Например, прикладная программа могла бы начаться, спрашивая AudioSystem
класс, есть ли микшер, у которого есть определенная конфигурация, такая как одна из входных или выходных конфигураций, иллюстрированных ранее в обсуждении строк. От микшера программа тогда получила бы строки данных и так далее.
Вот некоторые из ресурсов, которые прикладная программа может получить из AudioSystem
:
AudioSystem
класс обеспечивает список всех установленных микшеров. AudioSystem
, не имея дело явно с микшерами. AudioSystem
класс обеспечивает методы для того, чтобы они преобразовали между аудиофайлами и аудиопотоками. Это может также сообщить о формате файла звукового файла и может записать файлы в различных форматах. Эти средства обсуждаются в Главе 7, "Используя Преобразователи Формата и Файлы." Несколько классов в API Звука Java обеспечивают полезную информацию о связанных интерфейсах. Например, Mixer.Info
обеспечивает детали об установленном микшере, такие как поставщик микшера, имя, описание, и версия. Line.Info
получает класс определенной строки. Подклассы Line.Info
включать Port.Info
и DataLine.Info
, которые получают детали, относящиеся к определенному порту и строке данных, соответственно. Каждый из этих классов описывается далее в соответствующем разделе ниже. Важно не перепутать Info
объект с микшером или строкой возражает, что это описывает.
Обычно, одна из первых вещей, которые должна сделать программа, которая использует API Звука Java, состоит в том, чтобы получить микшер, или по крайней мере одну строку микшера, так, чтобы можно было стать звуковыми в или из компьютера. Вашей программе, возможно, понадобился бы определенный вид микшера, или Вы могли бы хотеть вывести на экран список всех доступных микшеров так, чтобы пользователь мог выбрать тот. В любом случае Вы должны изучить, какие виды микшеров устанавливаются. AudioSystem
обеспечивает следующий метод:
static Mixer.Info[] getMixerInfo()Каждый
Mixer.Info
объект, возвращенный этим методом, идентифицирует один тип микшера, который устанавливается. (Обычно у системы есть самое большее один микшер данного типа. Если, оказывается, есть больше чем один из данного типа, у возвращенного массива все еще только есть тот Mixer.Info
для того типа.) Прикладная программа может выполнить итерации по Mixer.Info
объекты найти соответствующий, согласно его потребностям. Mixer.Info
включает следующие строки, чтобы идентифицировать вид микшера: Они - произвольные строки, таким образом, прикладная программа, которая нуждается в определенном микшере, должна знать, что ожидать и что сравнить строки с. Компания, которая обеспечивает микшер, должна включать эту информацию в свою документацию. Альтернативно, и возможно более обычно, прикладная программа выведет на экран весь Mixer.Info
строки объектов пользователю и позволяют пользователю выбирать соответствующий микшер. Как только соответствующий микшер находится, прикладная программа вызывает следующий AudioSystem
метод, чтобы получить требуемый микшер:
static Mixer getMixer(Mixer.Info info)Что, если Ваша программа нуждается в микшере, у которого есть определенные возможности, но это не нуждается в определенном микшере, сделанном определенным поставщиком? И что, если невозможно зависеть от знания пользователя, какой микшер должен быть выбран? В этом случае, информация в
Mixer.Info
объекты не будут иметь большого количества применения. Вместо этого можно выполнить итерации по весь Mixer.Info
объекты, возвращенные, добираютсяMixerInfo
, получите микшер для каждого, вызывая getMixer
, и запросите каждый микшер для его возможностей. Например, Вам, возможно, понадобился бы микшер, который может записать его смешанные аудиоданные в определенное число целевых строк данных одновременно. В этом случае Вы запросили бы каждый микшер, используя этот метод Mixer: int
getMaxLines(Line.Info info)
Здесь, Line.Info
определил бы a TargetDataLine
. Line.Info
класс обсуждается в следующем разделе.
Есть два способа получить строку:
AudioSystem
объект AudioSystem
объект (см. "Получение Микшера," в этой главе), Давайте предполагать, что Вы не получили микшер, и Ваша программа является простой, которая действительно только нуждается в определенном виде строки; детали микшера не имеют значения для Вас. Можно использовать AudioSystem
метод:
static Line getLine(Line.Info info)который походит
getMixer
метод, обсужденный выше. В отличие от этого Mixer.Info
, Line.Info
используемый, поскольку параметр не хранит текстовую информацию, чтобы определить требуемую строку. Вместо этого это хранит информацию о классе требуемой строки. Line.Info
абстрактный класс, таким образом, Вы используете один из его подклассов (Port.Info
или DataLine.Info
) получить строку. Следующая выборка кода использует DataLine.Info
подкласс, чтобы получить и открыть целевую строку данных:
TargetDataLine line; DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object if (!AudioSystem.isLineSupported(info)) { // Handle the error. } // Obtain and open the line. try { line = (TargetDataLine) AudioSystem.getLine(info); line.open(format); } catch (LineUnavailableException ex) { // Handle the error. //... }Этот код получает a
TargetDataLine
объект, не определяя атрибутов кроме его класса и его аудиоформата. Можно использовать аналогичный код, чтобы получить другие виды строк. Для a SourceDataLine
или a Clip
, только замена тот класс для TargetDataLine
как класс переменной строки, и также в первом параметре DataLine.Info
конструктор. Для a Port
, можно использовать статические экземпляры Port.Info
, в коде как следующее:
if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)) { try { line = (Port) AudioSystem.getLine( Port.Info.MICROPHONE); } }Отметьте использование метода
isLineSupported
видеть, есть ли у микшера даже строка требуемого типа. Вспомните, что исходная строка является вводом к микшеру — а именно, a Port
возразите, представляет ли микшер устройство звукового входа, и a SourceDataLine
или Clip
возразите, представляет ли микшер устройство звукового выхода. Точно так же целевая строка является выводом микшера: a Port
объект для микшера звукового выхода, и a TargetDataLine
объект для микшера звукового входа. Что, если микшер не соединяется ни с каким внешним аппаратным устройством вообще? Например, рассмотрите внутренний или микшер только для программного обеспечения, который получает аудио из прикладной программы и поставляет ее смешанное аудио назад программе. Этот вид микшера имеет SourceDataLine
или Clip
объекты для его входных строк и TargetDataLine
объекты для его выходных строк.
Можно также использовать следующий AudioSystem
методы, чтобы узнать больше об исходных и целевых строках указанного типа, которые поддерживаются любым установленным микшером:
static Line.Info[] getSourceLineInfo(Line.Info info) static Line.Info[] getTargetLineInfo(Line.Info info)Отметьте, что массив, возвращенный каждым из этих методов, указывает на уникальные типы строк, не обязательно всех строк. Например, если две из строк микшера, или двух строк различных микшеров, имеют идентичный
Line.Info
объекты, эти две строки будут представленный только одним Line.Info
в возвращенном массиве.
Mixer
интерфейс включает изменения на AudioSystem
методы доступа для исходных и целевых строк, описанных выше. Они Mixer
методы включают, которые берут Line.Info
параметры, так же, как AudioSystem's
методы делают. Однако, Mixer
также включает эти разновидности, которые не берут параметров:
Эти методы возвращают массивы весьLine.Info[] getSourceLineInfo()
Line.Info[] getTargetLineInfo()
Line.Info
объекты для определенного микшера. Как только Вы получили массивы, можно выполнить итерации по ним, вызывая Mixer's
getLine
метод, чтобы получить каждую строку, сопровождаемую Line's
open
метод, чтобы зарезервировать использование каждой строки для Вашей программы.
Предыдущий раздел, относительно того, как получить строку требуемого типа, применяется к портам так же как другим типам строк. Можно получить весь источник (то есть, ввести) и цель (то есть, выведите), порты, передавая a Port.Info
возразите против AudioSystem
(или Mixer
) методы getSourceLineInfo
и getTargetLineInfo
то взятие a Line.Info
параметр. Вы тогда выполняете итерации по возвращенному массиву объектов и вызываете Микшер getLine
метод, чтобы получить каждый порт.
Можно тогда открыть каждого Port
вызывая Line's
open
метод. Открытие порта означает, что Вы включаете его — то есть, Вы позволяете звуку входить или порт. Точно так же можно закрыть порты, что Вы не хотите, чтобы звук переместился через, потому что некоторые порты могли бы уже быть открытыми прежде, чем Вы даже получите их. Некоторые платформы оставляют все порты на по умолчанию; или пользователь или системный администратор, возможно, выбрали определенные порты, чтобы идти или прочь, используя другую прикладную программу или программное обеспечение операционной системы.
Предупреждение: Если Вы хотите выбрать определенный порт и удостовериться, что звук фактически входит или порт, можно открыть порт как описано. Однако, это можно считать враждебным к пользователю поведением! Например, пользователю можно было бы выключить порт динамика, чтобы не нарушить ее коллеги. Она была бы довольно расстроена, если бы Ваша программа внезапно переопределяла ее пожелания и начинала протрубить музыку. Как другой пример, пользователь мог бы хотеть быть уверенным, что микрофон его компьютера никогда не включается без его знания, чтобы избежать подслушивать. Вообще, рекомендуется не открыть или закрыть порты, если Ваша программа не отвечает на намерения пользователя, как выражено через пользовательский интерфейс. Вместо этого уважайте настройки, которые уже выбрали пользователь или операционная система.
Не необходимо открыться, или закрыть порт прежде, чем микшер, к которому это присоединено, будет функционировать правильно. Например, можно начать воспроизводить звук в микшер звукового выхода, даже при том, что все его выходные порты закрываются. Данные все еще текут в микшер; воспроизведение не блокируется. Пользователь только ничего не будет слышать. Как только пользователь открывает выходной порт, звук будет слышимым через тот порт, запускающийся в любой точке в носителях, которых уже достигло воспроизведение.
Кроме того, Вы не должны получить доступ к портам, чтобы учиться, есть ли у микшера определенные порты. Чтобы учиться, является ли микшер фактически микшером звукового выхода, например, можно вызвать getTargetLineInfo
видеть, вывело ли это порты. Нет никакой причины получить доступ к портам непосредственно, если Вы не хотите изменить их настройки (такие как их состояние открывать-или-закрываться, или настройки любых средств управления, они могли бы иметь).
API Звука Java включает AudioPermission
класс, который указывает на то, что виды доступа апплет (или приложение, работающее с менеджером безопасности), могут иметь к выбранной аудиосистеме. Разрешением, чтобы записать звук управляют отдельно. Это разрешение нужно предоставить с заботой, помочь предотвратить угрозы безопасности, такие как несанкционированное подслушивание. По умолчанию апплетам и приложениям предоставляют полномочия следующим образом:
И апплеты и приложения могут записать звук, работая с менеджером безопасности, если им предоставили явное разрешение, чтобы сделать так.
Если у Вашей программы не будет разрешения, чтобы записать (или игра) звук, то исключение будет выдано, когда это попытается открыть строку. Нет ничего, что можно сделать об этом в Вашей программе, кроме поймать исключение и сообщить о проблеме пользователю, потому что полномочия не могут быть изменены через API. (Если бы они могли, они быть бессмысленными, потому что ничто не было бы безопасно!) Обычно, полномочия устанавливаются в одном или более конфигурационных файлах политики, которые пользователь или системный администратор могут отредактировать использование текстового редактора или программы Средства осуществления политики.
Для получения дополнительной информации по безопасности и полномочиям, см. "Архитектуру безопасности" и "Полномочия Политики" в Руководстве по обеспечению безопасности и специализированном следе на безопасности в