41 #include "CAAUParameter.h"
43 CAAUParameter::CAAUParameter()
45 memset(
this, 0,
sizeof(CAAUParameter));
48 CAAUParameter::CAAUParameter(AudioUnit au, AudioUnitParameterID param, AudioUnitScope scope, AudioUnitElement element)
50 memset(
this, 0,
sizeof(CAAUParameter));
51 Init (au, param, scope, element);
54 CAAUParameter::CAAUParameter (AudioUnitParameter &inParam)
56 memset(
this, 0,
sizeof(CAAUParameter));
57 Init (inParam.mAudioUnit, inParam.mParameterID, inParam.mScope, inParam.mElement);
60 CAAUParameter::CAAUParameter(
const CAAUParameter &a)
62 memset(
this, 0,
sizeof(CAAUParameter));
66 CAAUParameter & CAAUParameter::operator = (
const CAAUParameter &a)
68 if (mParamName) CFRelease(mParamName);
69 if (mParamTag) CFRelease(mParamTag);
70 if (mNamedParams) CFRelease(mNamedParams);
72 memcpy(
this, &a,
sizeof(CAAUParameter));
74 if (mParamName) CFRetain(mParamName);
75 if (mParamTag) CFRetain(mParamTag);
76 if (mNamedParams) CFRetain(mNamedParams);
81 CAAUParameter::~CAAUParameter()
83 if (mParamName) CFRelease(mParamName);
84 if (mParamTag) CFRelease(mParamTag);
85 if (mNamedParams) CFRelease (mNamedParams);
88 void CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitScope scope, AudioUnitElement element)
95 UInt32 propertySize =
sizeof(mParamInfo);
96 OSStatus err = AudioUnitGetProperty(au, kAudioUnitProperty_ParameterInfo,
97 scope, param, &mParamInfo, &propertySize);
99 memset(&mParamInfo, 0,
sizeof(mParamInfo));
100 if (mParamInfo.flags & kAudioUnitParameterFlag_HasCFNameString) {
101 mParamName = mParamInfo.cfNameString;
102 if (!(mParamInfo.flags & kAudioUnitParameterFlag_CFNameRelease))
103 CFRetain (mParamName);
105 mParamName = CFStringCreateWithCString(NULL, mParamInfo.name, kCFStringEncodingUTF8);
108 switch (mParamInfo.unit)
110 case kAudioUnitParameterUnit_Boolean:
113 case kAudioUnitParameterUnit_Percent:
114 case kAudioUnitParameterUnit_EqualPowerCrossfade:
117 case kAudioUnitParameterUnit_Seconds:
120 case kAudioUnitParameterUnit_SampleFrames:
123 case kAudioUnitParameterUnit_Phase:
124 case kAudioUnitParameterUnit_Degrees:
127 case kAudioUnitParameterUnit_Hertz:
130 case kAudioUnitParameterUnit_Cents:
131 case kAudioUnitParameterUnit_AbsoluteCents:
134 case kAudioUnitParameterUnit_RelativeSemiTones:
137 case kAudioUnitParameterUnit_MIDINoteNumber:
138 case kAudioUnitParameterUnit_MIDIController:
141 mNumIndexedParams = short(mParamInfo.maxValue+1 - mParamInfo.minValue);
143 case kAudioUnitParameterUnit_Decibels:
146 case kAudioUnitParameterUnit_MixerFaderCurve1:
147 case kAudioUnitParameterUnit_LinearGain:
150 case kAudioUnitParameterUnit_Pan:
153 case kAudioUnitParameterUnit_Meters:
156 case kAudioUnitParameterUnit_Octaves:
159 case kAudioUnitParameterUnit_BPM:
162 case kAudioUnitParameterUnit_Beats:
165 case kAudioUnitParameterUnit_Milliseconds:
168 case kAudioUnitParameterUnit_Ratio:
171 case kAudioUnitParameterUnit_Indexed:
173 propertySize =
sizeof(mNamedParams);
174 err = AudioUnitGetProperty (au,
175 kAudioUnitProperty_ParameterValueStrings,
180 if (!err && mNamedParams) {
181 mNumIndexedParams = CFArrayGetCount(mNamedParams);
184 mNumIndexedParams = short(mParamInfo.maxValue+1 - mParamInfo.minValue);
189 case kAudioUnitParameterUnit_CustomUnit:
191 CFStringRef unitName = mParamInfo.unitName;
192 static char paramStr[256];
193 CFStringGetCString (unitName, paramStr, 256, kCFStringEncodingUTF8);
194 if (mParamInfo.flags & kAudioUnitParameterFlag_CFNameRelease)
195 CFRelease (unitName);
199 case kAudioUnitParameterUnit_Generic:
200 case kAudioUnitParameterUnit_Rate:
207 mParamTag = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
213 Float32 CAAUParameter::GetValue()
const
217 AudioUnitGetParameter(mAudioUnit, mParameterID, mScope, mElement, &value);
221 CFStringRef CreateLocalizedStringForParameterValue (
double inParameterValue,
222 const CAAUParameter * inParameter,
225 if (!inParameter)
return nil;
227 AudioUnitParameterInfo info = inParameter->ParamInfo();
231 case kAudioUnitParameterUnit_Hertz:
233 pow10 = int(log10(fmax(inParameterValue, .000001)));
237 pow10 = int(log10(fmax(
double(info.maxValue - info.minValue), .000001)));
250 int nDigitsAfterDecimal = inDigits - (pow10 + 1);
251 if (nDigitsAfterDecimal < 0)
252 nDigitsAfterDecimal = 0;
254 if (info.flags & kAudioUnitParameterFlag_IsHighResolution)
255 nDigitsAfterDecimal = 4;
257 CFLocaleRef currentLocale = CFLocaleCopyCurrent();
258 CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate (NULL, currentLocale, kCFNumberFormatterDecimalStyle);
260 CFNumberRef maxFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
262 if (nDigitsAfterDecimal > 0)
263 nDigitsAfterDecimal = minDigits;
265 CFNumberRef minFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
267 CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMinFractionDigits, minFractionDigits);
268 CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMaxFractionDigits, maxFractionDigits);
269 CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue (NULL, numberFormatter, kCFNumberDoubleType, &inParameterValue);
271 CFRelease(currentLocale);
272 CFRelease(numberFormatter);
273 CFRelease(maxFractionDigits);
274 CFRelease(minFractionDigits);
276 return formattedNumberString;
279 CFStringRef CreateLocalizedStringForParameterValue (
double inParameterValue,
280 const CAAUParameter * inParameter,
282 return CreateLocalizedStringForParameterValue (inParameterValue, inParameter, inDigits, 1);
285 double ValueForLocalizedParameterString (CFStringRef
string,
const CAAUParameter * inParameter) {
286 CFLocaleRef currentLocale = CFLocaleCopyCurrent();
287 CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate (NULL, currentLocale, kCFNumberFormatterDecimalStyle);
290 Boolean worked = CFNumberFormatterGetValueFromString (numberFormatter,
string, NULL, kCFNumberDoubleType, &value);
292 CFRelease(currentLocale);
293 CFRelease(numberFormatter);
298 AudioUnitParameterInfo info = inParameter->ParamInfo();
299 return info.defaultValue;
303 CFStringRef CAAUParameter::GetStringFromValueCopy(
const Float32 *value)
const
305 if (HasNamedParams())
307 Float32 val = (value == NULL ? GetValue() : *value);
308 int index = int(mParamInfo.minValue) + int(val);
309 CFStringRef str = GetParamName (index);
315 else if (ValuesHaveStrings())
317 AudioUnitParameterStringFromValue stringValue;
318 stringValue.inParamID = mParameterID;
319 stringValue.inValue = value;
320 stringValue.outString = NULL;
321 UInt32 propertySize =
sizeof(stringValue);
323 OSStatus err = AudioUnitGetProperty (mAudioUnit,
324 kAudioUnitProperty_ParameterStringFromValue,
330 if (!err && stringValue.outString != NULL)
331 return stringValue.outString;
334 Float32 val = (value == NULL ? GetValue() : *value);
335 AudioUnitParameterUnit unit = this->ParamInfo().unit;
336 if (unit == kAudioUnitParameterUnit_Cents || unit == kAudioUnitParameterUnit_AbsoluteCents)
337 return CreateLocalizedStringForParameterValue(val,
this, 4, 0);
339 return CreateLocalizedStringForParameterValue(val,
this, 4);
342 Float32 CAAUParameter::GetValueFromString(CFStringRef str)
const
344 if (ValuesHaveStrings())
346 AudioUnitParameterValueFromString valueString;
347 valueString.inParamID = mParameterID;
348 valueString.inString = str;
349 UInt32 propertySize =
sizeof(valueString);
351 OSStatus err = AudioUnitGetProperty (mAudioUnit,
352 kAudioUnitProperty_ParameterValueFromString,
359 return valueString.outValue;
363 return (Float32) ValueForLocalizedParameterString(str,
this);
366 void CAAUParameter::SetValue( AUParameterListenerRef inListener,
368 Float32 inValue)
const
371 Float32 valueToSet = inValue;
372 if (valueToSet > mParamInfo.maxValue)
373 valueToSet = mParamInfo.maxValue;
374 if (valueToSet < mParamInfo.minValue)
375 valueToSet = mParamInfo.minValue;
377 AUParameterSet(inListener, inObject,
this, valueToSet, 0);
381 void CAAUParameter::Print()
const
386 UInt32 len = CFStringGetLength(mParamName);
387 char* chars = (
char*)malloc (len * 2);
388 if (!CFStringGetCString (mParamName, chars, len * 2, kCFStringEncodingUTF8))
391 printf (
"ID: %ld, Clump: %u, Name: %s\n", (
long unsigned int) mParameterID, (
unsigned int) clump, chars);