運動中に使える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];
アラート音が鳴る直前に入れてみました。これはさまざまな結果をもたらしました。最初は思った通りフルボリュームで音が出ますが、2回目以降は音量がかなり小さくなります。また、音楽がスムーズにフェードアウトしません。同じボリュームを共有してiPodMusicPlayer
いるようです。applicationMusicPlayer
これは を使用した結果[AVAudioSession sharedInstance];
ですか? を初期化する別の方法はありAVAudioSession
ますか?次に、
AVAudioSession
「ダッキング」を使用してみました。OSStatus propertySetError = 0; UInt32 allowDucking = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof (allowDucking), &allowDucking );
残念ながら、オーディオ セッションがアクティブになると、iPod の音楽が「アヒル」になります。
最後に、ステップが終了する 1 秒前にオーディオ セッションがアクティブになり、ステップが終了するとサウンドが再生され、1 秒後にセッションが非アクティブになるようにコードを変更しました。この時点で、フェード インとフェード アウトのコードをすべて削除しました。関連するコード スニペットは次のとおりです。
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 の音量が 1 秒後にフェードバックします。ただし、ステップが 2 回目に終了すると、サウンドの音量がわずかに小さくなり、3 回目はほとんど聞こえなくなり、4 回目は無音になります。その後、5 回目に再び大きな音が鳴り、このサイクルが繰り返されます。
その上、アクティブ化と非アクティブ化はかなり重い操作のようで、タイマーがわずかにスタッターします。
誰かが似たようなことをしようとしましたか? iPod の音楽に合わせてサウンドを再生するための好ましい方法はありますか?