2 * Copyright (C) 2015 Robin Gareus <robin@gareus.org>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #ifndef __libbackend_coreaudio_pcmio_h__
20 #define __libbackend_coreaudio_pcmio_h__
22 #include <CoreServices/CoreServices.h>
23 #include <CoreAudio/CoreAudio.h>
24 #include <AudioUnit/AudioUnit.h>
26 #include <AudioUnit/AudioUnit.h>
27 #include <AudioToolbox/AudioToolbox.h>
33 #define AUHAL_OUTPUT_ELEMENT 0
34 #define AUHAL_INPUT_ELEMENT 1
45 int state (void) const { return _state; }
46 uint32_t n_playback_channels (void) const { return _playback_channels; }
47 uint32_t n_capture_channels (void) const { return _capture_channels; }
50 void device_list (std::map<size_t, std::string> &devices) const { devices = _devices;}
52 int available_sample_rates (uint32_t device_id, std::vector<float>& sampleRates);
53 int available_buffer_sizes (uint32_t device_id, std::vector<uint32_t>& sampleRates);
54 uint32_t available_channels (uint32_t device_id, bool input);
55 float current_sample_rate (uint32_t device_id, bool input = false);
56 uint32_t get_latency (uint32_t device_id, bool input);
58 std::string cached_port_name (uint32_t portnum, bool input) const;
61 uint32_t samples_per_period () const { return _samples_per_period; };
63 int set_samples_per_period (uint32_t);
65 void launch_control_app (uint32_t device_id);
69 uint32_t input_device,
70 uint32_t output_device,
72 uint32_t samples_per_period,
73 int (process_callback (void*, const uint32_t, const uint64_t)),
77 void set_error_callback (
78 void ( error_callback (void*)),
81 _error_callback = error_callback;
82 _error_arg = error_arg;
85 void set_hw_changed_callback (
86 void ( callback (void*)),
89 _hw_changed_callback = callback;
90 _hw_changed_arg = arg;
93 void set_xrun_callback (
94 void ( callback (void*)),
97 _xrun_callback = callback;
100 void set_buffer_size_callback (
101 void ( callback (void*)),
104 _buffer_size_callback = callback;
105 _buffer_size_arg = arg;
107 void set_sample_rate_callback (
108 void ( callback (void*)),
111 _sample_rate_callback = callback;
112 _sample_rate_arg = arg;
115 // must be called from process_callback;
116 int get_capture_channel (uint32_t chn, float *input, uint32_t n_samples);
117 int set_playback_channel (uint32_t chn, const float *input, uint32_t n_samples);
118 uint32_t n_samples() const { return _cur_samples_per_period; };
121 OSStatus render_callback (
122 AudioUnitRenderActionFlags* ioActionFlags,
123 const AudioTimeStamp* inTimeStamp,
125 UInt32 inNumberFrames,
126 AudioBufferList* ioData);
128 void xrun_callback ();
129 void buffer_size_callback ();
130 void sample_rate_callback ();
131 void hw_changed_callback ();
134 float current_sample_rate_id (AudioDeviceID id, bool input);
135 uint32_t current_buffer_size_id (AudioDeviceID id);
136 int set_device_sample_rate_id (AudioDeviceID id, float rate, bool input);
137 int set_device_buffer_size_id (AudioDeviceID id, uint32_t samples_per_period);
138 int set_device_sample_rate (uint32_t device_id, float rate, bool input);
139 void get_stream_latencies (uint32_t device_id, bool input, std::vector<uint32_t>& latencies);
140 void cache_port_names (AudioDeviceID id, bool input);
142 void destroy_aggregate_device();
143 int create_aggregate_device(
144 AudioDeviceID input_device_id,
145 AudioDeviceID output_device_id,
146 uint32_t sample_rate,
147 AudioDeviceID *created_device);
151 AudioDeviceID* _device_ids;
152 AudioBufferList* _input_audio_buffer_list;
153 AudioBufferList* _output_audio_buffer_list;
155 AudioDeviceID _active_device_id;
156 AudioDeviceID _aggregate_device_id;
157 AudioDeviceID _aggregate_plugin_id;
161 uint32_t _samples_per_period;
162 uint32_t _cur_samples_per_period;
163 uint32_t _capture_channels;
164 uint32_t _playback_channels;
168 int (* _process_callback) (void*, const uint32_t, const uint64_t);
171 void (* _error_callback) (void*);
174 void (* _hw_changed_callback) (void*);
175 void * _hw_changed_arg;
177 void (* _xrun_callback) (void*);
180 void (* _buffer_size_callback) (void*);
181 void * _buffer_size_arg;
183 void (* _sample_rate_callback) (void*);
184 void * _sample_rate_arg;
187 // TODO proper device info struct
188 std::map<size_t, std::string> _devices;
189 uint32_t * _device_ins;
190 uint32_t * _device_outs;
191 std::vector<std::string> _input_names;
192 std::vector<std::string> _output_names;
194 pthread_mutex_t _discovery_lock;
199 #endif /* __libbackend_coreaudio_pcmio_h__ */