Главная » iPhone » Уровень громкости iPhone

0

Дорожки, воспроизводимые посредством платформы Celestial, проигрываются на достаточно высоком уровне громкости, чтобы автоматически отслеживать его с помощью системного уровня громкости. Однако низкоуровневая платформа, каковой является Audio Toolbox, не обращает внимания на системный уровень громкости, поэтому выходной уровень громкости является статическим и независящим от установленного на iPhone. Управление уровнем громкости аудиоочереди требует от разработчика использования функций более высокого уровня для чтения уровня громкости и масштабирования звукового потока для согласования с ним.

Audio Toolbox и Celestial встречаются, когда вы работаете с настройками высокого уровня, например, уровнем громкости. Уровень громкости звука является функцией mediaserverd— аудиодемона, с которым вы познакомились ранее при изучении Core Audio. Данный демон крепко-накрепко связан с платформой Celestial. Поэтому платформа Celestial может быть использована для чтения уровня громкости и перехвата нажатий кнопок регулировки уровня громкости.

Прежде чем приступить к описанию уровня громкости, важно обсудить, что делать с ним при воспроизведении посредством Audio Toolbox. Уровень громкости передается в виде значения между 0,0 и 1,0 (т.е. 0% и 100%). В функции обратного вызова, использованной в предыдущем разделе, звуковые фреймы копировались из вывода приложения в звуковые буферы при каждой синхронизации. Мы предполагаем, что приложение получило текущий уровень громкости и сохранило его в переменной volume, выделенный полужирным начертанием текст в следующем примере показывает изменения, которые необходимо сделать в данной процедуре, чтобы встроить возможность настройки уровня громкости пользователем: for(i=0; i<aqc->frameCount*2; i+=2) {

if (aqc->playPtr > aqc->sampleLen I| aqc->playPtr < 0)

sample = 0; else

sample = (aqc->pcmBuffer[aqc->playPtr]); coreAudioBuffer[i] = sample * _volume; coreAudioBuffer[i+1] = sample * _volume; aqc->playPtr++;

}

Другими словами, если уровень громкости установлен на свой максимум, то воспроизводятся текущие данные дорожки (т. е. sample * 1.0). Если же уровень громкости установлен в любое другое значение, то уровень громкости дорожки умножается на значение уровня громкости, так что он будет уменьшен на соответствующий коэффициент уровня громкости. Если вы хотите, чтобы максимальный уровень громкости был еще громче, то можете просто умножить volume на коэффициент 2 или 3, хотя тем самым вы идете на риск износа вашего аудио.

Чтение уровня громкости

Audio Toolbox "живет в стране" С, в то время как Celestial требует контекста Objective-C. Чтобы проще всего объединить эти два мира и позволить им обмениваться данными, надо использовать глобальную переменную. В данном примере такая глобальная переменная называется volume.

Celestial делегирует управление уровнем громкости и звонком классу AVSystemController. Чтобы прочитать уровень громкости из Celestial, создайте его экземпляр:

NSString *audioDeviceName; float _volume; AVSystemController *avs =

[ AVSystemController sharedAVSystemController ]; [ avs getActiveCategoryVolume: fi_volume andName: SaudioDeviceName ];

Когда метод getActiveCategoryVolume уведомлен. он устанавливает в качестве значения volume текущий уровень громкости в диапазоне от 0,0 до 1,0. Это автоматически будет распознано кодом Audio Toolbox, при условии, что volume является глобальной переменной, и приведет к тому, что все следующие фреймы дорожек будут умножаться на новое значение.

Уведомления об изменении уровня громкости

Использование метода getActiveCategoryVolume в качестве одноразового чтения полезно для установки выходного уровня громкости при старте программы. но он не будет менять что-либо, если уровень громкости меняется в процессе использования приложения. Чтобы это сделать, добавьте в приложение наблюдателя (observer). Этот наблюдатель будет отслеживать специальные системные события и уведомлять данный метод, когда такое событие будет происходить:

[ [ NSNotificationCenter defaultCenter ] addObserver: self selector:@selector(volumeChange:)

name: @"AVSystemController_SystemVolumeDidChangeNotification" object: avs J;

Данный код задает метод volumeChange в качестве наблюдателя за изменениями системного уровня громкости. Затем метод volumeChange определяется в вызывающем классе:

- (void)volumeChange:(NSNotification *)notification { AVSystemController *avsc = [ notification object ]; NSString *audioDeviceName; [ avsc getActiveCategoryVolume:&_volume

andName:&audioDeviceName ];

Когда метод volumeChange уведомляется, в него передается объект AVSystem- Controller вместе с уведомлением. Затем данный объект используется для повторного чтения уровня громкости в volume, где он будет подобран функцией AQBufferCallback, заполняющей аудиоочередь.

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии