Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restructure bridge code so everything isn't declared in one file #7

Merged
merged 1 commit into from
Jun 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading