summaryrefslogtreecommitdiff
path: root/libs/appleutility/CAAudioUnit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/appleutility/CAAudioUnit.cpp')
-rw-r--r--libs/appleutility/CAAudioUnit.cpp82
1 files changed, 80 insertions, 2 deletions
diff --git a/libs/appleutility/CAAudioUnit.cpp b/libs/appleutility/CAAudioUnit.cpp
index aaf57f233d..0e2cdbfe49 100644
--- a/libs/appleutility/CAAudioUnit.cpp
+++ b/libs/appleutility/CAAudioUnit.cpp
@@ -223,24 +223,102 @@ CAAudioUnit::CAAudioUnit (const AudioUnit& inUnit)
}
CAAudioUnit::CAAudioUnit (const CAComponent& inComp)
- : mComp (inComp), mDataPtr (0)
+ : mComp (inComp), mDataPtr (0), mPropertyCallback (0)
{
mDataPtr = new AUState (mComp.Comp());
}
CAAudioUnit::CAAudioUnit (const AUNode &inNode, const AudioUnit& inUnit)
- : mComp (inUnit), mDataPtr(new AUState (inNode, inUnit))
+ : mComp (inUnit), mDataPtr(new AUState (inNode, inUnit)), mPropertyCallback (0)
{
}
CAAudioUnit::~CAAudioUnit ()
{
+ dropPropertyListens ();
+
if (mDataPtr) {
mDataPtr->release();
mDataPtr = NULL;
}
}
+void
+CAAudioUnit::addPropertyListen (AudioUnitPropertyID id)
+{
+ if (mPropertyCallback == 0) {
+ return;
+ }
+
+ if (mWatching.find (id) != mWatching.end()) {
+ return;
+ }
+
+ if (AudioUnitAddPropertyListener (AU(), id, PropertyCallback, this) == noErr) {
+ mWatching.insert (id);
+ }
+}
+
+void
+CAAudioUnit::removePropertyListen (AudioUnitPropertyID id)
+{
+ if (!mPropertyCallback) {
+ return;
+ }
+ std::set<AudioUnitPropertyID>::iterator i = mWatching.find (id);
+ if (i != mWatching.end()) {
+ mWatching.erase (i);
+ }
+ /* this is for 10.6 and above ...
+ AudioUnitRemovePropertyListenerWithUserData (AU(), id, PropertyCallback, this);
+ */
+ AudioUnitRemovePropertyListener (AU(), id, PropertyCallback);
+}
+
+void
+CAAudioUnit::dropPropertyListens ()
+{
+ for (std::set<AudioUnitPropertyID>::iterator i = mWatching.begin(); i != mWatching.end(); ++i) {
+ /* this is for 10.6 and above ...
+ AudioUnitRemovePropertyListenerWithUserData (AU(), *i, PropertyCallback, this);
+ */
+ AudioUnitRemovePropertyListener (AU(), *i, PropertyCallback);
+ }
+ mWatching.clear ();
+}
+
+void
+CAAudioUnit::SetPropertyCallback (void (*prop_callback)(void*, int32_t, float, void*), void* arg)
+{
+ dropPropertyListens ();
+ mPropertyCallback = prop_callback;
+ mPropertyCallbackArg = arg;
+}
+
+void
+CAAudioUnit::PropertyCallback (void *inRefCon,
+ AudioUnit inUnit,
+ AudioUnitPropertyID inID,
+ AudioUnitScope inScope,
+ AudioUnitElement inElement)
+{
+ static_cast<CAAudioUnit*>(inRefCon)->
+ DoPropertyCallback (inUnit, inID, inScope, inElement);
+}
+
+void
+CAAudioUnit::DoPropertyCallback (AudioUnit inUnit,
+ AudioUnitPropertyID inID,
+ AudioUnitScope inScope,
+ AudioUnitElement inElement)
+{
+ if (mPropertyCallback) {
+ float value;
+ AudioUnitGetParameter (inUnit, inID, inScope, inElement, &value);
+ mPropertyCallback (this, inID, value, mPropertyCallbackArg);
+ }
+}
+
CAAudioUnit& CAAudioUnit::operator= (const CAAudioUnit &a)
{
if (mDataPtr != a.mDataPtr) {