mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 00:04:56 +01:00
half-duplex Coreaudio support.
This commit is contained in:
parent
3d2f298fb2
commit
b36d95d971
2 changed files with 34 additions and 16 deletions
|
|
@ -164,6 +164,7 @@ CoreAudioBackend::enumerate_input_devices () const
|
||||||
std::map<size_t, std::string> devices;
|
std::map<size_t, std::string> devices;
|
||||||
_pcmio->input_device_list(devices);
|
_pcmio->input_device_list(devices);
|
||||||
|
|
||||||
|
_input_audio_device_status.push_back (DeviceStatus (_("None"), true));
|
||||||
for (std::map<size_t, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
|
for (std::map<size_t, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
|
||||||
if (_input_audio_device == "") _input_audio_device = i->second;
|
if (_input_audio_device == "") _input_audio_device = i->second;
|
||||||
_input_audio_device_status.push_back (DeviceStatus (i->second, true));
|
_input_audio_device_status.push_back (DeviceStatus (i->second, true));
|
||||||
|
|
@ -179,6 +180,7 @@ CoreAudioBackend::enumerate_output_devices () const
|
||||||
std::map<size_t, std::string> devices;
|
std::map<size_t, std::string> devices;
|
||||||
_pcmio->output_device_list(devices);
|
_pcmio->output_device_list(devices);
|
||||||
|
|
||||||
|
_output_audio_device_status.push_back (DeviceStatus (_("None"), true));
|
||||||
for (std::map<size_t, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
|
for (std::map<size_t, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
|
||||||
if (_output_audio_device == "") _output_audio_device = i->second;
|
if (_output_audio_device == "") _output_audio_device = i->second;
|
||||||
_output_audio_device_status.push_back (DeviceStatus (i->second, true));
|
_output_audio_device_status.push_back (DeviceStatus (i->second, true));
|
||||||
|
|
@ -193,12 +195,23 @@ CoreAudioBackend::available_sample_rates (const std::string&) const
|
||||||
std::vector<float> sr_in;
|
std::vector<float> sr_in;
|
||||||
std::vector<float> sr_out;
|
std::vector<float> sr_out;
|
||||||
|
|
||||||
_pcmio->available_sample_rates(name_to_id(_input_audio_device), sr_in);
|
const uint32_t inp = name_to_id(_input_audio_device);
|
||||||
_pcmio->available_sample_rates(name_to_id(_output_audio_device), sr_out);
|
const uint32_t out = name_to_id(_output_audio_device);
|
||||||
|
if (inp == UINT32_MAX && out == UINT32_MAX) {
|
||||||
|
return sr;
|
||||||
|
} else if (inp == UINT32_MAX) {
|
||||||
|
_pcmio->available_sample_rates(out, sr_out);
|
||||||
|
return sr_out;
|
||||||
|
} else if (out == UINT32_MAX) {
|
||||||
|
_pcmio->available_sample_rates(inp, sr_in);
|
||||||
|
return sr_in;
|
||||||
|
} else {
|
||||||
|
_pcmio->available_sample_rates(inp, sr_in);
|
||||||
|
_pcmio->available_sample_rates(out, sr_out);
|
||||||
// TODO allow to use different SR per device, tweak aggregate
|
// TODO allow to use different SR per device, tweak aggregate
|
||||||
std::set_intersection(sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr));
|
std::set_intersection(sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr));
|
||||||
return sr;
|
return sr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint32_t>
|
std::vector<uint32_t>
|
||||||
|
|
|
||||||
|
|
@ -571,6 +571,9 @@ CoreAudioPCM::set_device_sample_rate_id (AudioDeviceID id, float rate, bool inpu
|
||||||
int
|
int
|
||||||
CoreAudioPCM::set_device_sample_rate (uint32_t device_id, float rate, bool input)
|
CoreAudioPCM::set_device_sample_rate (uint32_t device_id, float rate, bool input)
|
||||||
{
|
{
|
||||||
|
if (device_id >= _n_devices) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return set_device_sample_rate_id(_device_ids[device_id], rate, input);
|
return set_device_sample_rate_id(_device_ids[device_id], rate, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -793,9 +796,8 @@ CoreAudioPCM::pcm_start (
|
||||||
std::string errorMsg;
|
std::string errorMsg;
|
||||||
_state = -2;
|
_state = -2;
|
||||||
|
|
||||||
// TODO add "none' device to force half-duplex
|
// "None" = UINT32_MAX
|
||||||
|
if (device_id_out >= _n_devices && device_id_in >= _n_devices) {
|
||||||
if (device_id_out >= _n_devices || device_id_in >= _n_devices) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -809,8 +811,8 @@ CoreAudioPCM::pcm_start (
|
||||||
_capture_channels = 0;
|
_capture_channels = 0;
|
||||||
_playback_channels = 0;
|
_playback_channels = 0;
|
||||||
|
|
||||||
const uint32_t chn_in = _device_ins[device_id_in] + ((device_id_out != device_id_in) ? _device_ins[device_id_out] : 0);
|
const uint32_t chn_in = (device_id_in < _n_devices ? _device_ins[device_id_in] : 0) + ((device_id_out != device_id_in && device_id_out < _n_devices) ? _device_ins[device_id_out] : 0);
|
||||||
const uint32_t chn_out = _device_outs[device_id_out] + ((device_id_out != device_id_in) ? _device_outs[device_id_in] : 0);
|
const uint32_t chn_out =(device_id_out < _n_devices ? _device_outs[device_id_out] : 0) + ((device_id_out != device_id_in && device_id_in < _n_devices) ? _device_outs[device_id_in] : 0);
|
||||||
|
|
||||||
assert (chn_in > 0 || chn_out > 0);
|
assert (chn_in > 0 || chn_out > 0);
|
||||||
|
|
||||||
|
|
@ -839,15 +841,15 @@ CoreAudioPCM::pcm_start (
|
||||||
}
|
}
|
||||||
|
|
||||||
// explicitly request device buffer size
|
// explicitly request device buffer size
|
||||||
if (set_device_buffer_size_id(_device_ids[device_id_in], samples_per_period)) {
|
if (device_id_in < _n_devices && set_device_buffer_size_id(_device_ids[device_id_in], samples_per_period)) {
|
||||||
errorMsg="kAudioDevicePropertyBufferFrameSize, Input"; goto error;
|
errorMsg="kAudioDevicePropertyBufferFrameSize, Input"; goto error;
|
||||||
}
|
}
|
||||||
if (set_device_buffer_size_id(_device_ids[device_id_out], samples_per_period)) {
|
if (device_id_out < _n_devices && set_device_buffer_size_id(_device_ids[device_id_out], samples_per_period)) {
|
||||||
errorMsg="kAudioDevicePropertyBufferFrameSize, Output"; goto error;
|
errorMsg="kAudioDevicePropertyBufferFrameSize, Output"; goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create aggregate device..
|
// create aggregate device..
|
||||||
if (_device_ids[device_id_in] != _device_ids[device_id_out]) {
|
if (device_id_in < _n_devices && device_id_out < _n_devices && _device_ids[device_id_in] != _device_ids[device_id_out]) {
|
||||||
if (0 == create_aggregate_device(_device_ids[device_id_in], _device_ids[device_id_out], sample_rate, &_aggregate_device_id)) {
|
if (0 == create_aggregate_device(_device_ids[device_id_in], _device_ids[device_id_out], sample_rate, &_aggregate_device_id)) {
|
||||||
device_id = _aggregate_device_id;
|
device_id = _aggregate_device_id;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -855,12 +857,15 @@ CoreAudioPCM::pcm_start (
|
||||||
_aggregate_plugin_id = 0;
|
_aggregate_plugin_id = 0;
|
||||||
errorMsg="Cannot create Aggregate Device"; goto error;
|
errorMsg="Cannot create Aggregate Device"; goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (device_id_out < _n_devices) {
|
||||||
device_id = _device_ids[device_id_out];
|
device_id = _device_ids[device_id_out];
|
||||||
|
} else {
|
||||||
|
assert (device_id_in < _n_devices);
|
||||||
|
device_id = _device_ids[device_id_in];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device_id_out != device_id_in) {
|
if (device_id_out != device_id_in) {
|
||||||
assert(_aggregate_device_id > 0);
|
assert(_aggregate_device_id > 0 || device_id_in >= _n_devices || device_id_out >= _n_devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
// enableIO to progress further
|
// enableIO to progress further
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue