X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fappleutility%2FCAAudioUnit.cpp;h=131969b66c0e2537d42e8cad1adfceb04bc1e6d2;hb=65715dd2985bfc5140e6d1a44ae9603a981a364d;hp=9244877d29f27e9e9d52ae753b82bebe2f74a21c;hpb=ab6f1ed9bafa869648b6e94ee5186ff317b32c3e;p=ardour.git diff --git a/libs/appleutility/CAAudioUnit.cpp b/libs/appleutility/CAAudioUnit.cpp index 9244877d29..131969b66c 100644 --- a/libs/appleutility/CAAudioUnit.cpp +++ b/libs/appleutility/CAAudioUnit.cpp @@ -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; } }; @@ -328,6 +328,46 @@ 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 + { + // 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 +1084,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 +1098,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 +1107,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 +1126,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;