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
.
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
.
NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&error];
if(error)
{
NSLog(@"Error: AudioSession cannot use speakers");
}
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
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.