Don't update unused dsp timer variable in freewheel process in PortaudioBackend
[ardour.git] / libs / appleutility / CAAudioUnit.cpp
index 9244877d29f27e9e9d52ae753b82bebe2f74a21c..54c4ecef2f10ef71099ec03deb6d3690d2fb33e7 100644 (file)
@@ -191,7 +191,7 @@ private:
 private:
                // get the compiler to tell us when we do a bad thing!!!
        AUState () {}
-       AUState (const AUState&) {}
+        AUState (const AUState& other) : CAReferenceCounted (other) {}
        AUState& operator= (const AUState&) { return *this; } 
 };                                             
                                                
@@ -305,8 +305,8 @@ bool                CAAudioUnit::CanDo (    int                             inChannelsIn,
                // is expected to deal with same channel valance in and out
        if (result) 
        {
-               if (Comp().Desc().IsEffect() && (inChannelsIn == inChannelsOut)
-                       || Comp().Desc().IsOffline() && (inChannelsIn == inChannelsOut))
+               if ((Comp().Desc().IsEffect() && (inChannelsIn == inChannelsOut))
+                       || (Comp().Desc().IsOffline() && (inChannelsIn == inChannelsOut)))
                {
                        return true;
                }
@@ -328,6 +328,81 @@ bool               CAAudioUnit::CanDo (    int                             inChannelsIn,
        return ValidateChannelPair (inChannelsIn, inChannelsOut, info.mChanInfo, (dataSize / sizeof (AUChannelInfo)));
 }
 
+int    CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
+{
+       // this is the default assumption of an audio effect unit
+       Boolean* isWritable = 0;
+       UInt32  dataSize = 0;
+               // lets see if the unit has any channel restrictions
+       OSStatus result = AudioUnitGetPropertyInfo (AU(),
+                                                   kAudioUnitProperty_SupportedNumChannels,
+                                                   kAudioUnitScope_Global, 0,
+                                                   &dataSize, isWritable); //don't care if this is writable
+       
+       // if this property is NOT implemented an FX unit
+       // is expected to deal with same channel valance in and out
+       
+       if (result) 
+       {
+               if (Comp().Desc().IsEffect()) 
+               {
+                       return 1;
+               }
+               else if (Comp().Desc().IsGenerator() || Comp().Desc().IsMusicDevice()) {
+                       // directly query Bus Formats
+                       // Note that that these may refer to different subBusses
+                       // (eg. Kick, Snare,.. on a Drummachine)
+                       // eventually the Bus-Name for each configuration should be exposed
+                       // for the User to select..
+
+                       UInt32 elCountIn, elCountOut;
+
+                       if (GetElementCount (kAudioUnitScope_Input, elCountIn)) return -1;
+                       if (GetElementCount (kAudioUnitScope_Output, elCountOut)) return -1;
+
+                       cnt = std::max(elCountIn, elCountOut);
+
+                       *chaninfo = (AUChannelInfo*) malloc (sizeof (AUChannelInfo) * cnt);
+
+                       for (unsigned int i = 0; i < elCountIn; ++i) {
+                               UInt32 numChans;
+                               if (NumberChannels (kAudioUnitScope_Input, i, numChans)) return -1;
+                               (*chaninfo)[i].inChannels = numChans;
+                       }
+                       for (unsigned int i = elCountIn; i < cnt; ++i) {
+                               (*chaninfo)[i].inChannels = 0;
+                       }
+
+                       for (unsigned int i = 0; i < elCountOut; ++i) {
+                               UInt32 numChans;
+                               if (NumberChannels (kAudioUnitScope_Output, i, numChans)) return -1;
+                               (*chaninfo)[i].outChannels = numChans;
+                       }
+                       for (unsigned int i = elCountOut; i < cnt; ++i) {
+                               (*chaninfo)[i].outChannels = 0;
+                       }
+                       return 0;
+               }
+               else 
+               {
+                       // the au should either really tell us about this
+                       // or we will assume the worst
+                       return -1;
+               }
+       }
+
+       *chaninfo = (AUChannelInfo*) malloc (dataSize);
+       cnt = dataSize / sizeof (AUChannelInfo);
+
+       result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
+                             kAudioUnitScope_Global, 0,
+                             *chaninfo, &dataSize);
+
+       if (result) { return -1; }
+       return 0;
+}
+
+
 bool   CAAudioUnit::ValidateChannelPair (int                           inChannelsIn, 
                                                                                int                             inChannelsOut,
                                                                                const AUChannelInfo * info,
@@ -1044,13 +1119,13 @@ bool            CAAudioUnit::HasCustomView () const
 OSStatus               CAAudioUnit::GetParameter(AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
                                                                                        Float32 &outValue) const
 {
-       return mDataPtr ? mDataPtr->GetParameter (inID, scope, element, outValue) : paramErr;
+       return mDataPtr ? (OSStatus) mDataPtr->GetParameter (inID, scope, element, outValue) : paramErr;
 }
 
 OSStatus               CAAudioUnit::SetParameter(AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
                                                                                        Float32 value, UInt32 bufferOffsetFrames)
 {
-       return mDataPtr ? mDataPtr->SetParameter (inID, scope, element, value, bufferOffsetFrames) : paramErr;
+       return mDataPtr ? (OSStatus) mDataPtr->SetParameter (inID, scope, element, value, bufferOffsetFrames) : paramErr;
 }
 
 OSStatus               CAAudioUnit::MIDIEvent (UInt32                  inStatus,
@@ -1058,7 +1133,7 @@ OSStatus          CAAudioUnit::MIDIEvent (UInt32                  inStatus,
                                                                UInt32                                  inData2,
                                                                UInt32                                  inOffsetSampleFrame)
 {
-       return mDataPtr ? mDataPtr->MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame) : paramErr;
+       return mDataPtr ? (OSStatus) mDataPtr->MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame) : paramErr;
 }
 
 OSStatus       CAAudioUnit::StartNote (MusicDeviceInstrumentID         inInstrument,
@@ -1067,15 +1142,15 @@ OSStatus        CAAudioUnit::StartNote (MusicDeviceInstrumentID         inInstrument,
                                                                        UInt32                                          inOffsetSampleFrame,
                                                                        const MusicDeviceNoteParams * inParams)
 {
-       return mDataPtr ? mDataPtr->StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, inParams) 
-                                       : paramErr;
+       return mDataPtr ? (OSStatus) mDataPtr->StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, inParams) 
+               : paramErr;
 }
 
 OSStatus       CAAudioUnit::StopNote (MusicDeviceGroupID               inGroupID,
                                                                        NoteInstanceID                          inNoteInstanceID,
                                                                        UInt32                                          inOffsetSampleFrame)
 {
-       return mDataPtr ? mDataPtr->StopNote (inGroupID, inNoteInstanceID, inOffsetSampleFrame) : paramErr;
+       return mDataPtr ? (OSStatus) mDataPtr->StopNote (inGroupID, inNoteInstanceID, inOffsetSampleFrame) : paramErr;
 }
 
 #pragma mark __Render
@@ -1086,7 +1161,7 @@ OSStatus          CAAudioUnit::Render (AudioUnitRenderActionFlags                         * ioActionFlags,
                                                                                                UInt32                                          inNumberFrames,
                                                                                                AudioBufferList                         * ioData)
 {
-       return mDataPtr ? mDataPtr->Render (ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData) : paramErr;
+       return mDataPtr ? (OSStatus) mDataPtr->Render (ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData) : paramErr;
 }
 
 static AURenderCallbackStruct sRenderCallback;