diff --git a/AudioManager/AudioManager.cpp b/AudioManager/AudioManager.cpp index 8f8c565..d1d2dcc 100644 --- a/AudioManager/AudioManager.cpp +++ b/AudioManager/AudioManager.cpp @@ -49,15 +49,16 @@ std::vector parseDevices(const std::string &output) if (deviceStarted) { devices.push_back(currentDevice); } - currentDevice = Device{-1, "", ""}; + currentDevice = Device{-1, "", "", false}; deviceStarted = true; currentDevice.index = std::stoi(line.substr(line.find(":") + 2)); } else if (line.find("Name") != std::string::npos) { - std::string_view lineView(line); - currentDevice.name = std::string(lineView.substr(lineView.find(":") + 2)); + currentDevice.name = line.substr(line.find(":") + 2); } else if (line.find("Type") != std::string::npos) { - std::string_view lineView(line); - currentDevice.type = std::string(lineView.substr(lineView.find(":") + 2)); + currentDevice.type = line.substr(line.find(":") + 2); + } else if (line.find("Default") != std::string::npos) { + std::string defaultValue = line.substr(line.find(":") + 2); + currentDevice.isDefault = (defaultValue == "True"); } } @@ -90,6 +91,20 @@ bool checkDevice(const std::string &deviceName) return false; } +std::string AudioManager::getDefaultOutputDevice() +{ + std::string output = executeCommand("Get-AudioDevice -l"); + std::vector devices = parseDevices(output); + + for (const auto &device : devices) { + if (device.type == "Playback" && device.isDefault) { + return device.name; + } + } + + return ""; +} + void AudioManager::setAudioDevice(const std::string &deviceName) { bool deviceFound = false; diff --git a/AudioManager/AudioManager.h b/AudioManager/AudioManager.h index fe5e24a..e504f4d 100644 --- a/AudioManager/AudioManager.h +++ b/AudioManager/AudioManager.h @@ -8,12 +8,14 @@ struct Device int index; std::string name; std::string type; + bool isDefault = false; }; namespace AudioManager { void setAudioDevice(const std::string &deviceName); void detectNewOutputs(); + std::string getDefaultOutputDevice(); }; #endif // AUDIOMANAGER_H diff --git a/BigPictureTV/BigPictureTV.cpp b/BigPictureTV/BigPictureTV.cpp index 73945cc..bcda792 100644 --- a/BigPictureTV/BigPictureTV.cpp +++ b/BigPictureTV/BigPictureTV.cpp @@ -78,6 +78,9 @@ void BigPictureTV::checkWindowTitle() } if (isRunning && !gamemodeActive) { + if (autodetect_desktop) { + currentAudioOutputName = AudioManager::getDefaultOutputDevice(); + } gamemodeActive = true; handleActions(false); handleMonitorChanges(false, disable_monitor_switch); @@ -124,6 +127,10 @@ void BigPictureTV::handleAudioChanges(bool isDesktopMode, bool disableAudio) return; } + if (autodetect_desktop && isDesktopMode) { + AudioManager::setAudioDevice(currentAudioOutputName); + } + QString audioDevice = isDesktopMode ? desktop_audio_device : gamemode_audio_device; @@ -207,6 +214,7 @@ void BigPictureTV::loadSettings() target_window_mode = settings.value("target_window_mode").toInt(); custom_window_title = settings.value("custom_window_title").toString(); autodetect_HDMI = settings.value("autodetect_hdmi").toBool(); + autodetect_desktop = settings.value("autodetect_desktop").toBool(); qDebug() << "Audio configuration:"; qDebug() << ""; diff --git a/BigPictureTV/BigPictureTV.h b/BigPictureTV/BigPictureTV.h index 77c79e2..835433b 100644 --- a/BigPictureTV/BigPictureTV.h +++ b/BigPictureTV/BigPictureTV.h @@ -59,6 +59,8 @@ private slots: bool disable_nightlight_action; bool target_window_mode; bool autodetect_HDMI; + bool autodetect_desktop; + std::string currentAudioOutputName; QSettings settings; bool gamemodeActive; }; diff --git a/Configurator/Configurator.cpp b/Configurator/Configurator.cpp index b33acf9..8b8fe3b 100644 --- a/Configurator/Configurator.cpp +++ b/Configurator/Configurator.cpp @@ -25,7 +25,7 @@ Configurator::Configurator(QWidget *parent) ui->actionsFrame->setVisible(false); ui->advancedFrame->setVisible(false); Utils::setFrameColorBasedOnWindow(this, ui->frame); - this->setFixedSize(356, 224); + this->setFixedSize(382, 224); setupConnections(); getAudioCapabilities(); } @@ -50,6 +50,7 @@ void Configurator::setupConnections() connect(ui->actionsButton, &QPushButton::clicked, this, &Configurator::setActionsTab); connect(ui->advancedButton, &QPushButton::clicked, this, &Configurator::setAdvancedTab); connect(ui->autodetectCheckBox, &QCheckBox::checkStateChanged, this, &Configurator::onAutodetectCheckBoxStateChanged); + connect(ui->autodetectDesktopCheckBox, &QCheckBox::checkStateChanged, this, &Configurator::onAutodetectDesktopCheckBoxStateChanged); ui->startupCheckBox->setChecked(ShortcutManager::isShortcutPresent("BigPictureTV.lnk")); initDiscordAction(); @@ -82,6 +83,9 @@ void Configurator::getAudioCapabilities() if (ui->autodetectCheckBox->isChecked()) { ui->gamemodeAudioLineEdit->setEnabled(false); } + if (ui->autodetectDesktopCheckBox->isChecked()) { + ui->desktopAudioLineEdit->setEnabled(false); + } } } @@ -121,6 +125,14 @@ void Configurator::onAutodetectCheckBoxStateChanged(Qt::CheckState state) } } +void Configurator::onAutodetectDesktopCheckBoxStateChanged(Qt::CheckState state) +{ + bool isChecked = (state == Qt::Checked); + if (!ui->disableAudioCheckBox->isChecked()) { + ui->desktopAudioLineEdit->setDisabled(isChecked); + } +} + void Configurator::onTargetWindowComboBoxIndexChanged(int index) { if (index == 1) { @@ -210,11 +222,13 @@ void Configurator::loadSettings() ui->customWindowLineEdit->setText(settings.value("custom_window_title", "").toString()); ui->targetWindowComboBox->setCurrentIndex(settings.value("target_window_mode", 0).toInt()); ui->autodetectCheckBox->setChecked(settings.value("autodetect_hdmi", false).toBool()); + ui->autodetectDesktopCheckBox->setChecked(settings.value("autodetect_desktop", false).toBool()); toggleAudioSettings(!ui->disableAudioCheckBox->isChecked()); toggleMonitorSettings(!ui->disableMonitorCheckBox->isChecked()); toggleCustomWindowTitle(ui->targetWindowComboBox->currentIndex() == 1); ui->gamemodeAudioLineEdit->setDisabled(ui->autodetectCheckBox->isChecked()); + ui->desktopAudioLineEdit->setDisabled(ui->autodetectDesktopCheckBox->isChecked()); } void Configurator::saveSettings() @@ -233,6 +247,7 @@ void Configurator::saveSettings() settings.setValue("target_window_mode", ui->targetWindowComboBox->currentIndex()); settings.setValue("custom_window_title", ui->customWindowLineEdit->text()); settings.setValue("autodetect_hdmi", ui->autodetectCheckBox->isChecked()); + settings.setValue("autodetect_desktop", ui->autodetectDesktopCheckBox->isChecked()); } void Configurator::toggleAudioSettings(bool state) diff --git a/Configurator/Configurator.h b/Configurator/Configurator.h index eb429ac..df59917 100644 --- a/Configurator/Configurator.h +++ b/Configurator/Configurator.h @@ -26,6 +26,7 @@ private slots: void onDisableAudioCheckboxStateChanged(Qt::CheckState state); void onDisableMonitorCheckboxStateChanged(Qt::CheckState state); void onAutodetectCheckBoxStateChanged(Qt::CheckState state); + void onAutodetectDesktopCheckBoxStateChanged(Qt::CheckState state); void onTargetWindowComboBoxIndexChanged(int index); void onAudioButtonClicked(); void setGeneralTab(); diff --git a/Configurator/Configurator.ui b/Configurator/Configurator.ui index 018762f..7953bf5 100644 --- a/Configurator/Configurator.ui +++ b/Configurator/Configurator.ui @@ -6,8 +6,8 @@ 0 0 - 356 - 590 + 379 + 592 @@ -218,33 +218,21 @@ 6 - - + + - 90 + 0 25 - - true - - - 100 - - - 1000 - - - 100 - - - 1000 + + Custom window title - - + + 0 @@ -252,22 +240,38 @@ - Reset default settings + Window check rate - - + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + 0 25 + + Target window + - - + + 0 @@ -275,37 +279,96 @@ - Window check rate + Reset default settings - - + + - 0 + 90 25 - - Target window + + true + + + 100 + + + 1000 + + + 100 + + + 1000 - - + + + + + + Qt::LayoutDirection::RightToLeft + + + + + + + + + + + 0 + 25 + + + + Autodetect desktop audio + + + + + + + + 0 + 25 + + + + Autodetect gamemode audio + + + + + + + Qt::LayoutDirection::RightToLeft + + + + + + + + + + 0 25 - - Custom window title - - + @@ -324,8 +387,8 @@ - - + + 0 @@ -334,19 +397,6 @@ - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - @@ -652,29 +702,6 @@ - - - - - 0 - 25 - - - - Autodetect TV HDMI audio - - - - - - - Qt::LayoutDirection::RightToLeft - - - - - -