Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
device_manager.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <QObject>
7#include <QtQmlIntegration/qqmlintegration.h>
8
9#include <juce_audio_devices/juce_audio_devices.h>
10#include <juce_gui_basics/juce_gui_basics.h>
11
12namespace zrythm::gui::backend
13{
14
19{
20 Q_GADGET
21 Q_PROPERTY (QString deviceName MEMBER deviceName)
22 Q_PROPERTY (int firstChannel MEMBER firstChannel)
23 Q_PROPERTY (bool stereo MEMBER stereo)
24 QML_VALUE_TYPE (audioInputInfo)
25 QML_UNCREATABLE ("")
26
27public:
28 QString deviceName;
29 int firstChannel = 0;
30 bool stereo = true;
31};
32
36class DeviceManager : public QObject, public juce::AudioDeviceManager
37{
38 Q_OBJECT
39 QML_ELEMENT
40 QML_UNCREATABLE ("")
41 Q_DISABLE_COPY_MOVE (DeviceManager)
42 Q_PROPERTY (
43 QVector<zrythm::gui::backend::AudioInputInfo> availableAudioInputs READ
44 availableAudioInputs NOTIFY availableAudioInputsChanged)
45
46public:
47 using XmlStateGetter = std::function<std::unique_ptr<juce::XmlElement> ()>;
48 using XmlStateSetter = std::function<void (const juce::XmlElement &)>;
49
50 DeviceManager (XmlStateGetter state_getter, XmlStateSetter state_setter);
51
52 ~DeviceManager () override;
53
69 void initialize (
70 int max_input_channels,
71 int max_output_channels,
72 bool fallback_to_default);
73
74 void save_state ();
75
76 // this can be mocked in tests to add a test device
77 void createAudioDeviceTypes (
78 juce::OwnedArray<juce::AudioIODeviceType> &types) override;
79
80 Q_INVOKABLE void showDeviceSelector ();
81
82 QVector<AudioInputInfo> availableAudioInputs () const;
83 Q_SIGNAL void availableAudioInputsChanged ();
84
85private:
86 class DeviceChangeListener final : public juce::ChangeListener
87 {
88 public:
89 explicit DeviceChangeListener (DeviceManager &dev_manager)
90 : dev_manager_ (dev_manager)
91 {
92 }
93
94 private:
95 void changeListenerCallback (juce::ChangeBroadcaster *) override
96 {
97 Q_EMIT dev_manager_.availableAudioInputsChanged ();
98 }
99
100 DeviceManager &dev_manager_;
101 };
102
103 class DeviceSelectorWindow : public juce::DocumentWindow
104 {
105 public:
106 DeviceSelectorWindow (DeviceManager &dev_manager);
107 void closeButtonPressed () override;
108
109 private:
110 DeviceManager &dev_manager_;
111 };
112
113private:
114 XmlStateGetter state_getter_;
115 XmlStateSetter state_setter_;
116 std::unique_ptr<DeviceSelectorWindow> device_selector_window_;
117 DeviceChangeListener device_change_listener_{ *this };
118};
119} // namespace zrythm::gui::backend
void initialize(int max_input_channels, int max_output_channels, bool fallback_to_default)
Opens a set of devices ready for use.
Describes a single audio input available from the current device.