41 #include "CACFArray.h"
42 #include "CACFDictionary.h"
44 #include "CAAudioUnit.h"
45 #include "CACFString.h"
46 #include "CAAudioChannelLayout.h"
47 #include "CAAUParameter.h"
48 #include "CAAUMIDIMap.h"
50 #include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacErrors.h>
52 #pragma mark __CAStreamBasicDescription
54 static const CFStringRef kSampleRate = CFSTR(
"sample rate");
55 static const CFStringRef kFormat = CFSTR(
"format");
56 static const CFStringRef kFormatFlags = CFSTR(
"format flags");
57 static const CFStringRef kPacketBytes = CFSTR(
"packet bytes");
58 static const CFStringRef kFramePackets = CFSTR(
"frame packets");
59 static const CFStringRef kFrameBytes = CFSTR(
"frame bytes");
60 static const CFStringRef kFrameChannels = CFSTR(
"frame channels");
61 static const CFStringRef kChannelBits = CFSTR(
"channel bits");
65 OSStatus CAStreamBasicDescription::Save (CFPropertyListRef *outData)
const
67 CACFDictionary dict(
false);
69 if (!dict.AddFloat64 (kSampleRate, mSampleRate))
goto error;
70 if (!dict.AddUInt32 (kFormat, mFormatID))
goto error;
71 if (!dict.AddUInt32 (kFormatFlags, mFormatFlags))
goto error;
72 if (!dict.AddUInt32 (kPacketBytes, mBytesPerPacket))
goto error;
73 if (!dict.AddUInt32 (kFramePackets, mFramesPerPacket))
goto error;
74 if (!dict.AddUInt32 (kFrameBytes, mBytesPerFrame))
goto error;
75 if (!dict.AddUInt32 (kFrameChannels, mChannelsPerFrame))
goto error;
76 if (!dict.AddUInt32 (kChannelBits, mBitsPerChannel))
goto error;
78 *outData = dict.GetDict();
83 dict.ShouldRelease (
true);
90 OSStatus CAStreamBasicDescription::Restore (CFPropertyListRef& inData)
92 if (CFGetTypeID (inData) != CFDictionaryGetTypeID())
return paramErr;
93 CACFDictionary dict(static_cast<CFDictionaryRef>(inData),
false);
95 if (!dict.GetFloat64 (kSampleRate, mSampleRate))
return paramErr;
96 if (!dict.GetUInt32 (kFormat, mFormatID))
return paramErr;
97 if (!dict.GetUInt32 (kFormatFlags, mFormatFlags))
return paramErr;
98 if (!dict.GetUInt32 (kPacketBytes, mBytesPerPacket))
return paramErr;
99 if (!dict.GetUInt32 (kFramePackets, mFramesPerPacket))
return paramErr;
100 if (!dict.GetUInt32 (kFrameBytes, mBytesPerFrame))
return paramErr;
101 if (!dict.GetUInt32 (kFrameChannels, mChannelsPerFrame))
return paramErr;
102 if (!dict.GetUInt32 (kChannelBits, mBitsPerChannel))
return paramErr;
107 #pragma mark __CAComponentDescription
109 static const CFStringRef kType = CFSTR(
"type");
110 static const CFStringRef kSubType = CFSTR(
"subtype");
111 static const CFStringRef kManu = CFSTR(
"manufacturer");
113 OSStatus CAComponentDescription::Save (CFPropertyListRef *outData)
const
115 CACFDictionary dict(
false);
116 if (!dict.AddUInt32 (kType, componentType))
goto error;
117 if (!dict.AddUInt32 (kSubType, componentSubType))
goto error;
118 if (!dict.AddUInt32 (kManu, componentManufacturer))
goto error;
120 *outData = dict.GetDict();
124 dict.ShouldRelease (
true);
128 OSStatus CAComponentDescription::Restore (CFPropertyListRef &inData)
130 if (CFGetTypeID (inData) != CFDictionaryGetTypeID())
return paramErr;
131 CACFDictionary dict(static_cast<CFDictionaryRef>(inData),
false);
133 if (!dict.GetUInt32 (kType, componentType))
return paramErr;
134 if (!dict.GetUInt32 (kSubType, componentSubType))
return paramErr;
135 if (!dict.GetUInt32 (kManu, componentManufacturer))
return paramErr;
138 componentFlagsMask = 0;
143 #pragma mark __CAComponent
145 OSStatus CAComponent::Save (CFPropertyListRef *outData)
const
147 OSStatus result = mDesc.Save (outData);
148 if (result)
return result;
152 CFStringRef name = GetCompName ();
153 if (name && *outData)
154 CFDictionarySetValue ((CFMutableDictionaryRef)(*outData), CFSTR(
"name"), name);
159 OSStatus CAComponent::Restore (CFPropertyListRef &inData)
161 if (mDesc.Restore (inData))
return paramErr;
165 mComp = AudioComponentFindNext (NULL, &mDesc);
168 AudioComponentGetDescription (Comp(), &mDesc);
174 #pragma mark __CAAudioChannelLayout
176 static const CFStringRef kACLTagKey = CFSTR(
"acl tag");
177 static const CFStringRef kACLBitmapKey = CFSTR(
"chan bitmap");
178 static const CFStringRef kACLLabelKey = CFSTR(
"label");
179 static const CFStringRef kACLFlagsKey = CFSTR(
"flags");
180 static const CFStringRef kACLCoords0Key = CFSTR(
"coords 0");
181 static const CFStringRef kACLCoords1Key = CFSTR(
"coords 1");
182 static const CFStringRef kACLCoords2Key = CFSTR(
"coords 2");
183 static const CFStringRef kACLDescsKey = CFSTR(
"descriptions");
185 OSStatus CAAudioChannelLayout::Save (CFPropertyListRef *outData)
const
187 const AudioChannelLayout& layout = Layout();
189 CACFDictionary dict (
false);
190 if (!dict.AddUInt32 (kACLTagKey, layout.mChannelLayoutTag))
192 if (layout.mChannelBitmap && !dict.AddUInt32 (kACLBitmapKey, layout.mChannelBitmap))
195 if (layout.mNumberChannelDescriptions)
197 CFMutableArrayRef descs = CFArrayCreateMutable (NULL, layout.mNumberChannelDescriptions, &kCFTypeArrayCallBacks);
199 const AudioChannelDescription *desc = layout.mChannelDescriptions;
200 for (
unsigned int i = 0; i < layout.mNumberChannelDescriptions; ++i, ++desc)
202 CACFDictionary descDict (
true);
203 if (!descDict.AddUInt32 (kACLLabelKey, desc->mChannelLabel))
204 { CFRelease (descs);
goto badadd; }
205 if (!descDict.AddUInt32 (kACLFlagsKey, desc->mChannelFlags))
206 { CFRelease (descs);
goto badadd; }
207 if (!descDict.AddFloat32 (kACLCoords0Key, desc->mCoordinates[0]))
208 { CFRelease (descs);
goto badadd; }
209 if (!descDict.AddFloat32 (kACLCoords1Key, desc->mCoordinates[1]))
210 { CFRelease (descs);
goto badadd; }
211 if (!descDict.AddFloat32 (kACLCoords2Key, desc->mCoordinates[2]))
212 { CFRelease (descs);
goto badadd; }
214 CFArrayAppendValue (descs, descDict.AsPropertyList());
216 dict.AddArray (kACLDescsKey, descs);
221 *outData = dict.GetDict();
226 dict.ShouldRelease(
true);
230 OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
232 if (CFGetTypeID (inData) != CFDictionaryGetTypeID())
return paramErr;
233 CACFDictionary dict(static_cast<CFDictionaryRef>(inData),
false);
235 RefCountedLayout *temp = NULL;
236 AudioChannelLayout* layout;
238 CFArrayRef descs = NULL;
241 if (dict.GetArray (kACLDescsKey, descs)) {
242 numDescs = CFArrayGetCount (descs);
245 temp = RefCountedLayout::CreateWithNumberChannelDescriptions(numDescs);
246 layout = temp->GetLayout();
248 if (!dict.GetUInt32 (kACLTagKey, layout->mChannelLayoutTag))
250 if (dict.HasKey (kACLBitmapKey)) {
251 if (!dict.GetUInt32 (kACLBitmapKey, layout->mChannelBitmap))
254 layout->mChannelBitmap = 0;
256 layout->mNumberChannelDescriptions = numDescs;
260 AudioChannelDescription *desc = layout->mChannelDescriptions;
261 for (
unsigned int i = 0; i < numDescs; ++i, ++desc)
263 CFDictionaryRef descDict = (CFDictionaryRef)CFArrayGetValueAtIndex (descs, i);
264 CACFDictionary theDesc (descDict,
false);
266 if (!theDesc.GetUInt32 (kACLLabelKey, desc->mChannelLabel))
268 if (!theDesc.GetUInt32 (kACLFlagsKey, desc->mChannelFlags))
270 if (!theDesc.GetFloat32 (kACLCoords0Key, desc->mCoordinates[0]))
272 if (!theDesc.GetFloat32 (kACLCoords1Key, desc->mCoordinates[1]))
274 if (!theDesc.GetFloat32 (kACLCoords2Key, desc->mCoordinates[2]))
290 #pragma mark __AudioUnitParameter
292 static const CFStringRef kAUScopeStr = CFSTR(
"scope");
293 static const CFStringRef kAUElementIDStr = CFSTR(
"element ID");
294 static const CFStringRef kAUParameterIDStr = CFSTR(
"paramID");
296 void CAAUParameter::Save (CFPropertyListRef &outData)
const
298 return CAAUParameter::Save (*
this, outData);
302 void CAAUParameter::Save (
const AudioUnitParameter &inParam, CFPropertyListRef &outData)
304 CACFDictionary dict(
false);
305 dict.AddUInt32 (kAUScopeStr, inParam.mScope);
306 dict.AddUInt32 (kAUElementIDStr, inParam.mElement);
307 dict.AddUInt32 (kAUParameterIDStr, inParam.mParameterID);
309 outData = dict.AsPropertyList();
312 OSStatus CAAUParameter::Restore (
const CFPropertyListRef inData, AudioUnitParameter &outParam)
314 if (CFGetTypeID (inData) != CFDictionaryGetTypeID())
return paramErr;
315 CACFDictionary dict(static_cast<CFDictionaryRef>(inData),
false);
317 if (!dict.GetUInt32 (kAUScopeStr, outParam.mScope))
return paramErr;
318 if (!dict.GetUInt32 (kAUElementIDStr, outParam.mElement))
return paramErr;
319 if (!dict.GetUInt32 (kAUParameterIDStr, outParam.mParameterID))
return paramErr;
324 #pragma mark __MIDIMap
326 const CFStringRef kParamMIDIStr = CFSTR(
"param maps");
328 const CFStringRef kMIDIFlagsStr = CFSTR(
"flags");
329 const CFStringRef kMIDISubMinStr = CFSTR(
"sub min");
330 const CFStringRef kMIDISubMaxStr = CFSTR(
"sub max");
331 const CFStringRef kMIDIStatusStr = CFSTR(
"midi status byte");
332 const CFStringRef kMIDIDataByteStr = CFSTR(
"midi data1 byte");
333 const CFStringRef kAUStr = CFSTR(
"unit");
335 static const CFStringRef kLocalElementIDStr = CFSTR(
"element ID");
336 static const CFStringRef kLocalScopeStr = CFSTR(
"scope");
337 static const CFStringRef kLocalParameterIDStr = CFSTR(
"paramID");
339 void CAAUMIDIMap::Save(CFPropertyListRef &outData)
const
341 CACFDictionary paramDict(
false);
343 paramDict.AddUInt32 (kLocalScopeStr, mScope);
344 paramDict.AddUInt32 (kLocalElementIDStr, mElement);
345 paramDict.AddUInt32 (kLocalParameterIDStr, mParameterID);
346 paramDict.AddUInt32 (kMIDIFlagsStr, mFlags);
347 paramDict.AddFloat32 (kMIDISubMinStr, mSubRangeMin);
348 paramDict.AddFloat32 (kMIDISubMaxStr, mSubRangeMax);
350 UInt32 data = mStatus;
351 paramDict.AddUInt32 (kMIDIStatusStr, data);
354 paramDict.AddUInt32 (kMIDIDataByteStr, data);
356 outData = paramDict.GetCFDictionary();
359 void CAAUMIDIMap::Restore(CFDictionaryRef inData)
361 CACFDictionary paramDict (inData,
false);
363 if (!paramDict.GetUInt32 (kLocalScopeStr, mScope))
return;
364 if (!paramDict.GetUInt32 (kLocalElementIDStr, mElement))
return;
365 if (!paramDict.GetUInt32 (kLocalParameterIDStr, mParameterID))
return;
366 if (!paramDict.GetUInt32 (kMIDIFlagsStr, mFlags))
return;
367 if (!paramDict.GetFloat32 (kMIDISubMinStr, mSubRangeMin))
return;
368 if (!paramDict.GetFloat32 (kMIDISubMaxStr, mSubRangeMax))
return;
370 if (!paramDict.GetUInt32 (kMIDIStatusStr, data))
return;
372 if (!paramDict.GetUInt32 (kMIDIDataByteStr, data))
return;
376 void CAAUMIDIMap::SaveAsMapPList (AudioUnit inUnit,
const AUParameterMIDIMapping* inMappings, UInt32 inNumMappings, CFPropertyListRef &outData, CFStringRef inName)
379 CACFDictionary mappingDict (
false);
380 CACFArray maps (
true);
382 for (UInt32 i = 0; i< inNumMappings; ++i)
384 CFPropertyListRef data;
385 CAAUMIDIMap paramMap(inMappings[i]);
386 paramMap.Save (data);
389 maps.AppendCFType (data);
394 if (maps.GetNumberItems()) {
395 mappingDict.AddCFType (kParamMIDIStr, maps.GetCFArray());
398 CAAudioUnit au (inUnit);
399 CFPropertyListRef data;
400 au.Comp().Save (&data);
402 mappingDict.AddCFType (kAUStr, data);
405 if (!inName) inName = CFSTR(
"Untitled");
406 mappingDict.AddString (CFSTR(
"name"), inName);
408 mappingDict.AddUInt32 (CFSTR(
"version"), 1);
410 outData = mappingDict.AsPropertyList();
412 mappingDict.ShouldRelease(
true);
417 UInt32 CAAUMIDIMap::NumberOfMaps (
const CFDictionaryRef inData)
419 CACFDictionary dict (inData,
false);
421 if (dict.HasKey (kParamMIDIStr))
424 dict.GetArray (kParamMIDIStr, cfArray);
426 CACFArray array (cfArray,
false);
428 return array.GetNumberItems();
433 void CAAUMIDIMap::RestoreFromMapPList (
const CFDictionaryRef inData, AUParameterMIDIMapping* outMappings, UInt32 inNumMappings)
436 CACFDictionary dict (inData,
false);
438 if (dict.HasKey (kParamMIDIStr))
441 dict.GetArray (kParamMIDIStr, cfArray);
443 CACFArray array (cfArray,
false);
445 UInt32 count = array.GetNumberItems();
446 if (count > inNumMappings)
447 count = inNumMappings;
449 for (
unsigned int i = 0; i < count; ++i)
451 CFDictionaryRef paramsDictRef;
452 if (!array.GetDictionary(i, paramsDictRef))
455 CAAUMIDIMap parameterMap;
456 parameterMap.Restore(paramsDictRef);
457 outMappings[i] = parameterMap;