5#ifdef COREAUDIO_BACKEND
7#include <AudioUnit/AudioUnit.h>
8#include <CoreAudio/CoreAudio.h>
20class CoreAudioBackend final :
public IAudioBackend {
23 ~CoreAudioBackend()
override;
25 std::unique_ptr<AudioDevice> create_device_manager()
override;
27 std::unique_ptr<AudioStream> create_stream(
28 unsigned int output_device_id,
29 unsigned int input_device_id,
30 GlobalStreamInfo& stream_info,
31 void* user_data)
override;
33 [[nodiscard]] std::string get_version_string()
const override;
35 void cleanup()
override;
42class CoreAudioDevice final :
public AudioDevice {
45 ~CoreAudioDevice()
override =
default;
47 [[nodiscard]] std::vector<DeviceInfo> get_output_devices()
const override;
48 [[nodiscard]] std::vector<DeviceInfo> get_input_devices()
const override;
50 [[nodiscard]]
unsigned int get_default_output_device()
const override;
51 [[nodiscard]]
unsigned int get_default_input_device()
const override;
53 [[nodiscard]] AudioDeviceID resolve_output_device(
54 unsigned int index)
const;
56 [[nodiscard]] AudioDeviceID resolve_input_device(
57 unsigned int index)
const;
65 void enumerate_devices();
67 std::vector<DeviceEntry> m_outputs;
68 std::vector<DeviceEntry> m_inputs;
70 unsigned int m_default_output = 0;
71 unsigned int m_default_input = 0;
72 AudioDeviceID m_default_output_id = kAudioObjectUnknown;
73 AudioDeviceID m_default_input_id = kAudioObjectUnknown;
75 [[nodiscard]]
static std::string get_device_name(AudioDeviceID device_id);
76 [[nodiscard]]
static uint32_t get_channel_count(
77 AudioDeviceID device_id,
78 AudioObjectPropertyScope scope);
80 [[nodiscard]]
static double get_nominal_sample_rate(
81 AudioDeviceID device_id);
93class CoreAudioStream final :
public AudioStream {
96 AudioDeviceID output_device_id,
97 AudioDeviceID input_device_id,
98 GlobalStreamInfo& stream_info,
101 ~CoreAudioStream()
override;
103 void open()
override;
104 void start()
override;
105 void stop()
override;
106 void pause()
override;
107 void resume()
override;
108 void close()
override;
110 [[nodiscard]]
bool is_running()
const override;
111 [[nodiscard]]
bool is_open()
const override;
113 void set_process_callback(
114 std::function<
int(
void*,
void*,
unsigned int)> callback)
override;
120 static OSStatus output_callback(
122 AudioUnitRenderActionFlags* action_flags,
123 const AudioTimeStamp* time_stamp,
126 AudioBufferList* io_data);
128 static OSStatus input_callback(
130 AudioUnitRenderActionFlags* action_flags,
131 const AudioTimeStamp* time_stamp,
134 AudioBufferList* io_data);
136 bool configure_output_unit();
137 bool configure_input_unit();
138 bool configure_output_device();
139 bool configure_input_device();
140 bool configure_output_format();
141 bool configure_input_format();
143 AudioUnit m_output_unit =
nullptr;
144 AudioUnit m_input_unit =
nullptr;
146 AudioDeviceID m_output_device_id = kAudioObjectUnknown;
147 AudioDeviceID m_input_device_id = kAudioObjectUnknown;
149 GlobalStreamInfo& m_stream_info;
150 void* m_user_data =
nullptr;
152 std::function<int(
void*,
void*,
unsigned int)> m_process_callback;
154 AudioBufferList* m_input_buffer_list =
nullptr;
156 std::atomic<bool> m_input_enabled {
false };
158 std::atomic<bool> m_is_open {
false };
159 std::atomic<bool> m_is_running {
false };
160 std::atomic<bool> m_is_paused {
false };
void stop()
Stop all Portal::Graphics operations.