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_audio_devices/juce_audio_devices.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]] AudioDeviceInfo get_device_info () const override;
34
35 void add_audio_callback (IAudioCallback * callback) override;
36 void remove_audio_callback (IAudioCallback * callback) override;
37
45 [[nodiscard]] std::optional<juce::AudioWorkgroup>
47
51 static std::unique_ptr<IHardwareAudioInterface>
52 create (std::shared_ptr<juce::AudioDeviceManager> device_manager);
53
54private:
59 class JuceCallbackAdapter : public juce::AudioIODeviceCallback
60 {
61 public:
62 explicit JuceCallbackAdapter (IAudioCallback &callback)
63 : callback_ (callback)
64 {
65 }
66
67 void audioDeviceIOCallbackWithContext (
68 const float * const * inputChannelData,
69 int numInputChannels,
70 float * const * outputChannelData,
71 int numOutputChannels,
72 int numSamples,
73 const juce::AudioIODeviceCallbackContext &context) override
74 {
75 juce::ScopedNoDenormals no_denormals;
76 callback_.process_audio (
77 { inputChannelData, static_cast<size_t> (numInputChannels) },
78 { outputChannelData, static_cast<size_t> (numOutputChannels) },
79 units::samples (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(std::span< const float *const > input_channels, std::span< float *const > output_channels, units::sample_u32_t 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.
AudioDeviceInfo get_device_info() const override
Returns the current audio device information.
Information about an audio device.