Audio plugin host https://kx.studio/carla
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.

197 lines
6.9KB

  1. /*
  2. * Carla Plugin Host
  3. * Copyright (C) 2011-2014 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #ifndef CARLA_ENGINE_GRAPH_HPP_INCLUDED
  18. #define CARLA_ENGINE_GRAPH_HPP_INCLUDED
  19. #include "CarlaEngine.hpp"
  20. #include "CarlaMutex.hpp"
  21. #include "CarlaPatchbayUtils.hpp"
  22. #include "CarlaStringList.hpp"
  23. #include "juce_audio_processors/juce_audio_processors.h"
  24. #if 1
  25. typedef juce::AudioProcessorGraph CarlaAudioProcessorGraph;
  26. #else
  27. typedef juce::AudioProcessorGraphMultiThreaded CarlaAudioProcessorGraph;
  28. #endif
  29. using juce::AudioSampleBuffer;
  30. using juce::MidiBuffer;
  31. CARLA_BACKEND_START_NAMESPACE
  32. // -----------------------------------------------------------------------
  33. // External Graph stuff
  34. enum ExternalGraphGroupIds {
  35. kExternalGraphGroupNull = 0,
  36. kExternalGraphGroupCarla = 1,
  37. kExternalGraphGroupAudioIn = 2,
  38. kExternalGraphGroupAudioOut = 3,
  39. kExternalGraphGroupMidiIn = 4,
  40. kExternalGraphGroupMidiOut = 5,
  41. kExternalGraphGroupMax = 6
  42. };
  43. enum ExternalGraphCarlaPortIds {
  44. kExternalGraphCarlaPortNull = 0,
  45. kExternalGraphCarlaPortAudioIn1 = 1,
  46. kExternalGraphCarlaPortAudioIn2 = 2,
  47. kExternalGraphCarlaPortAudioOut1 = 3,
  48. kExternalGraphCarlaPortAudioOut2 = 4,
  49. kExternalGraphCarlaPortMidiIn = 5,
  50. kExternalGraphCarlaPortMidiOut = 6,
  51. kExternalGraphCarlaPortMax = 7
  52. };
  53. enum ExternalGraphConnectionType {
  54. kExternalGraphConnectionNull = 0,
  55. kExternalGraphConnectionAudioIn1 = 1,
  56. kExternalGraphConnectionAudioIn2 = 2,
  57. kExternalGraphConnectionAudioOut1 = 3,
  58. kExternalGraphConnectionAudioOut2 = 4,
  59. kExternalGraphConnectionMidiInput = 5,
  60. kExternalGraphConnectionMidiOutput = 6
  61. };
  62. struct ExternalGraphPorts {
  63. LinkedList<PortNameToId> ins;
  64. LinkedList<PortNameToId> outs;
  65. const char* getName(const bool isInput, const uint portId) const noexcept;
  66. uint getPortId(const bool isInput, const char portName[], bool* const ok = nullptr) const noexcept;
  67. ExternalGraphPorts() noexcept;
  68. CARLA_PREVENT_HEAP_ALLOCATION
  69. CARLA_DECLARE_NON_COPY_CLASS(ExternalGraphPorts)
  70. };
  71. struct ExternalGraph {
  72. PatchbayConnectionList connections;
  73. ExternalGraphPorts audioPorts, midiPorts;
  74. mutable CharStringListPtr retCon;
  75. ExternalGraph(CarlaEngine* const engine) noexcept;
  76. void clear() noexcept;
  77. bool connect(const uint groupA, const uint portA, const uint groupB, const uint portB, const bool sendCallback) noexcept;
  78. bool disconnect(const uint connectionId) noexcept;
  79. void refresh(const char* const deviceName);
  80. const char* const* getConnections() const noexcept;
  81. bool getGroupAndPortIdFromFullName(const char* const fullPortName, uint& groupId, uint& portId) const noexcept;
  82. CarlaEngine* const kEngine;
  83. CARLA_PREVENT_HEAP_ALLOCATION
  84. CARLA_DECLARE_NON_COPY_CLASS(ExternalGraph)
  85. };
  86. // -----------------------------------------------------------------------
  87. // RackGraph
  88. struct RackGraph {
  89. ExternalGraph extGraph;
  90. const uint32_t inputs;
  91. const uint32_t outputs;
  92. bool isOffline;
  93. struct Buffers {
  94. CarlaRecursiveMutex mutex;
  95. LinkedList<uint> connectedIn1;
  96. LinkedList<uint> connectedIn2;
  97. LinkedList<uint> connectedOut1;
  98. LinkedList<uint> connectedOut2;
  99. float* inBuf[2];
  100. float* inBufTmp[2];
  101. float* outBuf[2];
  102. Buffers() noexcept;
  103. ~Buffers() noexcept;
  104. void setBufferSize(const uint32_t bufferSize, const bool createBuffers) noexcept;
  105. CARLA_PREVENT_HEAP_ALLOCATION
  106. CARLA_DECLARE_NON_COPY_CLASS(Buffers)
  107. } audioBuffers;
  108. RackGraph(CarlaEngine* const engine, const uint32_t inputs, const uint32_t outputs) noexcept;
  109. ~RackGraph() noexcept;
  110. void setBufferSize(const uint32_t bufferSize) noexcept;
  111. void setOffline(const bool offline) noexcept;
  112. bool connect(const uint groupA, const uint portA, const uint groupB, const uint portB) noexcept;
  113. bool disconnect(const uint connectionId) noexcept;
  114. void refresh(const char* const deviceName);
  115. const char* const* getConnections() const noexcept;
  116. bool getGroupAndPortIdFromFullName(const char* const fullPortName, uint& groupId, uint& portId) const noexcept;
  117. // the base, where plugins run
  118. void process(CarlaEngine::ProtectedData* const data, const float* inBufReal[2], float* outBuf[2], const uint32_t frames);
  119. // extended, will call process() in the middle
  120. void processHelper(CarlaEngine::ProtectedData* const data, const float* const* const inBuf, float* const* const outBuf, const uint32_t frames);
  121. CarlaEngine* const kEngine;
  122. CARLA_DECLARE_NON_COPY_CLASS(RackGraph)
  123. };
  124. // -----------------------------------------------------------------------
  125. // PatchbayGraph
  126. struct PatchbayGraph {
  127. PatchbayConnectionList connections;
  128. CarlaAudioProcessorGraph graph;
  129. AudioSampleBuffer audioBuffer;
  130. MidiBuffer midiBuffer;
  131. const uint32_t inputs;
  132. const uint32_t outputs;
  133. mutable CharStringListPtr retCon;
  134. bool usingExternal;
  135. ExternalGraph extGraph;
  136. PatchbayGraph(CarlaEngine* const engine, const uint32_t inputs, const uint32_t outputs);
  137. ~PatchbayGraph();
  138. void setBufferSize(const uint32_t bufferSize);
  139. void setSampleRate(const double sampleRate);
  140. void setOffline(const bool offline);
  141. void addPlugin(CarlaPlugin* const plugin);
  142. void replacePlugin(CarlaPlugin* const oldPlugin, CarlaPlugin* const newPlugin);
  143. void renamePlugin(CarlaPlugin* const plugin, const char* const newName);
  144. void removePlugin(CarlaPlugin* const plugin);
  145. void removeAllPlugins();
  146. bool connect(const bool external, const uint groupA, const uint portA, const uint groupB, const uint portB, const bool sendCallback);
  147. bool disconnect(const uint connectionId);
  148. void disconnectInternalGroup(const uint groupId) noexcept;
  149. void refresh(const char* const deviceName);
  150. const char* const* getConnections(const bool external) const;
  151. bool getGroupAndPortIdFromFullName(const bool external, const char* const fullPortName, uint& groupId, uint& portId) const;
  152. void process(CarlaEngine::ProtectedData* const data, const float* const* const inBuf, float* const* const outBuf, const int frames);
  153. CarlaEngine* const kEngine;
  154. CARLA_DECLARE_NON_COPY_CLASS(PatchbayGraph)
  155. };
  156. // -----------------------------------------------------------------------
  157. CARLA_BACKEND_END_NAMESPACE
  158. #endif // CARLA_ENGINE_GRAPH_HPP_INCLUDED