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.

80 lines
3.4KB

  1. #include "ProcessingInterface.hpp"
  2. #include "SplitterProcessors.hpp"
  3. #include "ModulationProcessors.hpp"
  4. namespace ModelInterface {
  5. void prepareToPlay(StateManager& manager, double sampleRate, int samplesPerBlock, juce::AudioProcessor::BusesLayout layout) {
  6. WECore::AudioSpinLock lock(manager.sharedMutex);
  7. SplitterState& splitter = manager.getSplitterStateUnsafe();
  8. ModulationSourcesState& sources = *manager.getSourcesStateUnsafe();
  9. ModulationProcessors::prepareToPlay(sources, sampleRate, samplesPerBlock, layout);
  10. if (splitter.splitter != nullptr) {
  11. SplitterProcessors::prepareToPlay(*splitter.splitter, sampleRate, samplesPerBlock, layout);
  12. }
  13. }
  14. void releaseResources(StateManager& manager) {
  15. WECore::AudioSpinLock lock(manager.sharedMutex);
  16. SplitterState& splitter = manager.getSplitterStateUnsafe();
  17. if (splitter.splitter != nullptr) {
  18. SplitterProcessors::releaseResources(*splitter.splitter.get());
  19. }
  20. }
  21. void reset(StateManager& manager) {
  22. WECore::AudioSpinLock lock(manager.sharedMutex);
  23. SplitterState& splitter = manager.getSplitterStateUnsafe();
  24. ModulationSourcesState& sources = *manager.getSourcesStateUnsafe();
  25. ModulationProcessors::reset(sources);
  26. if (splitter.splitter != nullptr) {
  27. SplitterProcessors::reset(*splitter.splitter.get());
  28. }
  29. }
  30. void processBlock(StateManager& manager,
  31. juce::AudioBuffer<float>& buffer,
  32. juce::MidiBuffer& midiMessages,
  33. juce::AudioPlayHead* newPlayHead,
  34. juce::AudioPlayHead::CurrentPositionInfo tempoInfo) {
  35. // Use the try lock on the audio thread
  36. WECore::AudioSpinTryLock lock(manager.sharedMutex);
  37. if (lock.isLocked()) {
  38. SplitterState& splitter = manager.getSplitterStateUnsafe();
  39. ModulationSourcesState& sources = *manager.getSourcesStateUnsafe();
  40. // Advance the modulation sources
  41. // (the envelopes need to be done now before we overwrite the buffer)
  42. ModulationProcessors::processBlock(sources, buffer, tempoInfo);
  43. // TODO LFOs should still be advanced even if the lock is not acquired to stop them
  44. // drifting out of sync
  45. if (splitter.splitter != nullptr) {
  46. SplitterProcessors::processBlock(*splitter.splitter, buffer, midiMessages, newPlayHead);
  47. }
  48. }
  49. }
  50. double getLfoModulationValue(StateManager& manager, int lfoNumber) {
  51. // No locks here - they're called from ChainSlotProcessors::prepareToPlay so will already be locked
  52. return ModulationProcessors::getLfoModulationValue(*manager.getSourcesStateUnsafe(), lfoNumber);
  53. }
  54. double getEnvelopeModulationValue(StateManager& manager, int envelopeNumber) {
  55. // No locks here - they're called from ChainSlotProcessors::prepareToPlay so will already be locked
  56. return ModulationProcessors::getEnvelopeModulationValue(*manager.getSourcesStateUnsafe(), envelopeNumber);
  57. }
  58. double getRandomModulationValue(StateManager& manager, int randomNumber) {
  59. // No locks here - they're called from ChainSlotProcessors::prepareToPlay so will already be locked
  60. return ModulationProcessors::getRandomModulationValue(*manager.getSourcesStateUnsafe(), randomNumber);
  61. }
  62. }