/*! @file AudioUnitSDK/MusicDeviceBase.cpp @copyright © 2000-2021 Apple Inc. All rights reserved. */ #include namespace ausdk { MusicDeviceBase::MusicDeviceBase( AudioComponentInstance inInstance, UInt32 numInputs, UInt32 numOutputs, UInt32 numGroups) : AUBase(inInstance, numInputs, numOutputs, numGroups), AUMIDIBase(*static_cast(this)) { } OSStatus MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32& outDataSize, bool& outWritable) { OSStatus result = noErr; switch (inID) { // NOLINT if/else case kMusicDeviceProperty_InstrumentCount: if (inScope != kAudioUnitScope_Global) { return kAudioUnitErr_InvalidScope; } outDataSize = sizeof(UInt32); outWritable = false; result = noErr; break; default: result = AUBase::GetPropertyInfo(inID, inScope, inElement, outDataSize, outWritable); if (result == kAudioUnitErr_InvalidProperty) { result = AUMIDIBase::DelegateGetPropertyInfo( inID, inScope, inElement, outDataSize, outWritable); } break; } return result; } OSStatus MusicDeviceBase::GetProperty( AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData) { OSStatus result = noErr; switch (inID) { // NOLINT if/else case kMusicDeviceProperty_InstrumentCount: if (inScope != kAudioUnitScope_Global) { return kAudioUnitErr_InvalidScope; } return GetInstrumentCount(*static_cast(outData)); default: result = AUBase::GetProperty(inID, inScope, inElement, outData); if (result == kAudioUnitErr_InvalidProperty) { result = AUMIDIBase::DelegateGetProperty(inID, inScope, inElement, outData); } } return result; } OSStatus MusicDeviceBase::SetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize) { OSStatus result = AUBase::SetProperty(inID, inScope, inElement, inData, inDataSize); if (result == kAudioUnitErr_InvalidProperty) { result = AUMIDIBase::DelegateSetProperty(inID, inScope, inElement, inData, inDataSize); } return result; } // For a MusicDevice that doesn't support separate instruments (ie. is mono-timbral) // then this call should return an instrument count of zero and noErr OSStatus MusicDeviceBase::GetInstrumentCount(UInt32& outInstCount) const { outInstCount = 0; return noErr; } OSStatus MusicDeviceBase::HandleNoteOn( UInt8 inChannel, UInt8 inNoteNumber, UInt8 inVelocity, UInt32 inStartFrame) { const MusicDeviceNoteParams params{ .argCount = 2, .mPitch = static_cast(inNoteNumber), .mVelocity = static_cast(inVelocity) }; return StartNote(kMusicNoteEvent_UseGroupInstrument, inChannel, nullptr, inStartFrame, params); } OSStatus MusicDeviceBase::HandleNoteOff( UInt8 inChannel, UInt8 inNoteNumber, UInt8 /*inVelocity*/, UInt32 inStartFrame) { return StopNote(inChannel, inNoteNumber, inStartFrame); } OSStatus MusicDeviceBase::HandleStartNoteMessage(MusicDeviceInstrumentID inInstrument, MusicDeviceGroupID inGroupID, NoteInstanceID* outNoteInstanceID, UInt32 inOffsetSampleFrame, const MusicDeviceNoteParams* inParams) { if (inParams == nullptr || outNoteInstanceID == nullptr) { return kAudio_ParamError; } if (!IsInitialized()) { return kAudioUnitErr_Uninitialized; } return StartNote(inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams); } } // namespace ausdk