1

一連のオーディオ リマインダーを再生し、他のアプリケーションで生成されたサウンドと適切に通信する iPhone 用のアプリケーションを作成したいと考えています。

具体的には、次の点を達成したいと考えてい
ます。 1. 10 秒ごとにサウンド リマインダーを再生します。(これは質問を簡単にするためです。私のアプリには、リマインダーをいつ再生するかを指定する一連の時点があります)
2. サウンドはバックグラウンドで動作する必要があります。
3. 音楽が再生されている場合は、一時停止する必要があります。アプリケーションは音声リマインダーを生成し、その後音楽を再開する必要があります。
4. 他のアプリケーションがサウンドを使用し始めた場合、リマインダーのシーケンスは引き続き機能するはずです (たとえば、アプリケーションの実行後に音楽が開始されたり、電話がかかってきたりします)。

以下のコードでポイント1.と2.を達成できましたが、3.と4.を同時に達成する方法を理解できません。

- (void)viewDidLoad
{
    [super viewDidLoad];
    audioSession = [AVAudioSession sharedInstance];
}

// Following function is used to start reproducing sounds and also called
// for the next sounds
- (IBAction)soundPlayShort:(id)sender
{
    NSURL * url = @"reminder sound url here";

    // soundPlayer is defined in .h file as AVAudioPlayer
    if (soundPlayer == nil) {
       // initialize soundPlayer
       soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
       soundPlayer.delegate = self;
    }
    [soundPlayer playAtTime:soundPlayer.deviceCurrentTime + 10];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];    
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [self soundPlayShort:self];
}

以下のコードのように更新audioPlayerDidFinishPlayingすると、他のサウンドが再開されますが (ポイント 3.)、シーケンスの次のリマインダーは呼び出されなくなります (ポイント 2. に関連)。

- (void)restoreOtherSounds
{
    [audioSession setActive:NO 
        withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{

    [self restoreOtherSounds];
    [self soundPlayShort:self];
}

また、電話の着信後など、リマインダー シーケンスを再開する方法がわかりません。(ポイント4)

部分的な回答でも非常に役立ちます。前もって感謝します。

4

1 に答える 1

0

ポイント 2 に関連して、soundPlayShort で AVAudioPlayer を初期化する前に、オーディオ セッションをアクティブに設定してみてください。

[[AVAudioSession sharedInstance] setActive:YES error:nil];

于 2013-07-11T10:09:12.030 に答える