41 #if !defined(__CAPropertyAddress_h__)
42 #define __CAPropertyAddress_h__
49 #include "CADebugMacros.h"
52 #include <CoreAudio/AudioHardware.h>
70 struct CAPropertyAddress
72 public AudioObjectPropertyAddress
77 CAPropertyAddress() : AudioObjectPropertyAddress() { mSelector = 0; mScope = kAudioObjectPropertyScopeGlobal; mElement = kAudioObjectPropertyElementMaster; }
78 CAPropertyAddress(AudioObjectPropertySelector inSelector) : AudioObjectPropertyAddress() { mSelector = inSelector; mScope = kAudioObjectPropertyScopeGlobal; mElement = kAudioObjectPropertyElementMaster; }
79 CAPropertyAddress(AudioObjectPropertySelector inSelector, AudioObjectPropertyScope inScope) : AudioObjectPropertyAddress() { mSelector = inSelector; mScope = inScope; mElement = kAudioObjectPropertyElementMaster; }
80 CAPropertyAddress(AudioObjectPropertySelector inSelector, AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) : AudioObjectPropertyAddress() { mSelector = inSelector; mScope = inScope; mElement = inElement; }
81 CAPropertyAddress(
const AudioObjectPropertyAddress& inAddress) : AudioObjectPropertyAddress(inAddress){}
82 CAPropertyAddress(
const CAPropertyAddress& inAddress) : AudioObjectPropertyAddress(inAddress){}
83 CAPropertyAddress& operator=(
const AudioObjectPropertyAddress& inAddress) { AudioObjectPropertyAddress::operator=(inAddress);
return *
this; }
84 CAPropertyAddress& operator=(
const CAPropertyAddress& inAddress) { AudioObjectPropertyAddress::operator=(inAddress);
return *
this; }
88 static bool IsSameAddress(
const AudioObjectPropertyAddress& inAddress1,
const AudioObjectPropertyAddress& inAddress2) {
return (inAddress1.mScope == inAddress2.mScope) && (inAddress1.mSelector == inAddress2.mSelector) && (inAddress1.mElement == inAddress2.mElement); }
89 static bool IsCongruentSelector(AudioObjectPropertySelector inSelector1, AudioObjectPropertySelector inSelector2) {
return (inSelector1 == inSelector2) || (inSelector1 == kAudioObjectPropertySelectorWildcard) || (inSelector2 == kAudioObjectPropertySelectorWildcard); }
90 static bool IsCongruentScope(AudioObjectPropertyScope inScope1, AudioObjectPropertyScope inScope2) {
return (inScope1 == inScope2) || (inScope1 == kAudioObjectPropertyScopeWildcard) || (inScope2 == kAudioObjectPropertyScopeWildcard); }
91 static bool IsCongruentElement(AudioObjectPropertyElement inElement1, AudioObjectPropertyElement inElement2) {
return (inElement1 == inElement2) || (inElement1 == kAudioObjectPropertyElementWildcard) || (inElement2 == kAudioObjectPropertyElementWildcard); }
92 static bool IsCongruentAddress(
const AudioObjectPropertyAddress& inAddress1,
const AudioObjectPropertyAddress& inAddress2) {
return IsCongruentScope(inAddress1.mScope, inAddress2.mScope) && IsCongruentSelector(inAddress1.mSelector, inAddress2.mSelector) && IsCongruentElement(inAddress1.mElement, inAddress2.mElement); }
96 struct EqualTo :
public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
98 bool operator()(
const AudioObjectPropertyAddress& inAddress1,
const AudioObjectPropertyAddress& inAddress2)
const {
return IsSameAddress(inAddress1, inAddress2); }
101 struct LessThan :
public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
103 bool operator()(
const AudioObjectPropertyAddress& inAddress1,
const AudioObjectPropertyAddress& inAddress2)
const {
bool theAnswer =
false;
if(inAddress1.mScope != inAddress2.mScope) { theAnswer = inAddress1.mScope < inAddress2.mScope; }
else if(inAddress1.mSelector != inAddress2.mSelector) { theAnswer = inAddress1.mSelector < inAddress2.mSelector; }
else { theAnswer = inAddress1.mElement < inAddress2.mElement; }
return theAnswer; }
106 struct CongruentEqualTo :
public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
108 bool operator()(
const AudioObjectPropertyAddress& inAddress1,
const AudioObjectPropertyAddress& inAddress2)
const {
return IsCongruentAddress(inAddress1, inAddress2); }
111 struct CongruentLessThan :
public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
113 bool operator()(
const AudioObjectPropertyAddress& inAddress1,
const AudioObjectPropertyAddress& inAddress2)
const {
bool theAnswer =
false;
if(!IsCongruentScope(inAddress1.mScope, inAddress2.mScope)) { theAnswer = inAddress1.mScope < inAddress2.mScope; }
else if(!IsCongruentSelector(inAddress1.mSelector, inAddress2.mSelector)) { theAnswer = inAddress1.mSelector < inAddress2.mSelector; }
else if(!IsCongruentElement(inAddress1.mElement, inAddress2.mElement)) { theAnswer = inAddress1.mElement < inAddress2.mElement; }
return theAnswer; }
124 class CAPropertyAddressList
129 CAPropertyAddressList() : mAddressList() {}
130 CAPropertyAddressList(
const CAPropertyAddressList& inAddressList) : mAddressList(inAddressList.mAddressList) {}
131 CAPropertyAddressList& operator=(
const CAPropertyAddressList& inAddressList) { mAddressList = inAddressList.mAddressList;
return *
this; }
132 ~CAPropertyAddressList() {}
136 bool IsEmpty()
const {
return mAddressList.empty(); }
137 UInt32 GetNumberItems()
const {
return ToUInt32(mAddressList.size()); }
138 void GetItemByIndex(UInt32 inIndex, AudioObjectPropertyAddress& outAddress)
const {
if(inIndex < mAddressList.size()) { outAddress = mAddressList.at(inIndex); } }
139 const AudioObjectPropertyAddress* GetItems()
const {
return &(*mAddressList.begin()); }
140 AudioObjectPropertyAddress* GetItems() {
return &(*mAddressList.begin()); }
142 bool HasItem(
const AudioObjectPropertyAddress& inAddress)
const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::CongruentEqualTo(), inAddress));
return theIterator != mAddressList.end(); }
143 bool HasExactItem(
const AudioObjectPropertyAddress& inAddress)
const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::EqualTo(), inAddress));
return theIterator != mAddressList.end(); }
145 void AppendItem(
const AudioObjectPropertyAddress& inAddress) { mAddressList.push_back(inAddress); }
146 void AppendUniqueItem(
const AudioObjectPropertyAddress& inAddress) {
if(!HasItem(inAddress)) { mAddressList.push_back(inAddress); } }
147 void AppendUniqueExactItem(
const AudioObjectPropertyAddress& inAddress) {
if(!HasExactItem(inAddress)) { mAddressList.push_back(inAddress); } }
148 void InsertItemAtIndex(UInt32 inIndex,
const AudioObjectPropertyAddress& inAddress) {
if(inIndex < mAddressList.size()) { AddressList::iterator theIterator = mAddressList.begin(); std::advance(theIterator, inIndex); mAddressList.insert(theIterator, inAddress); }
else { mAddressList.push_back(inAddress); } }
149 void EraseExactItem(
const AudioObjectPropertyAddress& inAddress) { AddressList::iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::EqualTo(), inAddress));
if(theIterator != mAddressList.end()) { mAddressList.erase(theIterator); } }
150 void EraseItemAtIndex(UInt32 inIndex) {
if(inIndex < mAddressList.size()) { AddressList::iterator theIterator = mAddressList.begin(); std::advance(theIterator, inIndex); mAddressList.erase(theIterator); } }
151 void EraseAllItems() { mAddressList.clear(); }
155 typedef std::vector<CAPropertyAddress> AddressList;
157 AddressList mAddressList;