iPhone AudioServicesPlaySystemSound: проложить через наушники? - PullRequest
4 голосов
/ 16 января 2011

У меня проблемы с использованием AudioServicesPlaySystemSound. Все работает отлично, когда выход проходит через динамики. Однако, когда пользователь подключает наушники, выходной сигнал отсутствует. Есть ли простой способ настроить какой-либо тип слушателя таким образом, чтобы звук автоматически передавался через наушники, когда они подключены, или через динамик?

Я использую следующий метод для воспроизведения коротких простых звуковых сэмплов AIF:

-(void)playAif:(NSString *)filename {
    SystemSoundID soundID;
    NSString *path = [[NSBundle mainBundle]
       pathForResource:filename ofType:@"aif"];    

    if (path) { // test for path, to guard against crashes

    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
    AudioServicesPlaySystemSound (soundID);

        }
   }

Я знаю, что, должно быть, что-то упущено, какая-то настройка, которая бы сделала это. Есть идеи?

1 Ответ

4 голосов
/ 16 января 2011

Спасибо @Till за указание на соответствующую часть документов .Для других с этой проблемой решение состоит в том, чтобы явно установить категорию сеанса, в моем случае, на окружающий звук.Этот код взят из документов Apple :

    UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;    // 1

    AudioSessionSetProperty (
                             kAudioSessionProperty_AudioCategory,                        // 2
                             sizeof (sessionCategory),                                   // 3
                             &sessionCategory                                            // 4
                             );

Итак, мой метод воспроизведения звука теперь выглядит следующим образом:

    -(void)playAif:(NSString *)filename {
    //  NSLog(@"play: %@", filename);

        SystemSoundID soundID;
        NSString *path = [[NSBundle mainBundle]
                          pathForResource:filename ofType:@"aif"];    


        if (path) { // test for path, to guard against crashes

            UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;    // 1

            AudioSessionSetProperty (
                                     kAudioSessionProperty_AudioCategory,                        // 2
                                     sizeof (sessionCategory),                                   // 3
                                     &sessionCategory                                            // 4
                                     );

            AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
            AudioServicesPlaySystemSound (soundID);

        }
    }

Это решает мою проблему легко!Единственное, что меня беспокоит, это то, что установка его явно каждый раз, когда я играю звук, может быть чрезмерной.Кто-нибудь знает лучший и безопасный способ установить его и забыть?В противном случае это работает восхитительно.

...