|
|
@@ -230,13 +230,13 @@ struct RtAudioDriver : audio::Driver { |
|
|
|
RtAudio::Api api; |
|
|
|
// deviceId -> Device |
|
|
|
std::map<int, RtAudioDevice*> devices; |
|
|
|
RtAudio* rtAudio = NULL; |
|
|
|
std::vector<RtAudio::DeviceInfo> deviceInfos; |
|
|
|
|
|
|
|
RtAudioDriver(RtAudio::Api api) { |
|
|
|
this->api = api; |
|
|
|
|
|
|
|
INFO("Creating RtAudio %s driver", RTAUDIO_API_NAMES.at(api).c_str()); |
|
|
|
RtAudio* rtAudio; |
|
|
|
try { |
|
|
|
rtAudio = new RtAudio(api); |
|
|
|
} |
|
|
@@ -246,17 +246,25 @@ struct RtAudioDriver : audio::Driver { |
|
|
|
|
|
|
|
rtAudio->showWarnings(false); |
|
|
|
|
|
|
|
// Cache all DeviceInfos for performance and stability (especially for ASIO). |
|
|
|
int count = rtAudio->getDeviceCount(); |
|
|
|
for (int deviceId = 0; deviceId < count; deviceId++) { |
|
|
|
RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(deviceId); |
|
|
|
INFO("Found RtAudio %s device %d: %s (%d in, %d out)", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, deviceInfo.name.c_str(), deviceInfo.inputChannels, deviceInfo.outputChannels); |
|
|
|
deviceInfos.push_back(deviceInfo); |
|
|
|
// Cache DeviceInfos for performance and stability (especially for ASIO). |
|
|
|
// Cache all audio drivers for now. |
|
|
|
if (true) { |
|
|
|
int count = rtAudio->getDeviceCount(); |
|
|
|
for (int deviceId = 0; deviceId < count; deviceId++) { |
|
|
|
RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(deviceId); |
|
|
|
INFO("Found RtAudio %s device %d: %s (%d in, %d out)", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, deviceInfo.name.c_str(), deviceInfo.inputChannels, deviceInfo.outputChannels); |
|
|
|
deviceInfos.push_back(deviceInfo); |
|
|
|
} |
|
|
|
|
|
|
|
delete rtAudio; |
|
|
|
rtAudio = NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
~RtAudioDriver() { |
|
|
|
assert(devices.empty()); |
|
|
|
if (rtAudio) |
|
|
|
delete rtAudio; |
|
|
|
} |
|
|
|
|
|
|
|
std::string getName() override { |
|
|
@@ -264,28 +272,63 @@ struct RtAudioDriver : audio::Driver { |
|
|
|
} |
|
|
|
|
|
|
|
std::vector<int> getDeviceIds() override { |
|
|
|
int count = 0; |
|
|
|
if (rtAudio) { |
|
|
|
count = rtAudio->getDeviceCount(); |
|
|
|
} |
|
|
|
else { |
|
|
|
count = deviceInfos.size(); |
|
|
|
} |
|
|
|
|
|
|
|
std::vector<int> deviceIds; |
|
|
|
for (int i = 0; i < (int) deviceInfos.size(); i++) |
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
deviceIds.push_back(i); |
|
|
|
return deviceIds; |
|
|
|
} |
|
|
|
|
|
|
|
std::string getDeviceName(int deviceId) override { |
|
|
|
if (!(0 <= deviceId && deviceId < (int) deviceInfos.size())) |
|
|
|
return ""; |
|
|
|
return deviceInfos[deviceId].name; |
|
|
|
if (rtAudio) { |
|
|
|
int count = rtAudio->getDeviceCount(); |
|
|
|
if (0 <= deviceId && deviceId < count) { |
|
|
|
RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(deviceId); |
|
|
|
return deviceInfo.name; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
if (0 <= deviceId && deviceId < (int) deviceInfos.size()) |
|
|
|
return deviceInfos[deviceId].name; |
|
|
|
} |
|
|
|
return ""; |
|
|
|
} |
|
|
|
|
|
|
|
int getDeviceNumInputs(int deviceId) override { |
|
|
|
if (!(0 <= deviceId && deviceId < (int) deviceInfos.size())) |
|
|
|
return 0; |
|
|
|
return deviceInfos[deviceId].inputChannels; |
|
|
|
if (rtAudio) { |
|
|
|
int count = rtAudio->getDeviceCount(); |
|
|
|
if (0 <= deviceId && deviceId < count) { |
|
|
|
RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(deviceId); |
|
|
|
return deviceInfo.inputChannels; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
if (0 <= deviceId && deviceId < (int) deviceInfos.size()) |
|
|
|
return deviceInfos[deviceId].inputChannels; |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int getDeviceNumOutputs(int deviceId) override { |
|
|
|
if (!(0 <= deviceId && deviceId < (int) deviceInfos.size())) |
|
|
|
return 0; |
|
|
|
return deviceInfos[deviceId].outputChannels; |
|
|
|
if (rtAudio) { |
|
|
|
int count = rtAudio->getDeviceCount(); |
|
|
|
if (0 <= deviceId && deviceId < count) { |
|
|
|
RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(deviceId); |
|
|
|
return deviceInfo.outputChannels; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
if (0 <= deviceId && deviceId < (int) deviceInfos.size()) |
|
|
|
return deviceInfos[deviceId].outputChannels; |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
audio::Device* subscribe(int deviceId, audio::Port* port) override { |
|
|
|