Использование kAudioSessionProperty_OtherMixableAudioShouldDuck на iPhone - PullRequest
4 голосов
/ 05 апреля 2010

Я пытаюсь получить согласованное поведение из свойства kAudioSessionProperty_OtherMixableAudioShouldDuck на iPhone, чтобы разрешить смешивание музыки на iPod, и у меня возникают проблемы. В начале моего приложения я установил категорию Ambient примерно так:

-(void) initialize
{
 [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
}

Позже, когда я пытаюсь воспроизвести аудио, я установил свойство утки, используя следующий метод:

//this will crossfade the audio with the ipod music
- (void) toggleCrossfadeOn:(UInt32)onOff
{
 //crossfade the ipod music
 AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck,sizeof(onOff),&onOff);
 AudioSessionSetActive(onOff);
}

Я называю это передачей числового значения «1» непосредственно перед воспроизведением звука, например:

  [self toggleCrossfadeOn:1];
  [player play];

Затем я снова вызываю метод crossfade, пропуская ноль, когда аудио моего приложения завершает использование воспроизведения, останавливая обратный вызов следующим образом:

-(void) playbackIsStoppingForPlayer:(MQAudioPlayer*)audioPlayer
{
  NSLog(@"Releasing player");
  [audioPlayer release];
  [self toggleCrossfadeOn:0];
}

В моем производственном приложении этот точный код работает должным образом, заставляя ipod затухать непосредственно перед воспроизведением звука моего приложения, а затем возвращаться обратно, когда воспроизведение заканчивается. В новом проекте, который я недавно начал, у меня другое поведение. Аудио iPod исчезает и никогда не возвращается обратно. В моем производственном приложении я использую AVAudioPlayer, где в моем новом приложении я написал собственный аудиоплеер, который использует аудио-очереди. Может ли кто-нибудь помочь мне понять различия и как правильно использовать этот API?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2010

Я только что нашел часть проблемы.Похоже, это связано со временем.Я полагаю, что мой пользовательский проигрыватель по-прежнему подает аудиосистему, когда я выполняю вызов, чтобы снова смешать звук. Если я установлю точку останова в метод playIsStoppingForPlayer, то он будет работать так, как ожидается, так как точка останова останавливает выполнение достаточно долго для оставшихсяаудио, чтобы закончить пробираться через аудио-очереди.

2 голосов
/ 19 июля 2011

В одном из наших приложений мы вызываем AudioSessionSetActive(YES), а затем немедленно вызываем AudioSessionSetActive(NO), когда хотим убрать приглушение, чтобы обойти эту проблему.

...