1

私はかなり新しい Xcode と ObjC で、複数の AVAudioPlayer を介して複数のオーディオ ファイルを再生するのに問題があります。

理論的には、私のアプリはかなり単純です。車の RPM と Load の値を取り、それらの値に基づいてサウンドを再生します。

したがって、RPM 値の範囲に対して 13 のサウンド サンプルがあります。私のコードは、アプリで正しいエンジン サウンドを再現するために、どの音量とレートで再生する必要があるかを判断します。

したがって、ボリュームとレートを次のように計算します (これはスニペットです)。

if ((rpm > 4989) && (rpm < 5339)) {

    av1Pitch  = 0.0f;
    av2Pitch  = 0.0f;
    av3Pitch  = 0.0f;
    av4Pitch  = 0.0f;
    av5Pitch  = 0.0f;
    av6Pitch  = 0.0f;
    av7Pitch  = 0.0f;
    av8Pitch  = 0.0f;
    av9Pitch = rpm / 4989.0f;
    av10Pitch = rpm / 5338.0f;
    av11Pitch  = 0.0f;
    av12Pitch  = 0.0f;
    av13Pitch  = 0.0f;

    av1Volume  = 0.0f;
    av2Volume  = 0.0f;
    av3Volume  = 0.0f;
    av4Volume  = 0.0f;
    av5Volume  = 0.0f;
    av6Volume  = 0.0f;
    av7Volume  = 0.0f;
    av8Volume  = 0.0f;
    av9Volume = av9Pitch - 1.0f;
    av10Volume = 1.0f - av9Volume;
    av11Volume  = 0.0f;
    av12Volume  = 0.0f;
    av13Volume  = 0.0f;
}

次に、13 個の AVAudioPlayers を調べて、プレーヤーのボリュームとレートを設定します。

if (audioPlayer2000.isPlaying) {
    //already playing, ready for volume / pitch adjustments

    audioPlayer2000.volume = av2Volume;
    audioPlayer2000.rate = av2Pitch;   
}
else{
    //nothing playing - play the file
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/1052.wav", [[NSBundle mainBundle] resourcePath]]];
    NSError *error;
    //NSData *songFile2 = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];
    audioPlayer2000 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    //audioPlayer2000 = [[AVAudioPlayer alloc] initWithData:songFile2 error:&error];
    audioPlayer2000.numberOfLoops = -1;
    audioPlayer2000.enableRate = YES;
    audioPlayer2000.rate = av2Pitch;
    audioPlayer2000.volume = av2Volume;

    if (audioPlayer2000 == nil) {
        NSLog([error description]);
    }
    else{
        [audioPlayer2000 play];
    }   
}

これは 1 つのファイルを再生している間は問題なく動作しますが、別のファイルを再生するように RPM 値を変更するとすぐに、RPM 値に関係なくすべてのサウンドが停止します。

これを停止する唯一の方法は、プレーヤーで setCurrentTime を呼び出すことですが、これにより再生が不安定になります。

ARC が再生されているのではないかと考えたので、すべてのプレーヤーのプロパティを作成しました。

ここで何か基本的なことが欠けていますか? それとも、正しいアプローチをしていませんか?

4

0 に答える 0