1

我有两个 AVAudioPlayer,分别称为“节点”和“区域”。他们有时会同时演奏。发生这种情况时,我需要将“区域”的音量降至 0.2。当“节点”完成时,我需要将“区域”返回到它的原始卷(从数组中拉入)。我有一个 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 回答