mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-08 19:23:28 +02:00
removing double calls to switch devices, handling default changes from scripting interface instead
This commit is contained in:
parent
0bfbe413eb
commit
b2ab33116f
5 changed files with 34 additions and 94 deletions
|
@ -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());
|
||||
});
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue