Spec-Zone .ru
спецификации, руководства, описания, API
|
API Звука Java проявляет гибкий подход к конфигурации системы. Различные виды аудиоустройств (микшеры) могут быть установлены на компьютере. API делает немного предположений о том, какие устройства были установлены и каковы их возможности. Вместо этого это обеспечивает пути к системе, чтобы сообщить о доступных аудио компонентах, и путях к Вашей программе получать доступ к ним.
Следующие разделы показывают, как Ваша программа может изучить, какие ресурсы выбранного аудио были установлены на компьютере, и как это может получить доступ к доступным ресурсам. Между прочим ресурсы включают микшеры и различные типы строк, принадлежавших микшерам.
AudioSystem
class действует как расчётная палата для аудио компонентов, включая встроенные службы и отдельно установленные службы от сторонних провайдеров. AudioSystem
служит точкой входа прикладной программы для того, чтобы получить доступ к этим установленным ресурсам выбранного аудио. Можно запросить AudioSystem
чтобы учиться, что сортирует ресурсов, были установлены, и затем можно получить доступ к ним. Например, прикладная программа могла бы начаться, спрашивая AudioSystem
class, есть ли микшер, у которого есть определенная конфигурация, такая как одна из конфигураций ввода или вывода, иллюстрированных ранее в обсуждении строк. От микшера программа тогда получила бы строки данных и так далее.
Вот некоторые из ресурсов, которые прикладная программа может получить из AudioSystem
:
AudioSystem
class обеспечивает список всех установленных микшеров.AudioSystem
, не имея дело явно с микшерами.AudioSystem
class обеспечивает методы для того, чтобы они преобразовали между аудиофайлами и аудиопотоками. Это может также сообщить о формате файла звукового файла и может записать файлы в различных форматах. Несколько классов в 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
объекты, возвращенные getMixerInfo
, получите микшер для каждого, вызывая getMixer
, и запросите каждый микшер для его возможностей. Например, Вам, возможно, понадобился бы микшер, который может записать его смешанные аудиоданные в определенное число целевых строк данных одновременно. В этом случае Вы запросили бы каждый микшер, используя это Mixer
метод:
int getMaxLines(Line.Info info)
Здесь, Line.Info
TargetDataLine
. Line.Info
class обсуждается в следующем разделе.
Есть два способа получить строку:
AudioSystem
AudioSystem
объект Давайте предполагать, что Вы не получили микшер, и Ваша программа является простой, которая действительно только нуждается в определенном виде строки; детали микшера не имеют значения для Вас. Можно использовать AudioSystem
метод:
static Line getLine(Line.Info info)
который походит getMixer
метод, обсужденный ранее. В отличие от этого Mixer.Info
Line.Info
Line.Info
абстрактный class, таким образом, Вы используете один из его подклассов ( 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
SourceDataLine
или a Clip
, только замена тот class для TargetDataLine
как class переменной строки, и также в первом параметре DataLine.Info
конструктор.
Для a Port
, можно использовать статические экземпляры Port.Info
, в коде как следующее:
if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)) { try { line = (Port) AudioSystem.getLine( Port.Info.MICROPHONE); } }
Отметьте использование метода isLineSupported
видеть, есть ли у микшера даже строка требуемого типа.
Вспомните, что исходная строка является вводом к mixerâ а именно, 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
метод. Открытие порта означает, что Вы поворачиваете его onâ то есть, Вы позволяете звуку входить или порт. Точно так же можно закрыть порты, что Вы не хотите, чтобы звук переместился через, потому что некоторые порты могли бы уже быть открытыми прежде, чем Вы даже получите их. Некоторые платформы оставляют все порты на по умолчанию; или пользователь или системный администратор, возможно, выбрали определенные порты, чтобы идти или прочь, используя другую прикладную программу или программное обеспечение операционной системы.
Предупреждение: Если Вы хотите выбрать определенный порт и удостовериться, что звук фактически входит или порт, можно открыть порт как описано. Однако, это можно считать враждебным к пользователю поведением! Например, пользователю можно было бы выключить порт динамика, чтобы не нарушить ее коллеги. Она была бы довольно расстроена, если бы Ваша программа внезапно переопределяла ее пожелания и начинала протрубить музыку. Как другой пример, пользователь мог бы хотеть быть уверенным, что микрофон его компьютера никогда не включается без его знания, чтобы избежать подслушивать. Вообще, рекомендуется не открыть или закрыть порты, если Ваша программа не отвечает на намерения пользователя, как выражено через пользовательский интерфейс. Вместо этого уважайте настройки, которые уже выбрали пользователь или операционная система.
Не необходимо открыться, или закрыть порт прежде, чем микшер, к которому это присоединено, будет функционировать правильно. Например, можно начать воспроизводить звук в микшер аудиовыхода, даже при том, что все его выходные порты закрываются. Данные все еще текут в микшер; воспроизведение не блокируется. Пользователь только ничего не будет слышать. Как только пользователь открывает выходной порт, звук будет слышимым через тот порт, запускающийся в любой точке в носителях, которых уже достигло воспроизведение.
Кроме того, Вы не должны получить доступ к портам, чтобы учиться, есть ли у микшера определенные порты. Чтобы учиться, является ли микшер фактически микшером аудиовыхода, например, можно вызвать getTargetLineInfo
видеть, вывело ли это порты. Нет никакой причины получить доступ к портам непосредственно, если Вы не хотите изменить их настройки (такие как их состояние открывать-или-закрываться, или настройки любых средств управления, они могли бы иметь).
API Звука Java включает AudioPermission
Вообще, апплеты выполняются под наблюдением менеджера безопасности и не разрешаются записать звук. Приложения, с другой стороны, автоматически не устанавливают менеджера безопасности, и в состоянии записать звук. (Однако, если менеджер безопасности значения по умолчанию вызывается явно для приложения, приложению не разрешают записать звук.)
И апплеты и приложения могут записать звук, работая с менеджером безопасности, если им предоставили явное разрешение, чтобы сделать так.
Если у Вашей программы не будет разрешения, чтобы записать (или игра) звук, то исключение будет выдано, когда это попытается открыть строку. Нет ничего, что можно сделать об этом в Вашей программе, кроме поймать исключение и сообщить о проблеме пользователю, потому что полномочия не могут быть изменены через API. (Если бы они могли, они быть бессмысленными, потому что ничто не было бы безопасно!) Обычно, полномочия устанавливаются в одном или более конфигурационных файлах политики, которые пользователь или системный администратор могут отредактировать использование текстового редактора или программы Средства осуществления политики.