2013-02-05 80 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 -/+一些小值範圍內