web-dev-qa-db-fra.com

Comment acheminer l'audio vers un haut-parleur sans utiliser AudioSessionSetProperty?

Comme AudioSessionSetProperty peut devenir deprecated, j'essaie de trouver un exemple de code montrant comment acheminer l'audio vers speaker par d'autres moyens.

Auparavant, je faisais ce qui suit:

-(void)setSpeakerEnabled
{
    debugLog(@"%s",__FUNCTION__);
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

    AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideAudioRoute,
                         sizeof (audioRouteOverride),
                         &audioRouteOverride
                         );
}

Essayer d'obtenir le même résultat mais without call à AudioSessionSetProperty.

36
Jim Hankins

Sur chaque version d'iOS, de plus en plus de propriétés audioSession sont migrées vers AVFoundation. Vous devez donc utiliser celles qui ont la préférence lorsqu'elles sont disponibles. 

Depuis iOS 6 kAudioSessionProperty_OverrideAudioRoute est représenté dans AVAudioSession par la méthode 

- (BOOL)overrideOutputAudioPort:error:

Les valeurs disponibles sont AVAudioSessionPortOverrideNone et AVAudioSessionPortOverrideSpeaker 

Voici un exemple de session audio entièrement configurée via AVFoundation:

 - (void)configureAVAudioSession
{
   // Get your app's audioSession singleton object
    AVAudioSession *session = [AVAudioSession sharedInstance];

    // Error handling
    BOOL success;
    NSError *error;

    // set the audioSession category. 
    // Needs to be Record or PlayAndRecord to use audioRouteOverride:  

    success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
                             error:&error];

   if (!success) {
       NSLog(@"AVAudioSession error setting category:%@",error);
   }

    // Set the audioSession override
    success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                          error:&error];
    if (!success) {
        NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
    }

    // Activate the audio session
    success = [session setActive:YES error:&error];
    if (!success) {
        NSLog(@"AVAudioSession error activating: %@",error);
    }
    else {
         NSLog(@"AudioSession active");
    }

}

METTRE À JOUR

Depuis iOS 7.0, l’API C Audio Session Services est désormais totalement obsolète au profit d’AVAudioSession. 

MISE À JOUR 2

- (BOOL)overrideOutputAudioPort:error:  

est une méthode et non une propriété et définit une valeur sous-jacente en écriture seule UInt32. Vous ne pouvez pas obtenir la valeur actuelle et vous devez traiter la méthode comme définissant un état temporaire. Si la route audio change ou est interrompue, la propriété est réinitialisée à sa valeur par défaut (AVAudioSessionPortOverrideNone). Vous pouvez recevoir des notifications d'interruption via AVAudioSessionDelegate.

58
foundry
NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                                                   error:&error];    
if(error)
{ 
    NSLog(@"Error: AudioSession cannot use speakers");
}
6
Yunus Nedim Mehel
let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .spokenAudio, options: .defaultToSpeaker)
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
    } catch {
        print("error.")
    }  

// colle ce code dans votre région viewLoad

0
Mirac Bektas

La solution Foundry avec ce blog de Mario Diana m'a également permis de mettre à jour le code d'installation de session audio obsolète dans iOS 7. Mon ancien code était basé sur AudioBufferPlayer de Matthijs Hollemans . N'oubliez pas d'ajouter le fichier AVFoundation.framework.

0
Greg