Esempio n. 1
0
OSStatus	CAAudioChannelLayout::Restore (CFPropertyListRef &inData) 
{
	if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
	CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);

	RefCountedLayout *temp = NULL;
	AudioChannelLayout* layout;
	
	CFArrayRef descs = NULL;
	UInt32 numDescs = 0;

	if (dict.GetArray (kACLDescsKey, descs)) {
		numDescs = CFArrayGetCount (descs);
	}
	
	temp = RefCountedLayout::CreateWithNumberChannelDescriptions(numDescs);
	layout = temp->GetLayout();
		
	if (!dict.GetUInt32 (kACLTagKey, layout->mChannelLayoutTag))
		goto badget;
	if (dict.HasKey (kACLBitmapKey)) {
		if (!dict.GetUInt32 (kACLBitmapKey, layout->mChannelBitmap))
			goto badget;
	} else
		layout->mChannelBitmap = 0;
		
	layout->mNumberChannelDescriptions = numDescs;
	
	if (numDescs)
	{
		AudioChannelDescription *desc = layout->mChannelDescriptions;
		for (unsigned int i = 0; i < numDescs; ++i, ++desc)
		{
			CFDictionaryRef descDict = (CFDictionaryRef)CFArrayGetValueAtIndex (descs, i);			
			CACFDictionary theDesc (descDict, false);
			
			if (!theDesc.GetUInt32 (kACLLabelKey, desc->mChannelLabel))
				goto badget;
			if (!theDesc.GetUInt32 (kACLFlagsKey, desc->mChannelFlags))
				goto badget;
			if (!theDesc.GetFloat32 (kACLCoords0Key, desc->mCoordinates[0]))
				goto badget;
			if (!theDesc.GetFloat32 (kACLCoords1Key, desc->mCoordinates[1]))
				goto badget;
			if (!theDesc.GetFloat32 (kACLCoords2Key, desc->mCoordinates[2]))
				goto badget;
		}
	}
	if (mLayout)
		mLayout->release();

	mLayout = temp;
	
	return noErr;

badget:
	delete temp;
	return paramErr;
}
OSStatus	CAAudioChannelLayout::Restore (CFPropertyListRef &inData) 
{
	if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return -1;
	CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);

	ACLRefCounter *temp = NULL;
	UInt32 size = 0;
	AudioChannelLayout* layout;
	
	UInt32 numDescs;
	if (!dict.GetUInt32 (kACLDescKey, numDescs))
		goto badget;
	
	size = numDescs * sizeof (AudioChannelDescription) + offsetof(AudioChannelLayout, mChannelDescriptions[0]);
	temp = new ACLRefCounter (size);
	layout = temp->GetLayout();
		
	if (!dict.GetUInt32 (kACLTagKey, layout->mChannelLayoutTag))
		goto badget;
	if (!dict.GetUInt32 (kACLBitmapKey, layout->mChannelBitmap))
		goto badget;
	layout->mNumberChannelDescriptions = numDescs;
	
	if (numDescs)
	{
		static char string[32];
		AudioChannelDescription *desc = layout->mChannelDescriptions;
		for (unsigned int i = 0; i < numDescs; ++i, ++desc)
		{
			sprintf (string, "%d", i);
			CFDictionaryRef descDict;
			if (!dict.GetCFTypeWithCStringKey (string, static_cast<const void*>(descDict)))
				goto badget;
			CACFDictionary theDesc (descDict, false);
			
			if (!theDesc.GetUInt32 (kACLLabelKey, desc->mChannelLabel))
				goto badget;
			if (!theDesc.GetUInt32 (kACLFlagsKey, desc->mChannelFlags))
				goto badget;
			if (!theDesc.GetFloat32 (kACLCoords0Key, desc->mCoordinates[0]))
				goto badget;
			if (!theDesc.GetFloat32 (kACLCoords1Key, desc->mCoordinates[1]))
				goto badget;
			if (!theDesc.GetFloat32 (kACLCoords2Key, desc->mCoordinates[2]))
				goto badget;
		}
	}
	if (mLayoutHolder)
		mLayoutHolder->release();

	mLayoutHolder = temp;
	
	return noErr;

badget:
	delete temp;
	return -1;
}
static void	HP_PreferredChannels_ConstructLayoutFromDictionary(const CACFDictionary& inLayoutDictionary, AudioChannelLayout& outLayout)
{
	//	get the tag, bitmap
	inLayoutDictionary.GetUInt32(CFSTR("channel layout tag"), outLayout.mChannelLayoutTag);
	inLayoutDictionary.GetUInt32(CFSTR("channel bitmap"), outLayout.mChannelBitmap);
	
	//	get the number of channels specified in the dictionary
	UInt32 theNumberChannelsInDictionary = 0;
	inLayoutDictionary.GetUInt32(CFSTR("number channels"), theNumberChannelsInDictionary);
	
	//	get the descriptions if they are present and required
	CFArrayRef __theDescriptions;
	if((outLayout.mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) && inLayoutDictionary.GetArray(CFSTR("channel descriptions"), __theDescriptions))
	{
		//	don't release this array because it came straight out of the dictionary
		CACFArray theDescriptions(__theDescriptions, false);
		
		//	get the number of items in the array
		UInt32 theNumberItems = theDescriptions.GetNumberItems();
		
		//	iterate through the array and fill out the struct
		for(UInt32 theItemIndex = 0; (theItemIndex < theNumberItems) && (theItemIndex < outLayout.mNumberChannelDescriptions); ++theItemIndex)
		{
			//	get the description
			CFDictionaryRef __theDescription;
			if(theDescriptions.GetDictionary(theItemIndex, __theDescription))
			{
				//	don't release this dictionary because it came straight out of the array
				CACFDictionary theDescription(__theDescription, false);
				
				//	get the channel label and flags
				theDescription.GetUInt32(CFSTR("channel label"), outLayout.mChannelDescriptions[theItemIndex].mChannelLabel);
				theDescription.GetUInt32(CFSTR("channel flags"), outLayout.mChannelDescriptions[theItemIndex].mChannelFlags);
				
				//	get the coordinates
				CFArrayRef __theCoordinates;
				if(theDescription.GetArray(CFSTR("coordinates"), __theCoordinates))
				{
					//	don't release this array because it came straight out of the dictionary
					CACFArray theCoordinates(__theCoordinates, false);
					
					//	iterate through the array and get the coordinates
					UInt32 theNumberCoordinates = theCoordinates.GetNumberItems();
					for(UInt32 theCoordinateIndex = 0; (theCoordinateIndex < 3) && (theCoordinateIndex < theNumberCoordinates); ++theCoordinateIndex)
					{
						theCoordinates.GetFloat32(theCoordinateIndex, outLayout.mChannelDescriptions[theItemIndex].mCoordinates[theCoordinateIndex]);
					}
				}
			}
		}
	}
}
Esempio n. 4
0
void CAAUMIDIMap::Restore(CFDictionaryRef inData)
{	
	CACFDictionary paramDict (inData, false);

	if (!paramDict.GetUInt32 (kLocalScopeStr, mScope)) return; 
	if (!paramDict.GetUInt32 (kLocalElementIDStr, mElement)) return; 
	if (!paramDict.GetUInt32 (kLocalParameterIDStr, mParameterID)) return; 
	if (!paramDict.GetUInt32 (kMIDIFlagsStr, mFlags)) return;
	if (!paramDict.GetFloat32 (kMIDISubMinStr, mSubRangeMin)) return; 
	if (!paramDict.GetFloat32 (kMIDISubMaxStr, mSubRangeMax)) return; 
	UInt32 data;		
	if (!paramDict.GetUInt32 (kMIDIStatusStr, data)) return;
	mStatus = data;
	if (!paramDict.GetUInt32 (kMIDIDataByteStr, data)) return; 
	mData1 = data;
}