Tengo una aplicación que utiliza el MPAudioPlayerController para acceder a la biblioteca de música del iPod, y un AVAudioPlayer para superponer el audio en la parte superior de la música. Utilicé this documentation como guía. Específicamente:Sesión de audio "Ducking" Roto en iOS 4 ...?
Finalmente, puede mejorar una categoría para bajar automáticamente el volumen de otro audio cuando se reproduce el audio. Esto podría usarse, por ejemplo, en una aplicación de ejercicio. Supongamos que el usuario se está ejercitando junto a su iPod cuando su aplicación desea superponer un mensaje verbal, por ejemplo, "ha estado remando durante 10 minutos". Para asegurarse de que el mensaje de su aplicación sea inteligible, aplique la propiedad kAudioSessionProperty_OtherMixableAudioShouldDuck al sesión de audio Cuando tiene lugar la inhibición, el resto del audio del dispositivo, además del audio del teléfono, baja de volumen.
Pero no estoy viendo este comportamiento. De hecho, lo que veo (u oigo, más bien) es que si configuro la AudioSession con kAudioSessionProperty_OtherMixableAudioShouldDuck establecido en true, el volumen inicial de MPAudioPlayerController se reduce, y si llamo pausa (y luego vuelvo a reproducir) en el MPAudioPlayerController el nivel de volumen se incrementa a niveles "normales". La reproducción de AVAudioPlayer no tiene ningún efecto en el nivel de audio ...
Así que configuré un caso de prueba simple para reproducir esto.
En una cabecera 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
y en la ejecución:
- (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];
}
}
he cableado de un par UIButtons. Uno para MusicAction (usado para reproducir/pausar el MPMusicPlayerController) y otro para soundAction (usado para reproducir/pausar el AVAudioPlayer).
Como mencioné, si toco el botón musicAction, la música se reproduce, pero a un nivel de volumen reducido, y si toco el botón soundAction, la superposición se reproduce, pero no afecta el volumen del MPMusicPlayerController. Y, más parecido a un error, es que cuando hago una pausa y luego reproduzco el MPMusicPlayerController, el volumen de la música aumenta al nivel que hubiera tenido si no hubiera configurado AudioSession.
Me interesa saber si alguien más ha tenido esta experiencia, y si es así, si ha encontrado un trabajo alternativo (o puede decirme que estoy haciendo algo mal). De lo contrario, supongo que me iré a Radar.
Muchas gracias,
Levi