Я сделал приложение для iPhone, которое будет использоваться во время упражнений. Он воспроизводит сигнал звонка, чтобы указать, что вы (пользователь) должны переключаться с одного шага вашей тренировочной процедуры на следующую. Я разработал приложение, чтобы вы могли слушать музыку на iPod при использовании приложения, и я хочу, чтобы звук воспроизводился достаточно громко над музыкой. Я получил это, чтобы работать... вроде...
Когда музыка звучит громко, трудно услышать тон. Мое идеальное решение похоже на то, как приложение iPod обрабатывает входящее текстовое сообщение или электронную почту. Громкость музыки снижается, звук воспроизводится, затем громкость музыки исчезает.
Вот те подходы, которые я пробовал до сих пор:
-
Я использовал
AudioServicesPlaySystemSound
для воспроизведения звука.Я инициализировал звук следующим образом:
CFBundleRef mainBundle = CFBundleGetMainBundle(); soundFileURLRef = CFBundleCopyResourceURL(mainBundle, CFSTR ("bell"), CFSTR ("wav"), NULL); AudioServicesCreateSystemSoundID (soundFileURLRef, &soundFileID);
И я играю звук в соответствующее время, используя:
AudioServicesPlaySystemSound (self.soundFileID);
Звучит отлично, но слишком громко слышать громкую музыку. На попытку 2...
-
Я попытался снизить громкость iPod, воспроизвести звук, а затем вернуть уровень громкости на прежний уровень.
Если на текущем шаге осталось 1 секунда, начните снижать громкость:
if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) { self.volumeIncrement = originalVolume/5.0f; [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(fadeVolumeOut:) userInfo:[NSNumber numberWithInt:1] repeats:NO]; }
Здесь метод
fadeVolumeOut:
:- (void) fadeVolumeOut:(NSTimer *)timer { if (!TARGET_IPHONE_SIMULATOR) { NSNumber *volumeStep = (NSNumber *)[timer userInfo]; int vStep = [(NSNumber *)volumeStep intValue]; float volume = [[MPMusicPlayerController iPodMusicPlayer] volume]; volume = volume - self.volumeIncrement; if (volume < 0.0f) { volume = 0.0f; } [[MPMusicPlayerController iPodMusicPlayer] setVolume:volume]; if (vStep < 5) { vStep = vStep + 1; [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(fadeVolumeOut:) userInfo:[NSNumber numberWithInt:vStep] repeats:NO]; } } }
Затем, когда закончится шаг, воспроизведите звуковой сигнал оповещения и снова затухайте громкость:
[NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(alertAndFadeVolumeIn) userInfo:nil repeats:NO];
Здесь метод
alertAndFadeVolumeIn
:- (void) alertAndFadeVolumeIn { [self alert]; [NSTimer scheduledTimerWithTimeInterval:0.25f target:self selector:@selector(fadeVolumeIn:) userInfo:[NSNumber numberWithInt:1] repeats:NO]; }
И
fadeVolumeIn:
в основном противоположноfadeVolumeOut:
выше.Это работает, громкость исчезает, звук воспроизводится, и громкость исчезает. Проблема заключается в том, что громкость тембра уменьшается на том же количестве, что и iPod, поэтому не становится легче слышать над музыкой.
-
Я переключился на
AVAudioSession
, чтобы воспроизвести звук, и настроил сеанс, чтобы музыка iPod продолжала воспроизводиться во время использования приложения. Вот как я инициализирую сеанс:AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; OSStatus propertySetError = 0; UInt32 allowMixing = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (allowMixing), &allowMixing ); NSError *activationError = nil; [session setActive:YES error:&activationError]; NSString *audioFile = [[NSBundle mainBundle] pathForResource:@"bell" ofType:@"wav"]; player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:audioFile] error:NULL];
Чтобы воспроизвести звук, я вызываю
[self.player play]
в соответствующее время. Опять же, громкость тембра уменьшается вместе с громкостью iPod, и звук не слышнее. -
Я попытался поставить
[[MPMusicPlayerController applicationMusicPlayer] setVolume:1.0f];
прямо перед звуком предупреждения. Это привело к неоднозначным результатам. В первый раз звук воспроизводится на полном объеме, как я надеялся, но в последующие времена громкость намного ниже. Кроме того, музыка не исчезает гладко. Кажется, чтоiPodMusicPlayer
иapplicationMusicPlayer
используют один и тот же том. Является ли это результатом использования[AVAudioSession sharedInstance];
? Есть ли другой способ инициализироватьAVAudioSession
? -
Далее я попытался использовать
AVAudioSession
"ducking":OSStatus propertySetError = 0; UInt32 allowDucking = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof (allowDucking), &allowDucking );
К сожалению, музыка iPod "утирается", когда звуковая сессия активирована, что сразу же, как загрузчик viewController загружен, как у меня были вещи.
-
Наконец, я изменил свой код, чтобы сеанс аудио был активирован за одну секунду до окончания действия, звук воспроизводится, когда шаг заканчивается, и через секунду сеанс деактивируется. В этот момент я удалил весь код моего угасания. Вот соответствующие фрагменты кода:
if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) { AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; }
...
if (self.shouldRing) { [self.player play]; [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(stopSound) userInfo:nil repeats:NO]; }
...
- (void) stopSound { [self.player stop]; AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:NO error:nil]; }
Это доводит меня до такой степени, что я действительно застрял. Это отлично работает после завершения первого шага. Объем iPod утилит, звук громко звучит, а громкость iPod постепенно исчезает через секунду. Однако во второй раз, когда шаг заканчивается, звук играет чуть менее громко, в третий раз он едва слышен, а в четвертый раз он молчит. Затем, в пятый раз, он снова играет громко, и цикл повторяется.
Кроме того, активация и деактивация кажутся довольно тяжелыми, и они заставляют таймер заикаться немного.
Кто-нибудь пытался сделать что-то подобное? Есть ли предпочтительный подход к воспроизведению звука через музыку iPod?