X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fappleutility%2FCAAudioUnit.cpp;h=54c4ecef2f10ef71099ec03deb6d3690d2fb33e7;hb=bbece8f8d99c0bc2770291b5bf39e9fdff843c8b;hp=9244877d29f27e9e9d52ae753b82bebe2f74a21c;hpb=449aab3c465bbbf66d221fac3d7ea559f1720357;p=ardour.git diff --git a/libs/appleutility/CAAudioUnit.cpp b/libs/appleutility/CAAudioUnit.cpp index 9244877d29..54c4ecef2f 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; } }; @@ -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;