Audio-Sitzung "Ducking" in iOS 4 unterbrochen…?

Ich habe eine App, die den MPAudioPlayerController verwendet, um auf die iPod-Musikbibliothek zuzugreifen, und einen AVAudioPlayer, um Audio über die Musik zu legen. Ich habe @ verwenddiese Dokumentation als Leitfaden. Speziell

Abschließend können Sie eine Kategorie erweitern, um die Lautstärke anderer Audiodaten bei der Audiowiedergabe automatisch zu verringern. Dies kann beispielsweise in einer Übungsanwendung verwendet werden. Angenommen, der Benutzer trainiert mit seinem iPod, wenn Ihre Anwendung eine verbale Nachricht überlagern möchte, z. B. "Sie haben 10 Minuten gerudert". Um sicherzustellen, dass die Nachricht aus Ihrer Anwendung verständlich ist, wenden Sie die Eigenschaft kAudioSessionProperty_OtherMixableAudioShouldDuck auf an Audio-Sitzung. Wenn das Ducking stattfindet, wird die Lautstärke aller anderen Audiodaten auf dem Gerät - mit Ausnahme des Telefons - verringert.

Aber ich sehe dieses Verhalten nicht. Tatsächlich sehe (oder höre) ich, dass wenn ich die AudioSession mit kAudioSessionProperty_OtherMixableAudioShouldDuck auf true stelle, die Anfangslautstärke des MPAudioPlayerControllers verringert wird und wenn ich dann auf dem MPAudioPlayerController pause rufe (und dann wieder abspiele), die Lautstärke stelle wird auf "normale" Werte angehoben. Das Abspielen des AVAudioPlayer hat keinen Einfluss auf den Audiopegel ...

So habe ich einen einfachen Testfall eingerichtet, um dies zu reproduzieren.

In einem ViewController-Header:

#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

und in der Implementierung:

- (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];
    }
}

Ich habe ein paar UIButtons verkabelt. Eine für die musicAction (zum Abspielen / Anhalten des MPMusicPlayerControllers) und eine für die soundAction (zum Abspielen / Anhalten des AVAudioPlayer).

Wie bereits erwähnt: Wenn ich auf die musicAction-Schaltfläche tippe, wird die Musik mit verringerter Lautstärke wiedergegeben. Wenn ich auf die soundAction-Schaltfläche tippe, wird die Überlagerung wiedergegeben, hat jedoch keinen Einfluss auf die Lautstärke des MPMusicPlayerControllers. Und noch schlimmer: Wenn ich den MPMusicPlayerController pausiere und dann wiedergebe, erhöht sich die Lautstärke der Musik auf den Pegel, der wäre, wenn ich die AudioSession nicht eingerichtet hätte.

Ich bin interessiert zu wissen, ob jemand diese Erfahrung gemacht hat und wenn ja, ob Sie eine Lösung gefunden haben (oder mir mitteilen können, dass ich etwas falsch mache). Ansonsten gehe ich wohl zum Radar.

Danke vielmals

Levi

Antworten auf die Frage(6)

Ihre Antwort auf die Frage