J'ai une application qui utilise MPAudioPlayerController pour accéder à la bibliothèque musicale iPod, et un AVAudioPlayer pour superposer l'audio sur la musique. J'ai utilisé this documentation comme guide. Plus précisément:Session audio "Ducking" Broken dans iOS 4 ...?
Enfin, vous pouvez améliorer une catégorie pour réduire automatiquement le volume des autres fichiers audio lors de la lecture de votre fichier audio. Cela pourrait être utilisé, par exemple, dans une application d'exercice. Supposons que l'utilisateur s'exerce sur son iPod lorsque votre application souhaite superposer un message verbal, par exemple, «Vous avez ramé pendant 10 minutes». Pour vous assurer que le message de votre application est intelligible, appliquez la propriété kAudioSessionProperty_OtherMixableAudioShouldDuck au session audio. Lorsque l'atténuation est effectuée, tous les autres sons de l'appareil, à l'exception de l'audio du téléphone, diminuent en volume.
Mais je ne vois pas ce comportement. En fait, ce que je vois (ou entend, plutôt), c'est que si je configure l'AudioSession avec kAudioSessionProperty_OtherMixableAudioShouldDuck réglé sur true, le volume initial de MPAudioPlayerController est réduit, et si j'appelle ensuite pause (puis relance) sur le MPAudioPlayerController le niveau de volume passe à des niveaux "normaux". La lecture de l'AVAudioPlayer n'a aucun effet sur le niveau audio ...
J'ai donc configuré un scénario de test simple pour reproduire ceci.
Dans un en-tête ViewController:
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
@interface MusicPlayerVolumeTestViewController : UIViewController <AVAudioPlayerDelegate>
{
UIButton *musicButton;
UIButton *soundButton;
AVAudioPlayer *audioPlayer;
MPMusicPlayerController *musicPlayerController;
}
@property (nonatomic, retain) IBOutlet UIButton *musicButton;
@property (nonatomic, retain) IBOutlet UIButton *soundButton;
@property (nonatomic, retain) MPMusicPlayerController *musicPlayerController;
- (IBAction)musicAction;
- (IBAction)soundAction;
@end
et dans la mise en œuvre:
- (void)viewDidLoad
{
[super viewDidLoad];
//Setup our Audio Session
OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);
//We want our audio to play if the screen is locked or the mute switch is on
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
//We want our audio to mix with other app's audio
UInt32 shouldMix = true;
status = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (shouldMix), &shouldMix);
//Enable "ducking" of the iPod volume level while our sounds are playing
UInt32 shouldDuck = true;
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(shouldDuck), &shouldDuck);
//Activate our audio session
AudioSessionSetActive(YES);
//Setup the Music Player to access the iPod music library
self.musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
[self.musicPlayerController setShuffleMode: MPMusicShuffleModeSongs];
[self.musicPlayerController setRepeatMode: MPMusicRepeatModeNone];
[self.musicPlayerController setQueueWithQuery:[MPMediaQuery songsQuery]];
//Setup a AVAudioPlayer sound to overlay against the Music Player audio
NSURL *soundURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"overlay" ofType:@"mp3"]];
NSError *error = nil;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error: &error];
if (!audioPlayer)
{
NSLog(@"Could not create audio effect player: %@", [error localizedDescription]);
}
[audioPlayer prepareToPlay];
}
- (IBAction)musicAction
{
if (self.musicPlayerController.playbackState == MPMusicPlaybackStatePlaying)
{
[self.musicPlayerController pause];
}
else if (self.musicPlayerController.playbackState == MPMusicPlaybackStateStopped
|| self.musicPlayerController.playbackState == MPMusicPlaybackStatePaused)
{
[self.musicPlayerController play];
}
}
- (IBAction)soundAction
{
if (audioPlayer.playing)
{
[audioPlayer pause];
}
else
{
[audioPlayer play];
}
}
J'ai câblé un couple UIButtons. Un pour le musicAction (utilisé pour lire/mettre en pause le MPMusicPlayerController) et un pour le soundAction (utilisé pour jouer/mettre en pause le AVAudioPlayer). Comme je l'ai mentionné, si j'appuie sur le bouton musicAction, la musique est lue, mais à un volume réduit, et si j'appuie sur le bouton soundAction, la superposition est lue, mais n'a aucun effet sur le volume du MPMusicPlayerController. Et, plus bête, c'est que lorsque je fais une pause puis que je joue sur MPMusicPlayerController, le volume de la musique augmente au niveau qu'elle aurait atteint si je n'avais pas configuré l'AudioSession.
Je suis curieux de savoir si quelqu'un d'autre a eu cette expérience, et si oui, si vous avez trouvé un travail (ou peut me dire que je fais quelque chose de mal). Sinon, je suppose que je pars pour Radar.
Un grand merci,
Levi