1

「ノード」と「ゾーン」という2つのAVAudioPlayerがあります。彼らは時々同時に演奏するでしょう。これが発生した場合、「ゾーン」のボリュームを0.2に下げる必要があります。'node'が終了したら、'zone'を元のボリューム(配列からプルイン)に戻す必要があります。私はadjustPlayerVolumeメソッドと、ノードが終了したときに'nodeIsPlaying'変数をfalseに設定する別のメソッドを持っています。これらは両方とも正常に機能します。

次のコードは、ボリュームを上げるか下げるか、そのままにする必要があるかを検出するために使用されています。これは、アプリが実行されている限り実行されるループ内にあります。

            NSLog(@"Zone Volume = %f", zonePlayer.volume);

            if ((nodeIsPlaying == false) && (zonePlayer.volume <= 0.200000)) {
                float maxVolume = [[[locationArray objectAtIndex:1] valueForKey:@"volume"] floatValue];
                [self adjustZoneVolume:maxVolume];
                NSLog(@"adjustZoneVolume called, node isn't playing and zonePlayer volume needs to be raised");
            }

            if ((nodeIsPlaying == true) && (zonePlayer.volume != 0.200000)) {

                float maxVolume = 0.2;
                [self adjustZoneVolume:maxVolume];
                NSLog(@"adjustZoneVolume called, node is playing and zonePlayer volume needs to be lowered");

            }

上部のログは、一貫して0.200000のボリュームをコンソールに出力します。

nodeIsPlayingがtrueに設定されている場合、NOT演算子でこれが発生しないようにする必要がありますが、一番下の条件が返されます。

nodeIsPlayingがfalseに設定されている場合、何も起こりません。

したがって、<=および!=操作に問題があります。

おそらく本当に愚かな何か...

何か案は?

前もって感謝します。

4

2 に答える 2

1

浮動小数点の精度の問題のようです。簡単なテスト スクリプトの実行:

int main (int argc, char const *argv[])
{
    float pointTwo = 0.2;

    if(pointTwo == 0.200000)
    {
         NSLog(@"Equal");
    }
    else NSLog(@"not equal");

   return 0;

}

「等しくない」と出ます。私の提案は、 != を避け、代わりに zonePlayer.volume が範囲 0.2 -/+ いくつかの小さな値にあるかどうかをテストすることです

于 2013-02-05T11:09:08.983 に答える
1

精度演算には NSDecimalNumber クラスを使用します。

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithFloat:zonePlayer.volume] decimalValue]];
NSDecimalNumber *number2 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithFloat:0.2f] decimalValue]];
NSComparisonResult comparisonResult = [number compare:number2];

if ((nodeIsPlaying == false) && (comparisonResult == NSOrderedSame || comparisonResult == NSOrderedDescending)) {

}
于 2013-02-05T11:22:50.670 に答える