Ho un'app che utilizza MPAudioPlayerController per accedere alla libreria musicale di iPod e un AVAudioPlayer per sovrapporre l'audio sulla parte superiore della musica. Ho usato this documentation come guida. In particolare:Audio Session "Ducking" Rotto in iOS 4 ...?
Infine, è possibile migliorare una categoria per abbassare automaticamente il volume di altri audio durante la riproduzione dell'audio. Questo potrebbe essere usato, ad esempio, in un'applicazione di esercizio. Supponiamo che l'utente si stia esercitando sul proprio iPod quando l'applicazione desidera sovrapporre un messaggio verbale, ad esempio "Hai canottaggio per 10 minuti". Per garantire che il messaggio dell'applicazione sia comprensibile, applica la proprietà kAudioSessionProperty_OtherMixableAudioShouldDuck al sessione audio. Quando avviene il ducking, tutti gli altri audio sul dispositivo, a parte l'audio del telefono, diminuiscono di volume.
Ma non vedo questo comportamento. In effetti, quello che vedo (o sento, piuttosto) è che se imposto AudioSession con kAudioSessionProperty_OtherMixableAudioShouldDuck impostato su true, il volume iniziale di MPAudioPlayerController viene ridotto, e se poi richiamo pause (e poi riproduco di nuovo) su MPAudioPlayerController il livello del volume viene aumentato a livelli "normali". Riproduzione di AVAudioPlayer non ha alcun effetto sul livello audio ...
Quindi ho creato un semplice caso di test per riprodurre questo.
In un colpo di testa 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
e nella realizzazione:
- (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];
}
}
ho cablato un paio UIButtons. Uno per la musicaAzione (utilizzata per riprodurre/sospendere MPMusicPlayerController) e una per l'audioAzione (utilizzata per riprodurre/sospendere AVAudioPlayer).
Come accennato, Se tocco il pulsante MusicAction, la musica suona, ma a un livello di volume ridotto, e se tocco il pulsante SoundAction, la sovrapposizione viene riprodotta, ma non ha alcun effetto sul volume del MPMusicPlayerController. E, più simile a un bug, è che quando metto in pausa e poi su MPMusicPlayerController il volume della musica aumenta al livello che sarebbe stato se non avessi impostato AudioSession.
Sono interessato a sapere se qualcun altro ha avuto questa esperienza, e in tal caso se hai trovato un lavoro in giro (o puoi dirmi che sto facendo qualcosa di sbagliato). Altrimenti, suppongo di essere fuori da Radar.
Molte grazie,
Levi