The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.4KB

  1. /*!
  2. @file AudioUnitSDK/MusicDeviceBase.cpp
  3. @copyright © 2000-2021 Apple Inc. All rights reserved.
  4. */
  5. #include <AudioUnitSDK/MusicDeviceBase.h>
  6. namespace ausdk {
  7. MusicDeviceBase::MusicDeviceBase(
  8. AudioComponentInstance inInstance, UInt32 numInputs, UInt32 numOutputs, UInt32 numGroups)
  9. : AUBase(inInstance, numInputs, numOutputs, numGroups), AUMIDIBase(*static_cast<AUBase*>(this))
  10. {
  11. }
  12. OSStatus MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID inID, AudioUnitScope inScope,
  13. AudioUnitElement inElement, UInt32& outDataSize, bool& outWritable)
  14. {
  15. OSStatus result = noErr;
  16. switch (inID) { // NOLINT if/else
  17. case kMusicDeviceProperty_InstrumentCount:
  18. if (inScope != kAudioUnitScope_Global) {
  19. return kAudioUnitErr_InvalidScope;
  20. }
  21. outDataSize = sizeof(UInt32);
  22. outWritable = false;
  23. result = noErr;
  24. break;
  25. default:
  26. result = AUBase::GetPropertyInfo(inID, inScope, inElement, outDataSize, outWritable);
  27. if (result == kAudioUnitErr_InvalidProperty) {
  28. result = AUMIDIBase::DelegateGetPropertyInfo(
  29. inID, inScope, inElement, outDataSize, outWritable);
  30. }
  31. break;
  32. }
  33. return result;
  34. }
  35. OSStatus MusicDeviceBase::GetProperty(
  36. AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData)
  37. {
  38. OSStatus result = noErr;
  39. switch (inID) { // NOLINT if/else
  40. case kMusicDeviceProperty_InstrumentCount:
  41. if (inScope != kAudioUnitScope_Global) {
  42. return kAudioUnitErr_InvalidScope;
  43. }
  44. return GetInstrumentCount(*static_cast<UInt32*>(outData));
  45. default:
  46. result = AUBase::GetProperty(inID, inScope, inElement, outData);
  47. if (result == kAudioUnitErr_InvalidProperty) {
  48. result = AUMIDIBase::DelegateGetProperty(inID, inScope, inElement, outData);
  49. }
  50. }
  51. return result;
  52. }
  53. OSStatus MusicDeviceBase::SetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope,
  54. AudioUnitElement inElement, const void* inData, UInt32 inDataSize)
  55. {
  56. OSStatus result = AUBase::SetProperty(inID, inScope, inElement, inData, inDataSize);
  57. if (result == kAudioUnitErr_InvalidProperty) {
  58. result = AUMIDIBase::DelegateSetProperty(inID, inScope, inElement, inData, inDataSize);
  59. }
  60. return result;
  61. }
  62. // For a MusicDevice that doesn't support separate instruments (ie. is mono-timbral)
  63. // then this call should return an instrument count of zero and noErr
  64. OSStatus MusicDeviceBase::GetInstrumentCount(UInt32& outInstCount) const
  65. {
  66. outInstCount = 0;
  67. return noErr;
  68. }
  69. OSStatus MusicDeviceBase::HandleNoteOn(
  70. UInt8 inChannel, UInt8 inNoteNumber, UInt8 inVelocity, UInt32 inStartFrame)
  71. {
  72. const MusicDeviceNoteParams params{ .argCount = 2,
  73. .mPitch = static_cast<Float32>(inNoteNumber),
  74. .mVelocity = static_cast<Float32>(inVelocity) };
  75. return StartNote(kMusicNoteEvent_UseGroupInstrument, inChannel, nullptr, inStartFrame, params);
  76. }
  77. OSStatus MusicDeviceBase::HandleNoteOff(
  78. UInt8 inChannel, UInt8 inNoteNumber, UInt8 /*inVelocity*/, UInt32 inStartFrame)
  79. {
  80. return StopNote(inChannel, inNoteNumber, inStartFrame);
  81. }
  82. OSStatus MusicDeviceBase::HandleStartNoteMessage(MusicDeviceInstrumentID inInstrument,
  83. MusicDeviceGroupID inGroupID, NoteInstanceID* outNoteInstanceID, UInt32 inOffsetSampleFrame,
  84. const MusicDeviceNoteParams* inParams)
  85. {
  86. if (inParams == nullptr || outNoteInstanceID == nullptr) {
  87. return kAudio_ParamError;
  88. }
  89. if (!IsInitialized()) {
  90. return kAudioUnitErr_Uninitialized;
  91. }
  92. return StartNote(inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
  93. }
  94. } // namespace ausdk