diff --git a/bridge/CMakeLists.txt b/bridge/CMakeLists.txt index 857351f..6c8691e 100644 --- a/bridge/CMakeLists.txt +++ b/bridge/CMakeLists.txt @@ -37,6 +37,7 @@ message(STATUS "Using bindings at ${CXX_JUCE_BINDINGS_DIR}") target_include_directories(cxx-juce PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} ${CXX_JUCE_BINDINGS_DIR}/crate ${CXX_JUCE_BINDINGS_DIR}/include ${CXX_JUCE_BINDINGS_DIR}/sources @@ -44,16 +45,24 @@ target_include_directories(cxx-juce target_sources(cxx-juce PRIVATE + cxx_juce.h cxx_juce.cpp - cxx_juce_audio_callback_handle.cpp + cxx_juce_bindings.h cxx_juce_bindings.cpp - cxx_juce_audio_device_setup.cpp - cxx_juce_audio_device_manager.cpp - cxx_juce_system_audio_volume.cpp - cxx_juce_audio_io_device_type.cpp - cxx_juce_audio_io_device.cpp - cxx_juce_audio_basics.cpp - cxx_juce_message_manager.cpp + cxx_juce_audio_basics/cxx_juce_iir_filter.h + cxx_juce_audio_basics/cxx_juce_iir_filter.cpp + cxx_juce_audio_devices/cxx_juce_audio_callback_handle.h + cxx_juce_audio_devices/cxx_juce_audio_callback_handle.cpp + cxx_juce_audio_devices/cxx_juce_audio_device_setup.h + cxx_juce_audio_devices/cxx_juce_audio_device_setup.cpp + cxx_juce_audio_devices/cxx_juce_audio_device_manager.h + cxx_juce_audio_devices/cxx_juce_audio_device_manager.cpp + cxx_juce_audio_devices/cxx_juce_system_audio_volume.h + cxx_juce_audio_devices/cxx_juce_system_audio_volume.cpp + cxx_juce_audio_devices/cxx_juce_audio_io_device_type.h + cxx_juce_audio_devices/cxx_juce_audio_io_device_type.cpp + cxx_juce_audio_devices/cxx_juce_audio_io_device.h + cxx_juce_audio_devices/cxx_juce_audio_io_device.cpp ) target_link_libraries(cxx-juce @@ -78,4 +87,4 @@ if (CXX_JUCE_USE_ASIO) PRIVATE ${CXX_JUCE_ASIO_SDK_DIR}/common ) -endif() \ No newline at end of file +endif() diff --git a/bridge/cxx_juce.h b/bridge/cxx_juce.h index eb99217..b4b29d2 100644 --- a/bridge/cxx_juce.h +++ b/bridge/cxx_juce.h @@ -1,10 +1,17 @@ #pragma once -#include "juce_audio_devices/juce_audio_devices.h" -#include "juce_core/juce_core.h" -#include "juce_events/juce_events.h" - -#include "rust/cxx.h" +#include "cxx_juce_audio_basics/cxx_juce_iir_filter.h" +#include "cxx_juce_audio_devices/cxx_juce_audio_callback_handle.h" +#include "cxx_juce_audio_devices/cxx_juce_audio_device_manager.h" +#include "cxx_juce_audio_devices/cxx_juce_audio_device_setup.h" +#include "cxx_juce_audio_devices/cxx_juce_audio_io_device.h" +#include "cxx_juce_audio_devices/cxx_juce_audio_io_device_type.h" +#include "cxx_juce_audio_devices/cxx_juce_system_audio_volume.h" + +#include +#include +#include +#include namespace juce { @@ -24,112 +31,4 @@ void shutdownJuce(); rust::Str toStr (const juce::String& string); -struct AudioDeviceSetup -{ - AudioDeviceSetup() = default; - explicit AudioDeviceSetup (juce::AudioDeviceManager::AudioDeviceSetup audioDeviceSetup); - - [[nodiscard]] rust::Str outputDeviceName() const; - void setOutputDeviceName (rust::Str outputDeviceName); - [[nodiscard]] rust::Str inputDeviceName() const; - void setInputDeviceName (rust::Str inputDeviceName); - [[nodiscard]] rust::f64 sampleRate() const; - void setSampleRate (rust::f64 sampleRate); - [[nodiscard]] rust::i32 bufferSize() const; - void setBufferSize (rust::i32 bufferSize); - [[nodiscard]] rust::i32 numberOfInputChannels() const; - void setNumberOfInputChannels (rust::i32 numberOfInputChannels); - void useDefaultInputChannels (bool useDefaultInputChannels); - [[nodiscard]] bool usingDefaultInputChannels() const; - [[nodiscard]] rust::i32 numberOfOutputChannels() const; - void setNumberOfOutputChannels (rust::i32 numberOfOutputChannels); - void useDefaultOutputChannels (bool useDefaultOutputChannels); - [[nodiscard]] bool usingDefaultOutputChannels() const; - - juce::AudioDeviceManager::AudioDeviceSetup _audioDeviceSetup; -}; - -std::unique_ptr createAudioDeviceSetup(); - -class AudioCallbackHandle : public juce::AudioIODeviceCallback -{ -public: - explicit AudioCallbackHandle (juce::AudioDeviceManager& audioDeviceManager, - rust::Box callback); - ~AudioCallbackHandle() override; - - void audioDeviceAboutToStart (juce::AudioIODevice* device) override; - void audioDeviceIOCallbackWithContext (const float* const* inputChannelData, - int numInputChannels, - float* const* outputChannelData, - int numOutputChannels, - int numSamples, - const juce::AudioIODeviceCallbackContext& context) override; - void audioDeviceStopped() override; - -private: - juce::AudioDeviceManager& _audioDeviceManager; - rust::Box _callback; -}; - -struct AudioDeviceManager -{ - void initialiseWithDefaultDevices (rust::i32 inputChannels, - rust::i32 outputChannels); - [[nodiscard]] std::unique_ptr getAudioDeviceSetup() const; - void setAudioDeviceSetup (const AudioDeviceSetup& setup); - [[nodiscard]] std::unique_ptr - addAudioCallback (rust::Box callback); - void addAudioDeviceType (rust::Box audioIODeviceType); - void setCurrentAudioDeviceType (rust::Str audioDeviceTypeName); - void playTestSound(); - juce::AudioIODevice* getCurrentAudioDevice() const; - const juce::OwnedArray& getAvailableDeviceTypes(); - juce::AudioIODeviceType* getCurrentDeviceTypeObject() const; - - juce::AudioDeviceManager _audioDeviceManager; -}; - -std::unique_ptr createAudioDeviceManager(); - -namespace audio_io_device_type -{ - rust::String getTypeName (const juce::AudioIODeviceType& audioIoDeviceType); - rust::Vec getInputDeviceNames (const juce::AudioIODeviceType& audioIoDeviceType); - rust::Vec getOutputDeviceNames (const juce::AudioIODeviceType& audioIoDeviceType); - std::unique_ptr createDevice (juce::AudioIODeviceType& audioIoDeviceType, rust::Str inputDeviceName, rust::Str outputDeviceName); -} // namespace audio_io_device_type - -namespace audio_io_device -{ - rust::Str getDeviceName (const juce::AudioIODevice& audioIoDevice); - rust::Str getDeviceTypeName (const juce::AudioIODevice& audioIoDevice); - rust::Vec getAvailableSampleRates (juce::AudioIODevice& audioIoDevice); - rust::Vec getAvailableBufferSizes (juce::AudioIODevice& audioIoDevice); - void open (juce::AudioIODevice& audioIoDevice, double sampleRate, size_t bufferSize); - rust::i32 countActiveInputChannels (const juce::AudioIODevice& audioIoDevice); - rust::i32 countActiveOutputChannels (const juce::AudioIODevice& audioIoDevice); -} // namespace audio_io_device - -namespace system_audio_volume -{ - void setMuted (bool muted); - bool isMuted(); - void setGain (rust::f32 gain); - rust::f32 getGain(); -} // namespace system_audio_volume - -namespace iir_filter -{ - std::unique_ptr createIIRFilter (std::array coefficients); - std::array makeLowPass (double sampleRate, double cutoffFrequency, double q); - std::array makeHighPass (double sampleRate, double cutoffFrequency, double q); - std::array makeNotchFilter (double sampleRate, double cutoffFrequency, double q); -} // namespace iir_filter - -namespace message_manager -{ - juce::MessageManager* getInstanceWithoutCreating(); -} - -} // namespace cxx_juce \ No newline at end of file +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_basics.cpp b/bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.cpp similarity index 96% rename from bridge/cxx_juce_audio_basics.cpp rename to bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.cpp index 50551a1..f9eb8a4 100644 --- a/bridge/cxx_juce_audio_basics.cpp +++ b/bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include "cxx_juce_iir_filter.h" namespace cxx_juce::iir_filter { @@ -65,4 +65,4 @@ std::array makeNotchFilter (double sampleRate, coefficients.coefficients[3], coefficients.coefficients[4] }; } -} // namespace cxx_juce::iir_filter \ No newline at end of file +} // namespace cxx_juce::iir_filter diff --git a/bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.h b/bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.h new file mode 100644 index 0000000..5eeaeb5 --- /dev/null +++ b/bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include + +namespace cxx_juce::iir_filter +{ +std::unique_ptr createIIRFilter (std::array coefficients); +std::array makeLowPass (double sampleRate, double cutoffFrequency, double q); +std::array makeHighPass (double sampleRate, double cutoffFrequency, double q); +std::array makeNotchFilter (double sampleRate, double cutoffFrequency, double q); +} // namespace cxx_juce::iir_filter diff --git a/bridge/cxx_juce_audio_callback_handle.cpp b/bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.cpp similarity index 77% rename from bridge/cxx_juce_audio_callback_handle.cpp rename to bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.cpp index 2d4d84b..ef9b6be 100644 --- a/bridge/cxx_juce_audio_callback_handle.cpp +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include namespace cxx_juce { @@ -38,9 +38,9 @@ void AudioCallbackHandle::audioDeviceIOCallbackWithContext ( numSamples); } - ::audio_io_device_callback::processBlock (*_callback, - inputBuffer, - outputBuffer); + audio_io_device_callback::processBlock (*_callback, + inputBuffer, + outputBuffer); } void AudioCallbackHandle::audioDeviceAboutToStart (juce::AudioIODevice* device) @@ -50,12 +50,12 @@ void AudioCallbackHandle::audioDeviceAboutToStart (juce::AudioIODevice* device) return; } - ::audio_io_device_callback::aboutToStart (*_callback, - *device); + audio_io_device_callback::aboutToStart (*_callback, + *device); } void AudioCallbackHandle::audioDeviceStopped() { - ::audio_io_device_callback::stopped (*_callback); + audio_io_device_callback::stopped (*_callback); } -} // namespace cxx_juce \ No newline at end of file +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.h b/bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.h new file mode 100644 index 0000000..28f770f --- /dev/null +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.h @@ -0,0 +1,32 @@ +#pragma once + +#include "juce_audio_devices/juce_audio_devices.h" +#include + +namespace cxx_juce +{ + +struct BoxedAudioIODeviceCallback; + +class AudioCallbackHandle : public juce::AudioIODeviceCallback +{ +public: + explicit AudioCallbackHandle (juce::AudioDeviceManager& audioDeviceManager, + rust::Box callback); + ~AudioCallbackHandle() override; + + void audioDeviceAboutToStart (juce::AudioIODevice* device) override; + void audioDeviceIOCallbackWithContext (const float* const* inputChannelData, + int numInputChannels, + float* const* outputChannelData, + int numOutputChannels, + int numSamples, + const juce::AudioIODeviceCallbackContext& context) override; + void audioDeviceStopped() override; + +private: + juce::AudioDeviceManager& _audioDeviceManager; + rust::Box _callback; +}; + +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_device_manager.cpp b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.cpp similarity index 96% rename from bridge/cxx_juce_audio_device_manager.cpp rename to bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.cpp index 5234b8a..fc0ce70 100644 --- a/bridge/cxx_juce_audio_device_manager.cpp +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include namespace cxx_juce { @@ -34,7 +34,7 @@ void AudioDeviceManager::addAudioDeviceType (rust::Box a { explicit RustAudioIODeviceType (rust::Box audioIODeviceType) : juce::AudioIODeviceType ( - static_cast (::audio_io_device_type::name (*audioIODeviceType))) + static_cast (::audio_io_device_type::name (*audioIODeviceType))) , _audioIODeviceType (std::move (audioIODeviceType)) { } @@ -79,8 +79,8 @@ void AudioDeviceManager::addAudioDeviceType (rust::Box a { explicit RustAudioIODevice (BoxedAudioIODevice* device) : juce::AudioIODevice ( - static_cast (::audio_io_device::deviceName (*device)), - static_cast (::audio_io_device::typeName (*device))) + static_cast (::audio_io_device::deviceName (*device)), + static_cast (::audio_io_device::typeName (*device))) , _device (device) { } @@ -271,4 +271,4 @@ std::unique_ptr createAudioDeviceManager() jassert (juce::MessageManager::getInstanceWithoutCreating()); return std::make_unique(); } -} // namespace cxx_juce \ No newline at end of file +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.h b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.h new file mode 100644 index 0000000..b0679fc --- /dev/null +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.h @@ -0,0 +1,34 @@ +#pragma once + +#include "cxx_juce_audio_callback_handle.h" +#include "cxx_juce_audio_device_setup.h" + +#include +#include + +namespace cxx_juce +{ + +struct BoxedAudioIODeviceType; + +struct AudioDeviceManager +{ + void initialiseWithDefaultDevices (rust::i32 inputChannels, + rust::i32 outputChannels); + [[nodiscard]] std::unique_ptr getAudioDeviceSetup() const; + void setAudioDeviceSetup (const AudioDeviceSetup& setup); + [[nodiscard]] std::unique_ptr + addAudioCallback (rust::Box callback); + void addAudioDeviceType (rust::Box audioIODeviceType); + void setCurrentAudioDeviceType (rust::Str audioDeviceTypeName); + void playTestSound(); + juce::AudioIODevice* getCurrentAudioDevice() const; + const juce::OwnedArray& getAvailableDeviceTypes(); + juce::AudioIODeviceType* getCurrentDeviceTypeObject() const; + + juce::AudioDeviceManager _audioDeviceManager; +}; + +std::unique_ptr createAudioDeviceManager(); + +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_device_setup.cpp b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_setup.cpp similarity index 97% rename from bridge/cxx_juce_audio_device_setup.cpp rename to bridge/cxx_juce_audio_devices/cxx_juce_audio_device_setup.cpp index f1cd7bb..7e4ddbd 100644 --- a/bridge/cxx_juce_audio_device_setup.cpp +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_setup.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include namespace cxx_juce { @@ -93,4 +93,4 @@ bool AudioDeviceSetup::usingDefaultOutputChannels() const { return _audioDeviceSetup.useDefaultOutputChannels; } -} // namespace cxx_juce \ No newline at end of file +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_setup.h b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_setup.h new file mode 100644 index 0000000..092895d --- /dev/null +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_device_setup.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include + +#include + +namespace cxx_juce +{ + +struct AudioDeviceSetup +{ + AudioDeviceSetup() = default; + explicit AudioDeviceSetup (juce::AudioDeviceManager::AudioDeviceSetup audioDeviceSetup); + + [[nodiscard]] rust::Str outputDeviceName() const; + void setOutputDeviceName (rust::Str outputDeviceName); + [[nodiscard]] rust::Str inputDeviceName() const; + void setInputDeviceName (rust::Str inputDeviceName); + [[nodiscard]] rust::f64 sampleRate() const; + void setSampleRate (rust::f64 sampleRate); + [[nodiscard]] rust::i32 bufferSize() const; + void setBufferSize (rust::i32 bufferSize); + [[nodiscard]] rust::i32 numberOfInputChannels() const; + void setNumberOfInputChannels (rust::i32 numberOfInputChannels); + void useDefaultInputChannels (bool useDefaultInputChannels); + [[nodiscard]] bool usingDefaultInputChannels() const; + [[nodiscard]] rust::i32 numberOfOutputChannels() const; + void setNumberOfOutputChannels (rust::i32 numberOfOutputChannels); + void useDefaultOutputChannels (bool useDefaultOutputChannels); + [[nodiscard]] bool usingDefaultOutputChannels() const; + + juce::AudioDeviceManager::AudioDeviceSetup _audioDeviceSetup; +}; + +std::unique_ptr createAudioDeviceSetup(); + +} // namespace cxx_juce diff --git a/bridge/cxx_juce_audio_io_device.cpp b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device.cpp similarity index 95% rename from bridge/cxx_juce_audio_io_device.cpp rename to bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device.cpp index 683eab9..7243e5a 100644 --- a/bridge/cxx_juce_audio_io_device.cpp +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include namespace cxx_juce::audio_io_device { @@ -57,4 +57,4 @@ rust::i32 countActiveOutputChannels (const juce::AudioIODevice& audioIoDevice) { return audioIoDevice.getActiveOutputChannels().countNumberOfSetBits(); } -} // namespace cxx_juce::audio_io_device \ No newline at end of file +} // namespace cxx_juce::audio_io_device diff --git a/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device.h b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device.h new file mode 100644 index 0000000..e503138 --- /dev/null +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +namespace cxx_juce::audio_io_device +{ + +rust::Str getDeviceName (const juce::AudioIODevice& audioIoDevice); +rust::Str getDeviceTypeName (const juce::AudioIODevice& audioIoDevice); +rust::Vec getAvailableSampleRates (juce::AudioIODevice& audioIoDevice); +rust::Vec getAvailableBufferSizes (juce::AudioIODevice& audioIoDevice); +void open (juce::AudioIODevice& audioIoDevice, double sampleRate, size_t bufferSize); +rust::i32 countActiveInputChannels (const juce::AudioIODevice& audioIoDevice); +rust::i32 countActiveOutputChannels (const juce::AudioIODevice& audioIoDevice); + +} // namespace cxx_juce::audio_io_device diff --git a/bridge/cxx_juce_audio_io_device_type.cpp b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device_type.cpp similarity index 98% rename from bridge/cxx_juce_audio_io_device_type.cpp rename to bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device_type.cpp index 3656a5c..8b19885 100644 --- a/bridge/cxx_juce_audio_io_device_type.cpp +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device_type.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include namespace cxx_juce::audio_io_device_type { diff --git a/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device_type.h b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device_type.h new file mode 100644 index 0000000..84ba3db --- /dev/null +++ b/bridge/cxx_juce_audio_devices/cxx_juce_audio_io_device_type.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +namespace cxx_juce::audio_io_device_type +{ + +rust::String getTypeName (const juce::AudioIODeviceType& audioIoDeviceType); +rust::Vec getInputDeviceNames (const juce::AudioIODeviceType& audioIoDeviceType); +rust::Vec getOutputDeviceNames (const juce::AudioIODeviceType& audioIoDeviceType); +std::unique_ptr createDevice (juce::AudioIODeviceType& audioIoDeviceType, rust::Str inputDeviceName, rust::Str outputDeviceName); + +} // namespace cxx_juce::audio_io_device_type diff --git a/bridge/cxx_juce_system_audio_volume.cpp b/bridge/cxx_juce_audio_devices/cxx_juce_system_audio_volume.cpp similarity index 81% rename from bridge/cxx_juce_system_audio_volume.cpp rename to bridge/cxx_juce_audio_devices/cxx_juce_system_audio_volume.cpp index 34c1a9f..c93afb2 100644 --- a/bridge/cxx_juce_system_audio_volume.cpp +++ b/bridge/cxx_juce_audio_devices/cxx_juce_system_audio_volume.cpp @@ -1,4 +1,4 @@ -#include "cxx_juce_bindings.h" +#include namespace cxx_juce::system_audio_volume { @@ -21,4 +21,4 @@ rust::f32 getGain() { return juce::SystemAudioVolume::getGain(); } -} // namespace cxx_juce::system_audio_volume \ No newline at end of file +} // namespace cxx_juce::system_audio_volume diff --git a/bridge/cxx_juce_audio_devices/cxx_juce_system_audio_volume.h b/bridge/cxx_juce_audio_devices/cxx_juce_system_audio_volume.h new file mode 100644 index 0000000..163df13 --- /dev/null +++ b/bridge/cxx_juce_audio_devices/cxx_juce_system_audio_volume.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace cxx_juce::system_audio_volume +{ + +void setMuted (bool muted); +bool isMuted(); +void setGain (rust::f32 gain); +rust::f32 getGain(); + +} // namespace cxx_juce::system_audio_volume diff --git a/bridge/cxx_juce_message_manager.cpp b/bridge/cxx_juce_message_manager.cpp deleted file mode 100644 index 0ed7f44..0000000 --- a/bridge/cxx_juce_message_manager.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "cxx_juce_bindings.h" - -namespace cxx_juce::message_manager -{ -juce::MessageManager* getInstanceWithoutCreating() -{ - return juce::MessageManager::getInstanceWithoutCreating(); -} -} // namespace cxx_juce::message_manager \ No newline at end of file