Регулятор громкости в основном тихом приложении для iOS - PullRequest
0 голосов
/ 20 марта 2012

Я задавал этот вопрос и раньше, но я чувствую, что должен начать новую тему, поскольку моя другая тема датирована и, вероятно, плохо сформулирована. Мне интересно, как лучше всего добавить регулятор громкости в приложение для iOS, которое в основном молчит. Хорошим примером может служить навигационное приложение, которое воспроизводит звук только когда вы приближаетесь или пропускаете поворот. В таком приложении, услышав подсказку поворота, которая недостаточно громка, пользователь хотел бы, чтобы громкость подсказок была слышна, и, естественно, использовал бы боковые регуляторы громкости, чтобы настроить подсказки по своему вкусу.

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

Из различных проблем, связанных с управлением аудиосеансом, вы должны решить вопрос с уничтожением и восстановлением аудиосеанса, когда вы входите и выходите из фона. Вы должны рассмотреть другие приложения, воспроизводящие аудио, когда вы начинаете и останавливаете сеанс. В зависимости от типа приложения у вас могут возникнуть другие более сложные потребности, такие как настраиваемая маршрутизация переадресации к динамикам, настраиваемые элементы управления отключением звука и т. Д. Если у вас есть опыт работы с таким приложением, не могли бы вы рассказать о том, как вы решали такие проблемы, и изложить другие вопросы?

Ответы [ 2 ]

0 голосов
/ 23 марта 2012

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

@interface MyAudioManager ()
@property (nonatomic, retain) BOOL alwaysMaintainAudioSession;
@property (nonatomic, retain) MyCustomAudioPlayer *player;
@end

@implementation MyAudioManager
@synthesize alwaysMaintainAudioSession;
@synthesize player;

-(void) applicationWillEnterForeground
{
    isInBackground = NO;
    if (NO==[self anyAudioIsPlaying] && self.alwaysMaintainAudioSession) {
        [self activateAudioSession];
    }
}

-(void) activateAudioSession
{
    AudioSessionSetActive(TRUE);
    AudioSessionAddPropertyListener ( kAudioSessionProperty_AudioRouteChange, AudioPropertyListener, self);
}

-(BOOL) anyAudioIsPlaying
{
    return [self otherAudioIsPlaying] || [player isPlaying];
}

-(BOOL) otherAudioIsPlaying
{
    UInt32 yesNo;
    UInt32 propertySize = sizeof(yesNo);
    OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &yesNo);
    if (kAudioSessionUnsupportedPropertyError == status) {
        return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState];
    } else {
        return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState] || yesNo;
    }
}

Менеджер позволяет вам установить свойство, которое всегда будет держать регулятор громкости связанным со звуками приложения, что означает, что мы всегда должны быть уверены, что сессия активна или какое-то другое приложение воспроизводит звук. В любом другом случае регулятор громкости возвращается к управлению звонком. Поэтому, когда вы выходите на передний план, мы должны проверять любой другой звук и условно активировать аудио сеанс. Нам также нужно закрыть сеанс при переходе на фон, чтобы восстановить регулятор громкости звонка.

-(void) applicationDidEnterBackground
{
    if (NO==[self anyAudioIsPlaying]) {
        AudioSessionSetActive(NO);
    }
}

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

0 голосов
/ 21 марта 2012

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

Добавлено:

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

...