Более низкий объем iPod для проигрывания звука приложения (как собственное приложение SMS)

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

Когда музыка является громкой, трудно услышать тон. Мое идеальное решение является чем-то подобным способу, которым приложение для iPod обрабатывает входящее текстовое сообщение или электронное письмо. Музыкальный объем понижается, звуковые игры, затем музыкальный объем отходит назад в.

Вот подходы, которые я попробовал до сих пор:

  1. Я использовал AudioServicesPlaySystemSound играть звук.

    Я инициализировал звук как это:

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, CFSTR ("bell"), CFSTR ("wav"), NULL);
    AudioServicesCreateSystemSoundID (soundFileURLRef, &soundFileID);
    

    И я играю звук в подходящее время с помощью:

    AudioServicesPlaySystemSound (self.soundFileID);
    

    Это играет звуковой штраф, но слишком трудно услышать по громкой музыке. На попытаться 2...

  2. Я пытался понизить объем iPod, играть звук и затем возвратить объем его предыдущему уровню.

    Если существует 1 секунда, оставленная на текущем шаге, начните понижать объем:

    if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) {
        self.volumeIncrement = originalVolume/5.0f;
        [NSTimer scheduledTimerWithTimeInterval:0.5f 
                                         target:self 
                                       selector:@selector(fadeVolumeOut:) 
                                       userInfo:[NSNumber numberWithInt:1]
                                        repeats:NO];
    }
    

    Вот fadeVolumeOut: метод:

    - (void) fadeVolumeOut:(NSTimer *)timer {
        if (!TARGET_IPHONE_SIMULATOR) {
            NSNumber *volumeStep = (NSNumber *)[timer userInfo];
            int vStep = [(NSNumber *)volumeStep intValue];
            float volume = [[MPMusicPlayerController iPodMusicPlayer] volume];
            volume = volume - self.volumeIncrement;
            if (volume < 0.0f) {
                volume = 0.0f;
            }
            [[MPMusicPlayerController iPodMusicPlayer] setVolume:volume];
            if (vStep < 5) {
                vStep = vStep + 1;
                [NSTimer scheduledTimerWithTimeInterval:0.1f 
                                                 target:self 
                                               selector:@selector(fadeVolumeOut:) 
                                               userInfo:[NSNumber numberWithInt:vStep]
                                                repeats:NO];
            }
        }
    }
    

    Затем когда шаг закончится, играйте аварийный звук и постепенно появитесь объем назад:

     [NSTimer scheduledTimerWithTimeInterval:0.1f 
                                      target:self 
                                    selector:@selector(alertAndFadeVolumeIn) 
                                    userInfo:nil
                                     repeats:NO];
    

    Вот alertAndFadeVolumeIn метод:

     - (void) alertAndFadeVolumeIn {
         [self alert];
         [NSTimer scheduledTimerWithTimeInterval:0.25f 
                                          target:self 
                                        selector:@selector(fadeVolumeIn:) 
                                        userInfo:[NSNumber numberWithInt:1]
                                         repeats:NO];
     }
    

    И fadeVolumeIn: в основном противоположность fadeVolumeOut: выше.

    Это работает, объем постепенно исчезает, звуковые игры, и объем отходит назад в. Проблема состоит в том, что тональный объем понижен той же суммой как iPod, таким образом, это не делает немного легче услышать по музыке.

  3. Я переключился на AVAudioSession играть звук и настраивать сессию так, чтобы музыка iPod продолжила играть, в то время как приложение используется. Вот то, как я инициализирую сессию:

     AVAudioSession *session = [AVAudioSession sharedInstance];
     [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    
     OSStatus propertySetError = 0;
     UInt32 allowMixing = true;
     propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryMixWithOthers,
         sizeof (allowMixing),
         &allowMixing
     );
    
     NSError *activationError = nil;
     [session setActive:YES error:&activationError];
    
     NSString *audioFile = [[NSBundle mainBundle] pathForResource:@"bell"
                                                           ofType:@"wav"];
     player = [[AVAudioPlayer alloc] initWithContentsOfURL:
         [NSURL fileURLWithPath:audioFile] error:NULL];
    

    Для проигрывания звука я звоню [self.player play] в подходящее время. Снова, тональный объем понижается наряду с объемом iPod, и тон не немного легче услышать.

  4. Я пытался поместить [[MPMusicPlayerController applicationMusicPlayer] setVolume:1.0f]; прямо перед аварийными звуковыми играми. Это смешало результаты. В первый раз звук играет в полном объеме, как я надеялся, но последующие времена объем намного ниже. Кроме того, музыка не постепенно исчезает гладко. Это походит iPodMusicPlayer и applicationMusicPlayer совместно используют тот же объем. Это результат использования [AVAudioSession sharedInstance];? Есть ли другой способ инициализировать AVAudioSession?

  5. Затем, я пытался использовать AVAudioSession "ныряние":

     OSStatus propertySetError = 0;
     UInt32 allowDucking = true;
     propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OtherMixableAudioShouldDuck,
         sizeof (allowDucking),
         &allowDucking
     );
    

    К сожалению, музыка iPod "ныряют", когда аудио сессия активируется, который является, как только viewController загружается путем, у меня были вещи.

  6. Наконец, я изменил свой код так, чтобы аудио сессия была активирована за одну секунду до концов шага играется звук, когда шаг заканчивается, и одну секунду спустя, сессия деактивируется. Я удалил все свое постепенное появление и кодирую в этой точке. Вот отрывки соответствующих норм:

    if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) {
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:YES error:nil];
    }
    

    ...

    if (self.shouldRing) {
        [self.player play]; 
        [NSTimer scheduledTimerWithTimeInterval:1.0f 
                                         target:self 
                                       selector:@selector(stopSound)
                                       userInfo:nil
                                        repeats:NO];
    }
    

    ...

    - (void) stopSound {
        [self.player stop];
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:NO error:nil];
    }
    

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

    Вдобавок ко всему, активация и деактивация, кажется, довольно тяжелые операции, и они заставляют таймер заикаться немного.

Кто-либо попытался сделать что-то подобное? Существует ли предпочтительный подход к проигрыванию звука по музыке iPod?

12
задан Ted 13 April 2017 в 08:44
поделиться

2 ответа

AVAudioSession - это правильный способ обработки " поведения звука на уровне приложения, взаимодействия приложений и устройства. " Я использовал слегка измененный # 6 на iOS 4 без проблем. Фоновый звук исчез, мой звук проиграл, а фоновый звук снова исчез.

  1. Инициализация аудиосеанса (код обработки ошибок удален):

     AVAudioSession * audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory: AVAudioSessionCategoryPlayback error: nil]
    [audioSession setActive: NO error: nil];
    
  2. Воспроизведение звука ( AVAudioPlayer play / prepareToPlay активирует аудиосеанс для вас ):

     AVAudioPlayer * audioPlayer = [[[AVAudioPlayer alloc] initWithContentsOfURL: audioURL error: nil];
    [воспроизведение audioPlayer];
    
  3. Отключение звука:

      [остановка аудиоплеера];
    [[AVAudioSession sharedInstance] setActive: NO withFlags: AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error: nil];
    

    Флаг kAudioSessionSetActiveFlag_NotifyOthersOnDeactivation (новый для iOS 4) указывает системе уведомить фоновый звук для возобновления воспроизведения.

11
ответ дан 2 December 2019 в 05:54
поделиться

Почему бы не вернуться к № 2? Вместо:

  1. Уменьшить
  2. Воспроизвести оповещение
  3. Уменьшить

Использовать:

  1. Уменьшить
  2. Пауза музыки
  3. Уменьшить громкость
  4. Воспроизвести оповещение
  5. Уменьшить громкость
  6. Воспроизвести музыку
  7. Уменьшить
4
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: