Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
juce_hardware_audio_interface.h
1// SPDX-FileCopyrightText: © 2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <memory>
7#include <optional>
8#include <unordered_map>
9
10#include "dsp/hardware_audio_interface.h"
11#include "dsp/iaudio_callback.h"
12
13#include <juce_wrapper.h>
14
15namespace zrythm::dsp
16{
17
25class JuceHardwareAudioInterface : public IHardwareAudioInterface
26{
27public:
28 explicit JuceHardwareAudioInterface (
29 std::shared_ptr<juce::AudioDeviceManager> device_manager);
30
31 ~JuceHardwareAudioInterface () override;
32
33 [[nodiscard]] nframes_t get_block_length () const override;
34 [[nodiscard]] units::sample_rate_t get_sample_rate () const override;
35
36 void add_audio_callback (IAudioCallback * callback) override;
37 void remove_audio_callback (IAudioCallback * callback) override;
38
46 [[nodiscard]] std::optional<juce::AudioWorkgroup>
48
52 static std::unique_ptr<IHardwareAudioInterface>
53 create (std::shared_ptr<juce::AudioDeviceManager> device_manager);
54
55private:
60 class JuceCallbackAdapter : public juce::AudioIODeviceCallback
61 {
62 public:
63 explicit JuceCallbackAdapter (IAudioCallback &callback)
64 : callback_ (callback)
65 {
66 }
67
68 void audioDeviceIOCallbackWithContext (
69 const float * const * inputChannelData,
70 int numInputChannels,
71 float * const * outputChannelData,
72 int numOutputChannels,
73 int numSamples,
74 const juce::AudioIODeviceCallbackContext &context) override
75 {
76 juce::ScopedNoDenormals no_denormals;
77 callback_.process_audio (
78 inputChannelData, numInputChannels, outputChannelData,
79 numOutputChannels, numSamples);
80 }
81
82 void audioDeviceAboutToStart (juce::AudioIODevice * device) override;
83 void audioDeviceStopped () override;
84 void audioDeviceError (const juce::String &errorMessage) override;
85
86 private:
87 IAudioCallback &callback_;
88 };
89
90 std::shared_ptr<juce::AudioDeviceManager> device_manager_;
91
93 std::unordered_map<IAudioCallback *, std::unique_ptr<JuceCallbackAdapter>>
94 callback_adapters_;
95};
96
97} // namespace zrythm::dsp
Pure-abstract audio callback interface.
virtual void process_audio(const float *const *input_channel_data, int num_input_channels, float *const *output_channel_data, int num_output_channels, int num_samples) noexcept=0
Called when the audio device wants to process a block of audio data.
Abstraction for hardware audio interface.
static std::unique_ptr< IHardwareAudioInterface > create(std::shared_ptr< juce::AudioDeviceManager > device_manager)
Creates a JUCE-based hardware audio interface.
void remove_audio_callback(IAudioCallback *callback) override
Removes a previously added audio callback.
std::optional< juce::AudioWorkgroup > get_device_audio_workgroup() const
Returns the audio workgroup for the current device.
void add_audio_callback(IAudioCallback *callback) override
Adds an audio callback to receive audio I/O events.
nframes_t get_block_length() const override
Returns the current block length (buffer size) in frames.
units::sample_rate_t get_sample_rate() const override
Returns the current sample rate.
uint32_t nframes_t
Frame count.
Definition types.h:58