Skip to content

Commit

Permalink
Restructure bridge code so everything isn't declared in one file
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesHallowell committed Jun 16, 2024
1 parent 979b2ee commit 7e6bba4
Show file tree
Hide file tree
Showing 17 changed files with 213 additions and 154 deletions.
27 changes: 18 additions & 9 deletions bridge/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,32 @@ 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
)

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
Expand All @@ -78,4 +87,4 @@ if (CXX_JUCE_USE_ASIO)
PRIVATE
${CXX_JUCE_ASIO_SDK_DIR}/common
)
endif()
endif()
127 changes: 13 additions & 114 deletions bridge/cxx_juce.h
Original file line number Diff line number Diff line change
@@ -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 <juce_audio_devices/juce_audio_devices.h>
#include <juce_core/juce_core.h>
#include <juce_events/juce_events.h>
#include <rust/cxx.h>

namespace juce
{
Expand All @@ -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<AudioDeviceSetup> createAudioDeviceSetup();

class AudioCallbackHandle : public juce::AudioIODeviceCallback
{
public:
explicit AudioCallbackHandle (juce::AudioDeviceManager& audioDeviceManager,
rust::Box<BoxedAudioIODeviceCallback> 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<BoxedAudioIODeviceCallback> _callback;
};

struct AudioDeviceManager
{
void initialiseWithDefaultDevices (rust::i32 inputChannels,
rust::i32 outputChannels);
[[nodiscard]] std::unique_ptr<AudioDeviceSetup> getAudioDeviceSetup() const;
void setAudioDeviceSetup (const AudioDeviceSetup& setup);
[[nodiscard]] std::unique_ptr<AudioCallbackHandle>
addAudioCallback (rust::Box<BoxedAudioIODeviceCallback> callback);
void addAudioDeviceType (rust::Box<BoxedAudioIODeviceType> audioIODeviceType);
void setCurrentAudioDeviceType (rust::Str audioDeviceTypeName);
void playTestSound();
juce::AudioIODevice* getCurrentAudioDevice() const;
const juce::OwnedArray<juce::AudioIODeviceType>& getAvailableDeviceTypes();
juce::AudioIODeviceType* getCurrentDeviceTypeObject() const;

juce::AudioDeviceManager _audioDeviceManager;
};

std::unique_ptr<AudioDeviceManager> createAudioDeviceManager();

namespace audio_io_device_type
{
rust::String getTypeName (const juce::AudioIODeviceType& audioIoDeviceType);
rust::Vec<rust::String> getInputDeviceNames (const juce::AudioIODeviceType& audioIoDeviceType);
rust::Vec<rust::String> getOutputDeviceNames (const juce::AudioIODeviceType& audioIoDeviceType);
std::unique_ptr<juce::AudioIODevice> 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<rust::f64> getAvailableSampleRates (juce::AudioIODevice& audioIoDevice);
rust::Vec<size_t> 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<juce::SingleThreadedIIRFilter> createIIRFilter (std::array<rust::f32, 5> coefficients);
std::array<rust::f32, 5> makeLowPass (double sampleRate, double cutoffFrequency, double q);
std::array<rust::f32, 5> makeHighPass (double sampleRate, double cutoffFrequency, double q);
std::array<rust::f32, 5> makeNotchFilter (double sampleRate, double cutoffFrequency, double q);
} // namespace iir_filter

namespace message_manager
{
juce::MessageManager* getInstanceWithoutCreating();
}

} // namespace cxx_juce
} // namespace cxx_juce
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "cxx_juce_bindings.h"
#include "cxx_juce_iir_filter.h"

namespace cxx_juce::iir_filter
{
Expand Down Expand Up @@ -65,4 +65,4 @@ std::array<rust::f32, 5> makeNotchFilter (double sampleRate,
coefficients.coefficients[3],
coefficients.coefficients[4] };
}
} // namespace cxx_juce::iir_filter
} // namespace cxx_juce::iir_filter
12 changes: 12 additions & 0 deletions bridge/cxx_juce_audio_basics/cxx_juce_iir_filter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

#include <juce_audio_basics/juce_audio_basics.h>
#include <rust/cxx.h>

namespace cxx_juce::iir_filter
{
std::unique_ptr<juce::SingleThreadedIIRFilter> createIIRFilter (std::array<rust::f32, 5> coefficients);
std::array<rust::f32, 5> makeLowPass (double sampleRate, double cutoffFrequency, double q);
std::array<rust::f32, 5> makeHighPass (double sampleRate, double cutoffFrequency, double q);
std::array<rust::f32, 5> makeNotchFilter (double sampleRate, double cutoffFrequency, double q);
} // namespace cxx_juce::iir_filter
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "cxx_juce_bindings.h"
#include <cxx_juce_bindings.h>

namespace cxx_juce
{
Expand Down Expand Up @@ -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)
Expand All @@ -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
} // namespace cxx_juce
32 changes: 32 additions & 0 deletions bridge/cxx_juce_audio_devices/cxx_juce_audio_callback_handle.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#pragma once

#include "juce_audio_devices/juce_audio_devices.h"
#include <rust/cxx.h>

namespace cxx_juce
{

struct BoxedAudioIODeviceCallback;

class AudioCallbackHandle : public juce::AudioIODeviceCallback
{
public:
explicit AudioCallbackHandle (juce::AudioDeviceManager& audioDeviceManager,
rust::Box<BoxedAudioIODeviceCallback> 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<BoxedAudioIODeviceCallback> _callback;
};

} // namespace cxx_juce
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "cxx_juce_bindings.h"
#include <cxx_juce_bindings.h>

namespace cxx_juce
{
Expand Down Expand Up @@ -34,7 +34,7 @@ void AudioDeviceManager::addAudioDeviceType (rust::Box<BoxedAudioIODeviceType> a
{
explicit RustAudioIODeviceType (rust::Box<BoxedAudioIODeviceType> audioIODeviceType)
: juce::AudioIODeviceType (
static_cast<std::string> (::audio_io_device_type::name (*audioIODeviceType)))
static_cast<std::string> (::audio_io_device_type::name (*audioIODeviceType)))
, _audioIODeviceType (std::move (audioIODeviceType))
{
}
Expand Down Expand Up @@ -79,8 +79,8 @@ void AudioDeviceManager::addAudioDeviceType (rust::Box<BoxedAudioIODeviceType> a
{
explicit RustAudioIODevice (BoxedAudioIODevice* device)
: juce::AudioIODevice (
static_cast<std::string> (::audio_io_device::deviceName (*device)),
static_cast<std::string> (::audio_io_device::typeName (*device)))
static_cast<std::string> (::audio_io_device::deviceName (*device)),
static_cast<std::string> (::audio_io_device::typeName (*device)))
, _device (device)
{
}
Expand Down Expand Up @@ -271,4 +271,4 @@ std::unique_ptr<AudioDeviceManager> createAudioDeviceManager()
jassert (juce::MessageManager::getInstanceWithoutCreating());
return std::make_unique<AudioDeviceManager>();
}
} // namespace cxx_juce
} // namespace cxx_juce
34 changes: 34 additions & 0 deletions bridge/cxx_juce_audio_devices/cxx_juce_audio_device_manager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#pragma once

#include "cxx_juce_audio_callback_handle.h"
#include "cxx_juce_audio_device_setup.h"

#include <juce_audio_devices/juce_audio_devices.h>
#include <rust/cxx.h>

namespace cxx_juce
{

struct BoxedAudioIODeviceType;

struct AudioDeviceManager
{
void initialiseWithDefaultDevices (rust::i32 inputChannels,
rust::i32 outputChannels);
[[nodiscard]] std::unique_ptr<AudioDeviceSetup> getAudioDeviceSetup() const;
void setAudioDeviceSetup (const AudioDeviceSetup& setup);
[[nodiscard]] std::unique_ptr<AudioCallbackHandle>
addAudioCallback (rust::Box<BoxedAudioIODeviceCallback> callback);
void addAudioDeviceType (rust::Box<BoxedAudioIODeviceType> audioIODeviceType);
void setCurrentAudioDeviceType (rust::Str audioDeviceTypeName);
void playTestSound();
juce::AudioIODevice* getCurrentAudioDevice() const;
const juce::OwnedArray<juce::AudioIODeviceType>& getAvailableDeviceTypes();
juce::AudioIODeviceType* getCurrentDeviceTypeObject() const;

juce::AudioDeviceManager _audioDeviceManager;
};

std::unique_ptr<AudioDeviceManager> createAudioDeviceManager();

} // namespace cxx_juce
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "cxx_juce_bindings.h"
#include <cxx_juce_bindings.h>

namespace cxx_juce
{
Expand Down Expand Up @@ -93,4 +93,4 @@ bool AudioDeviceSetup::usingDefaultOutputChannels() const
{
return _audioDeviceSetup.useDefaultOutputChannels;
}
} // namespace cxx_juce
} // namespace cxx_juce
Loading

0 comments on commit 7e6bba4

Please sign in to comment.