2013-02-05 41 views
1

我有两个AVAudioPlayers,称为“节点”和“区域”。他们有时会在同一时间玩。当发生这种情况时,我需要将“区域”的音量降至0.2。当'node'结束时,我需要将'zone'返回到它的原始卷(从数组中拉入)。我有一个adjustPlayerVolume方法,另一种方法是在节点完成时将'nodeIsPlaying'变量设置为false。这两项工作都很好。AVAudioPlayer音量条件不正确返回

以下代码正在用于检测卷是否需要上升或下降或保持原样。只要应用程序运行,它就在一个循环内运行。

  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时,什么都不会发生。

所以< =和!=操作有问题。

也许真的很愚蠢......

任何想法?

在此先感谢。

回答

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)) { 

} 
+0

感谢AntonPalich,看起来像它会做的伎俩。 – MightyMeta

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 -/+一些小值范围内