These are all good answers, but they do not concern the indication of the decay rate (or the application of the logarithmic curve to the decay, which is sometimes desirable), or specifying the amount of dB reduction from one that you disappear to.
this is an exception from one of my applications, with the removal of several "bells and whistles" that are not relevant to this issue.
enjoy it!
#define linearToDecibels(linear) (MIN(10,MAX(-100,20.0 * log10(linear)))) #define decibelsToLinear(decibels) (pow (10, (0.05 * decibels))) #define fadeInfoId(n) [fadeInfo objectForKey:@#n] #define fadeInfoObject(NSObject,n) ((NSObject*) fadeInfoId(n)) #define fadeInfoFloat(n) [fadeInfoId(n) floatValue] #define useFadeInfoObject(n) * n = fadeInfoId(n) #define useFadeInfoFloat(n) n = fadeInfoFloat(n) #define setFadeInfoId(n,x) [fadeInfo setObject:x forKey:@#n] #define setFadeInfoFloat(n,x) setFadeInfoId(n,[NSNumber numberWithFloat:x]) #define setFadeInfoFlag(n) setFadeInfoId(n,[NSNumber numberWithBool:YES]) #define saveFadeInfoId(n) setFadeInfoId(n,n) #define saveFadeInfoFloat(n) setFadeInfoFloat(n,n) #define fadeAVAudioPlayer_default nil #define fadeAVAudioPlayer_linearFade @"linearFade" #define fadeAVAudioPlayer_fadeToStop @"fadeToStop" #define fadeAVAudioPlayer_linearFadeToStop @"linearFadeToStop" -(void) fadeAVAudioPlayerTimerEvent:(NSTimer *) timer { NSMutableDictionary *fadeInfo = timer.userInfo; NSTimeInterval elapsed = 0 - [fadeInfoObject(NSDate,startTime) timeIntervalSinceNow]; NSTimeInterval useFadeInfoFloat(fadeTime); float useFadeInfoFloat(fadeToLevel); AVAudioPlayer useFadeInfoObject(player); double linear; if (elapsed>fadeTime) { if (fadeInfoId(stopPlaybackAtFadeTime)) { [player stop]; linear = fadeInfoFloat(fadeFromLevel); } else { linear = fadeToLevel; } [timer invalidate]; [fadeInfo release]; } else { if (fadeInfoId(linearCurve)) { float useFadeInfoFloat(fadeFromLevel); float fadeDelta = fadeToLevel-fadeFromLevel; linear = fadeFromLevel + (fadeDelta * (elapsed/fadeTime)); } else { float useFadeInfoFloat(fadeToDB); float useFadeInfoFloat(fadeFromDB); float fadeDelta = fadeToDB-fadeFromDB; float decibels = fadeFromDB + (fadeDelta * (elapsed/fadeTime)); linear = decibelsToLinear(decibels); } } [player setVolume: linear];
unsynchronized Sep 29 '11 at 10:44 2011-09-29 10:44
source share