X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fappleutility%2FCAAudioUnit.cpp;h=54c4ecef2f10ef71099ec03deb6d3690d2fb33e7;hb=bbece8f8d99c0bc2770291b5bf39e9fdff843c8b;hp=aaf57f233de261515c033c9bcc0728017c540e64;hpb=68e943265edf04e63a8e8b8f62bab20f99d9c637;p=ardour.git diff --git a/libs/appleutility/CAAudioUnit.cpp b/libs/appleutility/CAAudioUnit.cpp index aaf57f233d..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; } @@ -348,6 +348,41 @@ int CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt) { 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 @@ -1084,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, @@ -1098,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, @@ -1107,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 @@ -1126,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;