Spec-Zone .ru
спецификации, руководства, описания, API
След: Звук
Доступ к Ресурсам Аудиосистемы
Домашняя страница > Звук

Доступ к Ресурсам Аудиосистемы

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

Следующие разделы показывают, как Ваша программа может изучить, какие ресурсы выбранного аудио были установлены на компьютере, и как это может получить доступ к доступным ресурсам. Между прочим ресурсы включают микшеры и различные типы строк, принадлежавших микшерам.

Класс AudioSystem

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

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

Информационные Объекты

Несколько классов в API Звука Java обеспечивают полезную информацию о связанных интерфейсах. Например, Mixer.Info обеспечивает детали об установленном микшере, такие как поставщик микшера, имя, описание, и версия. Line.Info получает class определенной строки. Подклассы 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 определил бы a TargetDataLine. Line.Info class обсуждается в следующем разделе.

Получение Строки Требуемого Типа

Есть два способа получить строку:

Получение Строки Непосредственно от AudioSystem

Давайте предполагать, что Вы не получили микшер, и Ваша программа является простой, которая действительно только нуждается в определенном виде строки; детали микшера не имеют значения для Вас. Можно использовать AudioSystem метод:

static Line getLine(Line.Info info)

который походит getMixer метод, обсужденный ранее. В отличие от этого Mixer.Info , Line.Info используемый, поскольку параметр не хранит текстовую информацию, чтобы определить требуемую строку. Вместо этого это хранит информацию о class требуемой строки.

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 объект, не определяя атрибутов кроме его class и его аудиоформата. Можно использовать аналогичный код, чтобы получить другие виды строк. Для a 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 class, который указывает на то, что виды доступа апплет (или приложение, работающее с менеджером безопасности), могут иметь к выбранной аудиосистеме. Разрешением, чтобы записать звук управляют отдельно. Это разрешение нужно предоставить с заботой, помочь предотвратить угрозы безопасности, такие как несанкционированное подслушивание. По умолчанию апплетам и приложениям предоставляют полномочия следующим образом:

Вообще, апплеты выполняются под наблюдением менеджера безопасности и не разрешаются записать звук. Приложения, с другой стороны, автоматически не устанавливают менеджера безопасности, и в состоянии записать звук. (Однако, если менеджер безопасности значения по умолчанию вызывается явно для приложения, приложению не разрешают записать звук.)

И апплеты и приложения могут записать звук, работая с менеджером безопасности, если им предоставили явное разрешение, чтобы сделать так.

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


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Краткий обзор Выбранного Пакета
Следующая страница: Воспроизведение Аудио