removing double calls to switch devices, handling default changes from scripting interface instead

This commit is contained in:
amer cerkic 2019-11-04 15:03:53 -08:00
parent 0bfbe413eb
commit b2ab33116f
5 changed files with 34 additions and 94 deletions

View file

@ -287,18 +287,19 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
bool desktopIsSelected = false;
checkHmdDefaultsChange(mode);
if (!_backupSelectedDesktopDeviceName.isEmpty() && !_backupSelectedHMDDeviceName.isEmpty()) {
foreach(const HifiAudioDeviceInfo& deviceInfo, devices) {
for (bool isHMD : {false, true}) {
auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName;
if (deviceInfo.deviceName() == backupSelectedDeviceName) {
if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) {
_selectedHMDDevice= deviceInfo;
backupSelectedDeviceName.clear();
} else if (!isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::hmd) {
_selectedDesktopDevice = deviceInfo;
backupSelectedDeviceName.clear();
}
HifiAudioDeviceInfo oldHmdDevice = HifiAudioDeviceInfo(_selectedHMDDevice);
HifiAudioDeviceInfo oldDesktopDevice = HifiAudioDeviceInfo(_selectedDesktopDevice);
foreach(const HifiAudioDeviceInfo& deviceInfo, devices) {
for (bool isHMD : {false, true}) {
auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName;
if (deviceInfo.deviceName() == backupSelectedDeviceName) {
if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) {
_selectedHMDDevice = deviceInfo;
backupSelectedDeviceName.clear();
} else if (!isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::hmd) {
_selectedDesktopDevice = deviceInfo;
backupSelectedDeviceName.clear();
}
}
}
@ -345,17 +346,12 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
for (bool isHMD : {false, true}) {
HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice;
bool& isSelected = isHMD ? device.selectedHMD : device.selectedDesktop;
isSelected = !selectedDevice.getDevice().isNull() && (device.info == selectedDevice);
if (!selectedDevice.getDevice().isNull()) {
isSelected = (device.info == selectedDevice);
}
else {
//no selected device for context. fallback to saved
QString& savedDeviceName = isHMD ? _hmdSavedDeviceName : _desktopSavedDeviceName;
if (device.info.deviceName() == savedDeviceName) {
if ((isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::desktop) ||
(!isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::hmd)) {
if (!isSelected) {
if (selectedDevice.isDefault() && device.info.isDefault()) {
if ((isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::desktop) || (!isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::hmd)) {
selectedDevice = device.info;
isSelected = true;
}
}
@ -367,19 +363,6 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
} else {
desktopIsSelected = isSelected;
}
// check if this device *is not* in old devices list - it means it was just re-plugged so needs to be selected explicitly
bool isNewDevice = true;
for (auto& oldDevice : _devices) {
if (oldDevice->info.deviceName() == device.info.deviceName()) {
isNewDevice = false;
break;
}
}
if (isNewDevice) {
emit selectedDevicePlugged(device.info, isHMD);
}
}
}
@ -403,6 +386,15 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
_devices.swap(newDevices);
endResetModel();
if (_selectedHMDDevice.isDefault() && _selectedHMDDevice != oldHmdDevice) {
emit selectedDevicePlugged(_selectedHMDDevice,true);
}
if (_selectedDesktopDevice.isDefault() && _selectedDesktopDevice != oldDesktopDevice) {
emit selectedDevicePlugged(_selectedDesktopDevice, false);
}
}
bool AudioInputDeviceList::peakValuesAvailable() {
@ -443,19 +435,6 @@ AudioDevices::AudioDevices(bool& contextIsHMD) : _contextIsHMD(contextIsHMD) {
checkHmdDefaultsChange(QAudio::AudioInput);
checkHmdDefaultsChange(QAudio::AudioOutput);
_inputs.onDeviceChanged(client->getActiveAudioDevice(QAudio::AudioInput), contextIsHMD);
_outputs.onDeviceChanged(client->getActiveAudioDevice(QAudio::AudioOutput), contextIsHMD);
// connections are made after client is initialized, so we must also fetch the devices
const QList<HifiAudioDeviceInfo>& devicesInput = client->getAudioDevices(QAudio::AudioInput);
const QList<HifiAudioDeviceInfo>& devicesOutput = client->getAudioDevices(QAudio::AudioOutput);
if (devicesInput.size() > 0 && devicesOutput.size() > 0) {
//setup devices
_inputs.onDevicesChanged(QAudio::AudioInput, devicesInput);
_outputs.onDevicesChanged(QAudio::AudioOutput, devicesOutput);
}
}
AudioDevices::~AudioDevices() {}
@ -526,29 +505,12 @@ void AudioDevices::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioDevi
static std::once_flag once;
std::call_once(once, [&] {
//readout settings
auto client = DependencyManager::get<AudioClient>().data();
_inputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioInput);
_inputs._desktopSavedDeviceName = getTargetDevice(false, QAudio::AudioInput);
//fallback to default device
if (_inputs._desktopSavedDeviceName.isEmpty()) {
_inputs._desktopSavedDeviceName = client->getActiveAudioDevice(QAudio::AudioInput).deviceName();
}
//fallback to desktop device
if (_inputs._hmdSavedDeviceName.isEmpty()) {
_inputs._hmdSavedDeviceName = _inputs._desktopSavedDeviceName;
}
_outputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioOutput);
_outputs._desktopSavedDeviceName = getTargetDevice(false, QAudio::AudioOutput);
if (_outputs._desktopSavedDeviceName.isEmpty()) {
_outputs._desktopSavedDeviceName = client->getActiveAudioDevice(QAudio::AudioOutput).deviceName();
}
if (_outputs._hmdSavedDeviceName.isEmpty()) {
_outputs._hmdSavedDeviceName = _outputs._desktopSavedDeviceName;
}
onContextChanged(QString());
});

View file

@ -153,9 +153,6 @@ void AudioClient::checkDevices() {
auto inputDevices = getAvailableDevices(QAudio::AudioInput, hmdInputName);
auto outputDevices = getAvailableDevices(QAudio::AudioOutput, hmdOutputName);
checkDefaultChanges(inputDevices);
checkDefaultChanges(outputDevices);
Lock lock(_deviceMutex);
if (inputDevices != _inputDevices) {
_inputDevices.swap(inputDevices);
@ -168,14 +165,6 @@ void AudioClient::checkDevices() {
}
}
void AudioClient::checkDefaultChanges(QList<HifiAudioDeviceInfo>& devices) {
foreach(auto device, devices) {
if (device.isDefault()) {
QMetaObject::invokeMethod(this, "changeDefault", Q_ARG(HifiAudioDeviceInfo, device), Q_ARG(QAudio::Mode, device.getMode()));
}
}
}
HifiAudioDeviceInfo AudioClient::getActiveAudioDevice(QAudio::Mode mode) const {
Lock lock(_deviceMutex);
@ -996,13 +985,6 @@ void AudioClient::selectAudioFormat(const QString& selectedCodecName) {
}
void AudioClient::changeDefault(HifiAudioDeviceInfo newDefault, QAudio::Mode mode) {
HifiAudioDeviceInfo currentDevice = mode == QAudio::AudioInput ? _inputDeviceInfo : _outputDeviceInfo;
if (currentDevice.isDefault() && currentDevice.getDeviceType() == newDefault.getDeviceType() && currentDevice.getDevice() != newDefault.getDevice()) {
switchAudioDevice(mode, newDefault);
}
}
bool AudioClient::switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo) {
auto device = deviceInfo;
if (deviceInfo.getDevice().isNull()) {
@ -1883,11 +1865,8 @@ bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDevice
qCDebug(audioclient) << "The audio input device" << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << "is available.";
//do not update UI that we're changing devices if default or same device
bool doEmit = _inputDeviceInfo.deviceName() != inputDeviceInfo.deviceName();
_inputDeviceInfo = inputDeviceInfo;
if (doEmit) {
emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo);
}
emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo);
if (adjustedFormatForAudioDevice(_inputDeviceInfo.getDevice(), _desiredInputFormat, _inputFormat)) {
qCDebug(audioclient) << "The format to be used for audio input is" << _inputFormat;
@ -2125,11 +2104,8 @@ bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDevi
qCDebug(audioclient) << "The audio output device" << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "is available.";
//do not update UI that we're changing devices if default or same device
bool doEmit = _outputDeviceInfo.deviceName() != outputDeviceInfo.deviceName();
_outputDeviceInfo = outputDeviceInfo;
if (doEmit) {
emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo);
}
emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo);
if (adjustedFormatForAudioDevice(_outputDeviceInfo.getDevice(), _desiredOutputFormat, _outputFormat)) {
qCDebug(audioclient) << "The format to be used for audio output is" << _outputFormat;

View file

@ -237,8 +237,6 @@ public slots:
int setOutputBufferSize(int numFrames, bool persist = true);
bool shouldLoopbackInjectors() override { return _shouldEchoToServer; }
Q_INVOKABLE void changeDefault(HifiAudioDeviceInfo newDefault, QAudio::Mode mode);
void checkDefaultChanges(QList<HifiAudioDeviceInfo>& devices);
// calling with a null QAudioDevice will use the system default
bool switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo = HifiAudioDeviceInfo());

View file

@ -23,6 +23,7 @@ HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& o
_mode = other.getMode();
_isDefault = other.isDefault();
_deviceType = other.getDeviceType();
_debugName = other.getDevice().deviceName();
return *this;
}

View file

@ -35,13 +35,15 @@ public:
_mode = deviceInfo.getMode();
_isDefault = deviceInfo.isDefault();
_deviceType = deviceInfo.getDeviceType();
_debugName = deviceInfo.getDevice().deviceName();
}
HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) :
_audioDeviceInfo(deviceInfo),
_isDefault(isDefault),
_mode(mode),
_deviceType(devType){
_deviceType(devType),
_debugName(deviceInfo.deviceName()) {
}
void setMode(QAudio::Mode mode) { _mode = mode; }
@ -70,6 +72,7 @@ private:
bool _isDefault { false };
QAudio::Mode _mode { QAudio::AudioInput };
DeviceType _deviceType{ both };
QString _debugName;
public:
static const QString DEFAULT_DEVICE_NAME;