Я сделал приложение для 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
"ныряние":
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?
AVAudioSession
- это правильный способ обработки " поведения звука на уровне приложения, взаимодействия приложений и устройства. " Я использовал слегка измененный # 6 на iOS 4 без проблем. Фоновый звук исчез, мой звук проиграл, а фоновый звук снова исчез.
Инициализация аудиосеанса (код обработки ошибок удален):
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory: AVAudioSessionCategoryPlayback error: nil]
[audioSession setActive: NO error: nil];
Воспроизведение звука ( AVAudioPlayer
play / prepareToPlay активирует аудиосеанс для вас ):
AVAudioPlayer * audioPlayer = [[[AVAudioPlayer alloc] initWithContentsOfURL: audioURL error: nil];
[воспроизведение audioPlayer];
Отключение звука:
[остановка аудиоплеера];
[[AVAudioSession sharedInstance] setActive: NO withFlags: AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error: nil];
Флаг kAudioSessionSetActiveFlag_NotifyOthersOnDeactivation (новый для iOS 4) указывает системе уведомить фоновый звук для возобновления воспроизведения.
Почему бы не вернуться к № 2? Вместо:
Использовать: