41 #if !defined(__CAAudioChannelLayout_h__)
42 #define __CAAudioChannelLayout_h__
49 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
50 #include <CoreAudio/CoreAudioTypes.h>
51 #include <CoreFoundation/CoreFoundation.h>
53 #include <CoreAudioTypes.h>
54 #include <CoreFoundation.h>
60 #include "CADebugMacros.h"
61 #include "CAAutoDisposer.h"
64 #include "CAReferenceCounted.h"
71 bool operator== (
const AudioChannelLayout &x,
const AudioChannelLayout &y);
73 extern "C" void CAShowAudioChannelLayout (FILE* file,
const AudioChannelLayout *layout);
75 class CAAudioChannelLayout
79 static AudioChannelLayout* Create(UInt32 inNumberChannelDescriptions);
80 static void Destroy(AudioChannelLayout* inChannelLayout);
81 static UInt32 CalculateByteSize(UInt32 inNumberChannelDescriptions) {
82 return OffsetOf32(AudioChannelLayout, mChannelDescriptions) + inNumberChannelDescriptions * SizeOf32(AudioChannelDescription);
84 static void SetAllToUnknown(AudioChannelLayout& outChannelLayout, UInt32 inNumberChannelDescriptions);
85 static UInt32 NumberChannels(
const AudioChannelLayout& inLayout);
90 CAAudioChannelLayout ();
92 CAAudioChannelLayout (UInt32 inNumberChannels,
bool inChooseSurround);
97 CAAudioChannelLayout (AudioChannelLayoutTag inTag);
98 CAAudioChannelLayout (
const CAAudioChannelLayout &c);
99 CAAudioChannelLayout (
const AudioChannelLayout* inChannelLayout);
100 ~CAAudioChannelLayout();
102 CAAudioChannelLayout& operator= (
const AudioChannelLayout* inChannelLayout);
103 CAAudioChannelLayout& operator= (
const CAAudioChannelLayout& c);
104 bool operator== (
const CAAudioChannelLayout &c)
const;
106 void SetWithTag(AudioChannelLayoutTag inTag);
108 bool IsValid()
const {
return NumberChannels() > 0; }
109 UInt32 Size()
const {
return mLayout ? mLayout->Size() : 0; }
111 UInt32 NumberChannels()
const {
return mLayout ? mLayout->NumberChannels() : 0; }
113 AudioChannelLayoutTag Tag()
const {
return Layout().mChannelLayoutTag; }
114 const AudioChannelLayout& Layout()
const {
return mLayout->Layout(); }
115 operator const AudioChannelLayout *()
const {
return &Layout(); }
117 void Print ()
const { Print (stdout); }
118 void Print (FILE* file)
const;
120 OSStatus Save (CFPropertyListRef *outData)
const;
121 OSStatus Restore (CFPropertyListRef &inData);
124 class RefCountedLayout :
public CAReferenceCounted {
125 void *
operator new(
size_t size,
size_t aclSize)
127 return CA_malloc(
sizeof(RefCountedLayout) -
sizeof(AudioChannelLayout) + aclSize);
130 void operator delete(
void *mem)
136 RefCountedLayout(UInt32 inDataSize) :
137 mByteSize(inDataSize)
139 memset(&mACL, 0, inDataSize);
143 static RefCountedLayout *CreateWithNumberChannelDescriptions(
unsigned nChannels) {
144 size_t size = CAAudioChannelLayout::CalculateByteSize(nChannels);
145 return new(size) RefCountedLayout(size);
148 static RefCountedLayout *CreateWithLayout(
const AudioChannelLayout *layout) {
149 size_t size = CAAudioChannelLayout::CalculateByteSize(layout->mNumberChannelDescriptions);
150 RefCountedLayout *acl =
new(size) RefCountedLayout(size);
151 memcpy(&acl->mACL, layout, size);
154 static RefCountedLayout *CreateWithLayoutTag(AudioChannelLayoutTag layoutTag) {
155 RefCountedLayout *acl = CreateWithNumberChannelDescriptions(0);
156 acl->mACL.mChannelLayoutTag = layoutTag;
160 const AudioChannelLayout & Layout()
const {
return mACL; }
162 UInt32 Size ()
const {
return mByteSize; }
164 UInt32 NumberChannels() {
return CAAudioChannelLayout::NumberChannels(Layout()); }
167 const UInt32 mByteSize;
168 AudioChannelLayout mACL;
172 friend CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels,
bool inChooseSurround);
173 friend OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData);
174 friend CAAudioChannelLayout& CAAudioChannelLayout::operator= (
const AudioChannelLayout* inChannelLayout);
175 friend void CAAudioChannelLayout::SetWithTag(AudioChannelLayoutTag inTag);
177 AudioChannelLayout * GetLayout() {
return &mACL; }
182 RefCountedLayout(
const RefCountedLayout& c);
183 RefCountedLayout& operator=(
const RefCountedLayout& c);
186 RefCountedLayout *mLayout;
bool TTFOUNDATION_EXPORT operator==(const TTObject &anObject, const TTObject &anotherObject)
Compare two objects for equality.