Added combo-boxes to allow audio device selection.

This commit is contained in:
2017-02-13 22:19:42 +01:00
parent 22af8b9633
commit c8d089957d
7 changed files with 699 additions and 134 deletions
+102 -56
View File
@@ -8,6 +8,8 @@ MyStackViewPage {
width: 1200 width: 1200
headerText: "Audio Settings" headerText: "Audio Settings"
property bool componentCompleted: false
MyDialogOkPopup { MyDialogOkPopup {
id: audioMessageDialog id: audioMessageDialog
@@ -77,17 +79,43 @@ MyStackViewPage {
} }
content: ColumnLayout { content: ColumnLayout {
spacing: 92 spacing: 68
RowLayout {
MyText {
text: "Playback Device: "
Layout.preferredWidth: 210
}
MyComboBox {
id: audioPlaybackNameCombo
Layout.maximumWidth: 900
Layout.minimumWidth: 900
Layout.preferredWidth: 900
onCurrentIndexChanged: {
if (componentCompleted) {
AudioTabController.setPlaybackDeviceIndex(currentIndex)
}
}
}
}
ColumnLayout { ColumnLayout {
spacing: 18 spacing: 18
RowLayout { RowLayout {
MyText { MyText {
text: "Mirror Device: " text: "Mirror Device: "
Layout.preferredWidth: 210
} }
MyText { MyComboBox {
id: audioMirrorNameText id: audioMirrorNameCombo
text: "<None>" Layout.maximumWidth: 900
Layout.minimumWidth: 900
Layout.preferredWidth: 900
onCurrentIndexChanged: {
if (componentCompleted) {
AudioTabController.setMirrorDeviceIndex(currentIndex - 1)
}
}
} }
} }
RowLayout { RowLayout {
@@ -159,10 +187,18 @@ MyStackViewPage {
RowLayout { RowLayout {
MyText { MyText {
text: "Microphone: " text: "Microphone: "
Layout.preferredWidth: 210
} }
MyText { MyComboBox {
id: audioMicNameText id: audioMicNameCombo
text: "<None>" Layout.maximumWidth: 900
Layout.minimumWidth: 900
Layout.preferredWidth: 900
onCurrentIndexChanged: {
if (componentCompleted) {
AudioTabController.setMicDeviceIndex(currentIndex)
}
}
} }
} }
RowLayout { RowLayout {
@@ -338,64 +374,80 @@ MyStackViewPage {
} }
Component.onCompleted: { Component.onCompleted: {
reloadPttProfiles() var devs1 = []
if (AudioTabController.mirrorPresent) { var devs2 = ["<None>"]
audioMirrorVolumeMinusButton.enabled = true var playbackDeviceCount = AudioTabController.getPlaybackDeviceCount()
audioMirrorVolumeSlider.enabled = true for (var i = 0; i < playbackDeviceCount; i++) {
audioMirrorVolumePlusButton.enabled = true var name = AudioTabController.getPlaybackDeviceName(i)
audioMirrorMuteToggle.enabled = true devs1.push(name)
audioMirrorNameText.text = AudioTabController.mirrorDevName devs2.push(name)
audioMirrorVolumeSlider.value = AudioTabController.mirrorVolume }
audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted audioPlaybackNameCombo.model = devs1
} else { audioPlaybackNameCombo.currentIndex = AudioTabController.playbackDeviceIndex
audioMirrorNameCombo.model = devs2
if (AudioTabController.mirrorDeviceIndex < 0) {
audioMirrorNameCombo.currentIndex = 0
audioMirrorVolumeMinusButton.enabled = false audioMirrorVolumeMinusButton.enabled = false
audioMirrorVolumeSlider.enabled = false audioMirrorVolumeSlider.enabled = false
audioMirrorVolumePlusButton.enabled = false audioMirrorVolumePlusButton.enabled = false
audioMirrorMuteToggle.enabled = false audioMirrorMuteToggle.enabled = false
audioMirrorNameText.text = "<None>"
}
if (AudioTabController.micPresent) {
audioMicVolumeMinusButton.enabled = true
audioMicVolumeSlider.enabled = true
audioMicVolumePlusButton.enabled = true
audioMicMuteToggle.enabled = true
audioMicNameText.text = AudioTabController.micDevName
audioMicVolumeSlider.value = AudioTabController.micVolume
audioMicMuteToggle.checked = AudioTabController.micMuted
} else { } else {
audioMirrorVolumeMinusButton.enabled = true
audioMirrorVolumeSlider.enabled = true
audioMirrorVolumePlusButton.enabled = true
audioMirrorMuteToggle.enabled = true
audioMirrorVolumeSlider.value = AudioTabController.mirrorVolume
audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted
audioMirrorNameCombo.currentIndex = AudioTabController.mirrorDeviceIndex + 1
}
var devs3 = []
var micDeviceCount = AudioTabController.getRecordingDeviceCount()
for (var i = 0; i < micDeviceCount; i++) {
var name = AudioTabController.getRecordingDeviceName(i)
devs3.push(name)
}
audioMicNameCombo.model = devs3
if (AudioTabController.micDeviceIndex < 0) {
audioMicNameCombo.currentIndex = 0
audioMicVolumeMinusButton.enabled = false audioMicVolumeMinusButton.enabled = false
audioMicVolumeSlider.enabled = false audioMicVolumeSlider.enabled = false
audioMicVolumePlusButton.enabled = false audioMicVolumePlusButton.enabled = false
audioMicMuteToggle.enabled = false audioMicMuteToggle.enabled = false
audioMicNameText.text = "<None>" } else {
audioMicVolumeMinusButton.enabled = true
audioMicVolumeSlider.enabled = true
audioMicVolumePlusButton.enabled = true
audioMicMuteToggle.enabled = true
audioMicVolumeSlider.value = AudioTabController.micVolume
audioMicMuteToggle.checked = AudioTabController.micMuted
audioMicNameCombo.currentIndex = AudioTabController.micDeviceIndex
} }
reloadPttProfiles()
audioPttEnabledToggle.checked = AudioTabController.pttEnabled audioPttEnabledToggle.checked = AudioTabController.pttEnabled
audioPttLeftControllerToggle.checked = AudioTabController.pttLeftControllerEnabled audioPttLeftControllerToggle.checked = AudioTabController.pttLeftControllerEnabled
audioPttRightControllerToggle.checked = AudioTabController.pttRightControllerEnabled audioPttRightControllerToggle.checked = AudioTabController.pttRightControllerEnabled
audioPttShowNotificationToggle.checked = AudioTabController.pttShowNotification audioPttShowNotificationToggle.checked = AudioTabController.pttShowNotification
componentCompleted = true
} }
Connections { Connections {
target: AudioTabController target: AudioTabController
onMirrorPresentChanged: { onPlaybackDeviceIndexChanged: {
if (value) { audioPlaybackNameCombo.currentIndex = index
audioMirrorVolumeMinusButton.enabled = true }
audioMirrorVolumeSlider.enabled = true onMirrorDeviceIndexChanged: {
audioMirrorVolumePlusButton.enabled = true if (index < 0) {
audioMirrorMuteToggle.enabled = true audioMirrorNameCombo.currentIndex = 0
} else {
audioMirrorVolumeMinusButton.enabled = false audioMirrorVolumeMinusButton.enabled = false
audioMirrorVolumeSlider.enabled = false audioMirrorVolumeSlider.enabled = false
audioMirrorVolumePlusButton.enabled = false audioMirrorVolumePlusButton.enabled = false
audioMirrorMuteToggle.enabled = false audioMirrorMuteToggle.enabled = false
audioMirrorNameText.text = "<None>"
}
}
onMirrorDevNameChanged: {
if (AudioTabController.mirrorPresent) {
audioMirrorNameText.text = AudioTabController.mirrorDevName
} else { } else {
audioMirrorNameText.text = "<None>" audioMirrorVolumeMinusButton.enabled = true
audioMirrorVolumeSlider.enabled = true
audioMirrorVolumePlusButton.enabled = true
audioMirrorMuteToggle.enabled = true
audioMirrorNameCombo.currentIndex = index + 1
} }
} }
onMirrorVolumeChanged: { onMirrorVolumeChanged: {
@@ -404,25 +456,19 @@ MyStackViewPage {
onMirrorMutedChanged: { onMirrorMutedChanged: {
audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted
} }
onMicPresentChanged: { onMicDeviceIndexChanged: {
if (value) { if (index < 0) {
audioMicVolumeMinusButton.enabled = true audioMicNameCombo.currentIndex = 0
audioMicVolumeSlider.enabled = true
audioMicVolumePlusButton.enabled = true
audioMicMuteToggle.enabled = true
} else {
audioMicVolumeMinusButton.enabled = false audioMicVolumeMinusButton.enabled = false
audioMicVolumeSlider.enabled = false audioMicVolumeSlider.enabled = false
audioMicVolumePlusButton.enabled = false audioMicVolumePlusButton.enabled = false
audioMicMuteToggle.enabled = false audioMicMuteToggle.enabled = false
audioMicNameText.text = "<None>"
}
}
onMicDevNameChanged: {
if (AudioTabController.micPresent) {
audioMicNameText.text = AudioTabController.micDevName
} else { } else {
audioMicNameText.text = "<None>" audioMicVolumeMinusButton.enabled = true
audioMicVolumeSlider.enabled = true
audioMicVolumePlusButton.enabled = true
audioMicMuteToggle.enabled = true
audioMicNameCombo.currentIndex = index
} }
} }
onMicVolumeChanged: { onMicVolumeChanged: {
+12 -2
View File
@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector>
// application namespace // application namespace
namespace advsettings { namespace advsettings {
@@ -14,21 +15,30 @@ public:
virtual void init(AudioTabController* controller) = 0; virtual void init(AudioTabController* controller) = 0;
virtual void setMirrorDevice(const std::string& id) = 0; virtual void setPlaybackDevice(const std::string& id, bool notify = true) = 0;
virtual void deleteMirrorDevice() = 0; virtual std::string getPlaybackDevName() = 0;
virtual std::string getPlaybackDevId() = 0;
virtual void setMirrorDevice(const std::string& id, bool notify = true) = 0;
virtual bool isMirrorValid() = 0; virtual bool isMirrorValid() = 0;
virtual std::string getMirrorDevName() = 0; virtual std::string getMirrorDevName() = 0;
virtual std::string getMirrorDevId() = 0;
virtual float getMirrorVolume() = 0; virtual float getMirrorVolume() = 0;
virtual bool setMirrorVolume(float value) = 0; virtual bool setMirrorVolume(float value) = 0;
virtual bool getMirrorMuted() = 0; virtual bool getMirrorMuted() = 0;
virtual bool setMirrorMuted(bool value) = 0; virtual bool setMirrorMuted(bool value) = 0;
virtual void setMicDevice(const std::string& id, bool notify = true) = 0;
virtual bool isMicValid() = 0; virtual bool isMicValid() = 0;
virtual std::string getMicDevName() = 0; virtual std::string getMicDevName() = 0;
virtual std::string getMicDevId() = 0;
virtual float getMicVolume() = 0; virtual float getMicVolume() = 0;
virtual bool setMicVolume(float value) = 0; virtual bool setMicVolume(float value) = 0;
virtual bool getMicMuted() = 0; virtual bool getMicMuted() = 0;
virtual bool setMicMuted(bool value) = 0; virtual bool setMicMuted(bool value) = 0;
virtual std::vector<std::pair<std::string, std::string>> getRecordingDevices() = 0;
virtual std::vector<std::pair<std::string, std::string>> getPlaybackDevices() = 0;
}; };
} }
+179 -55
View File
@@ -11,21 +11,23 @@ namespace advsettings {
vr::EVRSettingsError vrSettingsError; vr::EVRSettingsError vrSettingsError;
audioManager.reset(new AudioManagerWindows()); audioManager.reset(new AudioManagerWindows());
audioManager->init(this); audioManager->init(this);
char mirrorDeviceId[1024]; m_playbackDevices = audioManager->getPlaybackDevices();
vr::VRSettings()->GetString(vr::k_pch_audio_Section, vr::k_pch_audio_OnPlaybackMirrorDevice_String, mirrorDeviceId, 1024, &vrSettingsError); m_recordingDevices = audioManager->getRecordingDevices();
findPlaybackDeviceIndex(audioManager->getPlaybackDevId(), false);
char deviceId[1024];
vr::VRSettings()->GetString(vr::k_pch_audio_Section, vr::k_pch_audio_OnPlaybackMirrorDevice_String, deviceId, 1024, &vrSettingsError);
if (vrSettingsError != vr::VRSettingsError_None) { if (vrSettingsError != vr::VRSettingsError_None) {
LOG(WARNING) << "Could not read \"" << vr::k_pch_audio_OnPlaybackMirrorDevice_String << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError); LOG(WARNING) << "Could not read \"" << vr::k_pch_audio_OnPlaybackMirrorDevice_String << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError);
} else {
audioManager->setMirrorDevice(deviceId);
findMirrorDeviceIndex(audioManager->getMirrorDevId(), false);
lastMirrorDevId = deviceId;
m_mirrorVolume = audioManager->getMirrorVolume();
m_mirrorMuted = audioManager->getMirrorMuted();
} }
audioManager->setMirrorDevice(mirrorDeviceId); findMicDeviceIndex(audioManager->getMicDevId(), false);
lastMirrorDevId = mirrorDeviceId;
m_micPresent = audioManager->isMicValid();
m_micVolume = audioManager->getMicVolume(); m_micVolume = audioManager->getMicVolume();
m_micMuted = audioManager->getMicMuted(); m_micMuted = audioManager->getMicMuted();
m_micDevName = QString::fromStdString(audioManager->getMicDevName());
m_mirrorPresent = audioManager->isMirrorValid();
m_mirrorVolume = audioManager->getMirrorVolume();
m_mirrorMuted = audioManager->getMirrorMuted();
m_mirrorDevName = QString::fromStdString(audioManager->getMirrorDevName());
reloadPttProfiles(); reloadPttProfiles();
reloadPttConfig(); reloadPttConfig();
eventLoopTick(); eventLoopTick();
@@ -58,16 +60,6 @@ namespace advsettings {
} }
bool AudioTabController::mirrorPresent() const {
return m_mirrorPresent;
}
QString AudioTabController::mirrorDevName() const {
return m_mirrorDevName;
}
float AudioTabController::mirrorVolume() const { float AudioTabController::mirrorVolume() const {
return m_mirrorVolume; return m_mirrorVolume;
} }
@@ -78,16 +70,6 @@ namespace advsettings {
} }
bool AudioTabController::micPresent() const {
return m_micPresent;
}
QString AudioTabController::micDevName() const {
return m_micDevName;
}
float AudioTabController::micVolume() const { float AudioTabController::micVolume() const {
return m_micVolume; return m_micVolume;
} }
@@ -110,24 +92,14 @@ namespace advsettings {
} }
if (lastMirrorDevId.compare(mirrorDeviceId) != 0) { if (lastMirrorDevId.compare(mirrorDeviceId) != 0) {
audioManager->setMirrorDevice(mirrorDeviceId); audioManager->setMirrorDevice(mirrorDeviceId);
if (audioManager->isMirrorValid()) { findMirrorDeviceIndex(audioManager->getMirrorDevId());
if (!m_mirrorPresent) {
m_mirrorPresent = true;
emit mirrorPresentChanged(m_mirrorPresent);
}
m_mirrorDevName = QString::fromStdString(audioManager->getMirrorDevName());
emit mirrorDevNameChanged(m_mirrorDevName);
} else if (m_mirrorPresent) {
m_mirrorPresent = false;
emit mirrorPresentChanged(m_mirrorPresent);
}
lastMirrorDevId = mirrorDeviceId; lastMirrorDevId = mirrorDeviceId;
} }
if (m_mirrorPresent) { if (m_mirrorDeviceIndex >= 0) {
setMirrorVolume(audioManager->getMirrorVolume()); setMirrorVolume(audioManager->getMirrorVolume());
setMirrorMuted(audioManager->getMirrorMuted()); setMirrorMuted(audioManager->getMirrorMuted());
} }
if (m_micPresent) { if (m_recordingDeviceIndex >= 0) {
setMicVolume(audioManager->getMicVolume()); setMicVolume(audioManager->getMicVolume());
setMicMuted(audioManager->getMicMuted()); setMicMuted(audioManager->getMicMuted());
} }
@@ -212,20 +184,172 @@ namespace advsettings {
} }
void AudioTabController::onNewRecordingDevice() { void AudioTabController::onNewRecordingDevice() {
if (audioManager->isMicValid()) { findMicDeviceIndex(audioManager->getMicDevId());
if (!m_micPresent) { }
m_micPresent = true;
emit micPresentChanged(m_micPresent);
}
setMicVolume(audioManager->getMicVolume());
setMicMuted(audioManager->getMicMuted());
m_micDevName = QString::fromStdString(audioManager->getMicDevName());
emit micDevNameChanged(m_micDevName); void AudioTabController::onNewPlaybackDevice() {
findPlaybackDeviceIndex(audioManager->getPlaybackDevId());
}
void AudioTabController::onNewMirrorDevice() {
}
void AudioTabController::onDeviceAdded() {
}
void AudioTabController::onDeviceRemoved() {
}
int AudioTabController::getPlaybackDeviceCount() {
return (int)m_playbackDevices.size();
}
QString AudioTabController::getPlaybackDeviceName(int index) {
if (index < m_playbackDevices.size()) {
return QString::fromStdString(m_playbackDevices[index].second);
} else { } else {
if (m_micPresent) { return "<ERROR>";
m_micPresent = false; }
emit micPresentChanged(m_micPresent); }
int AudioTabController::getRecordingDeviceCount() {
return (int)m_recordingDevices.size();
}
QString AudioTabController::getRecordingDeviceName(int index) {
if (index < m_recordingDevices.size()) {
return QString::fromStdString(m_recordingDevices[index].second);
} else {
return "<ERROR>";
}
}
int AudioTabController::playbackDeviceIndex() const {
return m_playbackDeviceIndex;
}
int AudioTabController::mirrorDeviceIndex() const {
return m_mirrorDeviceIndex;
}
int AudioTabController::micDeviceIndex() const {
return m_recordingDeviceIndex;
}
void AudioTabController::setPlaybackDeviceIndex(int index, bool notify) {
if (index != m_playbackDeviceIndex) {
if (index < m_playbackDevices.size() && index != m_mirrorDeviceIndex) {
vr::EVRSettingsError vrSettingsError;
vr::VRSettings()->SetString(vr::k_pch_audio_Section, vr::k_pch_audio_OnPlaybackDevice_String, m_playbackDevices[index].first.c_str(), &vrSettingsError);
if (vrSettingsError != vr::VRSettingsError_None) {
LOG(WARNING) << "Could not write \"" << vr::k_pch_audio_OnPlaybackDevice_String << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError);
} else {
vr::VRSettings()->Sync();
audioManager->setPlaybackDevice(m_playbackDevices[index].first, notify);
}
} else if (notify) {
emit playbackDeviceIndexChanged(m_playbackDeviceIndex);
}
}
}
void AudioTabController::setMirrorDeviceIndex(int index, bool notify) {
if (index != m_mirrorDeviceIndex) {
if (index == -1) {
vr::EVRSettingsError vrSettingsError;
vr::VRSettings()->RemoveKeyInSection(vr::k_pch_audio_Section, vr::k_pch_audio_OnPlaybackMirrorDevice_String, &vrSettingsError);
if (vrSettingsError != vr::VRSettingsError_None) {
LOG(WARNING) << "Could not remove \"" << vr::k_pch_audio_OnPlaybackMirrorDevice_String << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError);
} else {
vr::VRSettings()->Sync();
audioManager->setMirrorDevice("", notify);
}
} else if (index < m_playbackDevices.size() && index != m_playbackDeviceIndex && index != m_mirrorDeviceIndex) {
vr::EVRSettingsError vrSettingsError;
vr::VRSettings()->SetString(vr::k_pch_audio_Section, vr::k_pch_audio_OnPlaybackMirrorDevice_String, m_playbackDevices[index].first.c_str(), &vrSettingsError);
if (vrSettingsError != vr::VRSettingsError_None) {
LOG(WARNING) << "Could not write \"" << vr::k_pch_audio_OnPlaybackMirrorDevice_String << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError);
} else {
vr::VRSettings()->Sync();
audioManager->setMirrorDevice(m_playbackDevices[index].first, notify);
}
} else if (notify) {
emit mirrorDeviceIndexChanged(index);
}
}
}
void AudioTabController::setMicDeviceIndex(int index, bool notify) {
if (index != m_recordingDeviceIndex) {
if (index < m_recordingDevices.size()) {
vr::EVRSettingsError vrSettingsError;
vr::VRSettings()->SetString(vr::k_pch_audio_Section, vr::k_pch_audio_OnRecordDevice_String, m_recordingDevices[index].first.c_str(), &vrSettingsError);
if (vrSettingsError != vr::VRSettingsError_None) {
LOG(WARNING) << "Could not write \"" << vr::k_pch_audio_OnRecordDevice_String << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum(vrSettingsError);
} else {
vr::VRSettings()->Sync();
audioManager->setMicDevice(m_recordingDevices[index].first, notify);
}
} else if (notify) {
emit micDeviceIndexChanged(index);
}
}
}
void AudioTabController::findPlaybackDeviceIndex(std::string id, bool notify) {
int i = 0;
bool deviceFound = false;
for (auto d : m_playbackDevices) {
if (d.first.compare(id) == 0) {
deviceFound = true;
break;
} else {
++i;
}
}
if (deviceFound) {
m_playbackDeviceIndex = i;
if (notify) {
emit playbackDeviceIndexChanged(i);
}
}
}
void AudioTabController::findMirrorDeviceIndex(std::string id, bool notify) {
int i = 0;
bool deviceFound = false;
for (auto d : m_playbackDevices) {
if (d.first.compare(id) == 0) {
deviceFound = true;
break;
} else {
++i;
}
}
if (deviceFound && m_mirrorDeviceIndex != i) {
m_mirrorDeviceIndex = i;
if (notify) {
emit mirrorDeviceIndexChanged(i);
}
}
}
void AudioTabController::findMicDeviceIndex(std::string id, bool notify) {
int i = 0;
bool deviceFound = false;
for (auto d : m_recordingDevices) {
if (d.first.compare(id) == 0) {
deviceFound = true;
break;
} else {
++i;
}
}
if (deviceFound) {
m_recordingDeviceIndex = i;
if (notify) {
emit micDeviceIndexChanged(i);
} }
} }
} }
+44 -16
View File
@@ -15,12 +15,15 @@ namespace advsettings {
class AudioTabController : public PttController { class AudioTabController : public PttController {
Q_OBJECT Q_OBJECT
Q_PROPERTY(bool mirrorPresent READ mirrorPresent NOTIFY mirrorPresentChanged) Q_PROPERTY(int playbackDeviceIndex READ playbackDeviceIndex WRITE setPlaybackDeviceIndex NOTIFY playbackDeviceIndexChanged)
Q_PROPERTY(QString mirrorDevName READ mirrorDevName NOTIFY mirrorDevNameChanged) Q_PROPERTY(int mirrorDeviceIndex READ mirrorDeviceIndex WRITE setMirrorDeviceIndex NOTIFY mirrorDeviceIndexChanged)
//Q_PROPERTY(bool mirrorPresent READ mirrorPresent NOTIFY mirrorPresentChanged)
//Q_PROPERTY(QString mirrorDevName READ mirrorDevName NOTIFY mirrorDevNameChanged)
Q_PROPERTY(float mirrorVolume READ mirrorVolume WRITE setMirrorVolume NOTIFY mirrorVolumeChanged) Q_PROPERTY(float mirrorVolume READ mirrorVolume WRITE setMirrorVolume NOTIFY mirrorVolumeChanged)
Q_PROPERTY(bool mirrorMuted READ mirrorMuted WRITE setMirrorMuted NOTIFY mirrorMutedChanged) Q_PROPERTY(bool mirrorMuted READ mirrorMuted WRITE setMirrorMuted NOTIFY mirrorMutedChanged)
Q_PROPERTY(bool micPresent READ micPresent NOTIFY micPresentChanged) Q_PROPERTY(int micDeviceIndex READ micDeviceIndex WRITE setMicDeviceIndex NOTIFY micDeviceIndexChanged)
Q_PROPERTY(QString micDevName READ micDevName NOTIFY micDevNameChanged) //Q_PROPERTY(bool micPresent READ micPresent NOTIFY micPresentChanged)
//Q_PROPERTY(QString micDevName READ micDevName NOTIFY micDevNameChanged)
Q_PROPERTY(float micVolume READ micVolume WRITE setMicVolume NOTIFY micVolumeChanged) Q_PROPERTY(float micVolume READ micVolume WRITE setMicVolume NOTIFY micVolumeChanged)
Q_PROPERTY(bool micMuted READ micMuted WRITE setMicMuted NOTIFY micMutedChanged) Q_PROPERTY(bool micMuted READ micMuted WRITE setMicMuted NOTIFY micMutedChanged)
@@ -30,19 +33,25 @@ namespace advsettings {
vr::VROverlayHandle_t m_ulNotificationOverlayHandle = vr::k_ulOverlayHandleInvalid; vr::VROverlayHandle_t m_ulNotificationOverlayHandle = vr::k_ulOverlayHandleInvalid;
bool m_mirrorPresent = false; int m_playbackDeviceIndex = -1;
QString m_mirrorDevName = "<None>";
int m_mirrorDeviceIndex = -1;
//bool m_mirrorPresent = false;
//QString m_mirrorDevName = "<None>";
float m_mirrorVolume = 1.0; float m_mirrorVolume = 1.0;
bool m_mirrorMuted = false; bool m_mirrorMuted = false;
bool m_micPresent = false; int m_recordingDeviceIndex = -1;
QString m_micDevName = "<None>"; //bool m_micPresent = false;
//QString m_micDevName = "<None>";
float m_micVolume = 1.0; float m_micVolume = 1.0;
bool m_micMuted = false; bool m_micMuted = false;
unsigned settingsUpdateCounter = 0; unsigned settingsUpdateCounter = 0;
std::unique_ptr<AudioManager> audioManager; std::unique_ptr<AudioManager> audioManager;
std::vector<std::pair<std::string, std::string>> m_recordingDevices;
std::vector<std::pair<std::string, std::string>> m_playbackDevices;
std::string lastMirrorDevId; std::string lastMirrorDevId;
QString getSettingsName() override { return "audioSettings"; } QString getSettingsName() override { return "audioSettings"; }
@@ -53,23 +62,37 @@ namespace advsettings {
bool pttChangeValid() override; bool pttChangeValid() override;
virtual vr::VROverlayHandle_t getNotificationOverlayHandle() override { return m_ulNotificationOverlayHandle; } virtual vr::VROverlayHandle_t getNotificationOverlayHandle() override { return m_ulNotificationOverlayHandle; }
void findPlaybackDeviceIndex(std::string id, bool notify = true);
void findMirrorDeviceIndex(std::string id, bool notify = true);
void findMicDeviceIndex(std::string id, bool notify = true);
public: public:
void initStage1(); void initStage1();
void initStage2(OverlayController* parent, QQuickWindow* widget); void initStage2(OverlayController* parent, QQuickWindow* widget);
void eventLoopTick(); void eventLoopTick();
bool mirrorPresent() const; int playbackDeviceIndex() const;
QString mirrorDevName() const;
int mirrorDeviceIndex() const;
float mirrorVolume() const; float mirrorVolume() const;
bool mirrorMuted() const; bool mirrorMuted() const;
bool micPresent() const; int micDeviceIndex() const;
QString micDevName() const;
float micVolume() const; float micVolume() const;
bool micMuted() const; bool micMuted() const;
Q_INVOKABLE int getPlaybackDeviceCount();
Q_INVOKABLE QString getPlaybackDeviceName(int index);
Q_INVOKABLE int getRecordingDeviceCount();
Q_INVOKABLE QString getRecordingDeviceName(int index);
void onNewRecordingDevice(); void onNewRecordingDevice();
void onNewPlaybackDevice();
void onNewMirrorDevice();
void onDeviceAdded();
void onDeviceRemoved();
public slots: public slots:
void setMirrorVolume(float value, bool notify = true); void setMirrorVolume(float value, bool notify = true);
@@ -78,16 +101,21 @@ namespace advsettings {
void setMicVolume(float value, bool notify = true); void setMicVolume(float value, bool notify = true);
void setMicMuted(bool value, bool notify = true); void setMicMuted(bool value, bool notify = true);
void setPlaybackDeviceIndex(int value, bool notify = true);
void setMirrorDeviceIndex(int value, bool notify = true);
void setMicDeviceIndex(int value, bool notify = true);
signals: signals:
void mirrorPresentChanged(bool value); void playbackDeviceIndexChanged(int index);
void mirrorDevNameChanged(QString value);
void mirrorDeviceIndexChanged(int index);
void mirrorVolumeChanged(float value); void mirrorVolumeChanged(float value);
void mirrorMutedChanged(bool value); void mirrorMutedChanged(bool value);
void micPresentChanged(bool value); void micDeviceIndexChanged(int index);
void micDevNameChanged(QString value);
void micVolumeChanged(float value); void micVolumeChanged(float value);
void micMutedChanged(bool value); void micMutedChanged(bool value);
}; };
} // namespace advsettings } // namespace advsettings
@@ -24,6 +24,9 @@ AudioManagerWindows::~AudioManagerWindows() {
if (micAudioDevice) { if (micAudioDevice) {
micAudioDevice->Release(); micAudioDevice->Release();
} }
if (playbackAudioDevice) {
playbackAudioDevice->Release();
}
audioDeviceEnumerator->Release(); audioDeviceEnumerator->Release();
} }
@@ -32,6 +35,10 @@ void AudioManagerWindows::init(AudioTabController* controller) {
if (!audioDeviceEnumerator) { if (!audioDeviceEnumerator) {
throw std::exception("Could not create audio device enumerator"); throw std::exception("Could not create audio device enumerator");
} }
playbackAudioDevice = getDefaultPlaybackDevice(audioDeviceEnumerator);
if (!playbackAudioDevice) {
LOG(WARNING) << "Could not find a default recording device.";
}
micAudioDevice = getDefaultRecordingDevice(audioDeviceEnumerator); micAudioDevice = getDefaultRecordingDevice(audioDeviceEnumerator);
if (micAudioDevice) { if (micAudioDevice) {
micAudioEndpointVolume = getAudioEndpointVolume(micAudioDevice); micAudioEndpointVolume = getAudioEndpointVolume(micAudioDevice);
@@ -40,20 +47,62 @@ void AudioManagerWindows::init(AudioTabController* controller) {
} }
this->controller = controller; this->controller = controller;
audioDeviceEnumerator->RegisterEndpointNotificationCallback((IMMNotificationClient*)this); audioDeviceEnumerator->RegisterEndpointNotificationCallback((IMMNotificationClient*)this);
policyConfig = getPolicyConfig();
if (!policyConfig) {
LOG(ERROR) << "Could not find PolicyConfig interface";
}
}
void AudioManagerWindows::setPlaybackDevice(const std::string & id, bool notify) {
if (!id.empty()) {
auto dev = getDevice(audioDeviceEnumerator, id);
if (!dev) {
LOG(WARNING) << "Could not find playback device \"" << id << "\".";
} else {
playbackAudioDevice = dev;
if (policyConfig) {
LPWSTR devId;
if (dev->GetId(&devId) >= 0) {
policyConfig->SetDefaultEndpoint(devId, eConsole);
}
}
}
}
if (notify) {
controller->onNewPlaybackDevice();
}
}
std::string AudioManagerWindows::getPlaybackDevName() {
if (playbackAudioDevice) {
return getDeviceName(playbackAudioDevice);
}
return "";
}
std::string AudioManagerWindows::getPlaybackDevId() {
if (playbackAudioDevice) {
return getDeviceId(playbackAudioDevice);
}
return "";
} }
void AudioManagerWindows::setMirrorDevice(const std::string& id) { void AudioManagerWindows::setMirrorDevice(const std::string& id, bool notify) {
if (id.empty()) { if (id.empty()) {
deleteMirrorDevice(); deleteMirrorDevice();
} else { } else {
mirrorAudioDevice = getDevice(audioDeviceEnumerator, id); auto dev = getDevice(audioDeviceEnumerator, id);
if (mirrorAudioDevice) { if (dev) {
mirrorAudioDevice = dev;
mirrorAudioEndpointVolume = getAudioEndpointVolume(mirrorAudioDevice); mirrorAudioEndpointVolume = getAudioEndpointVolume(mirrorAudioDevice);
} else { } else {
LOG(WARNING) << "Could not find mirror device \"" << id << "\"."; LOG(WARNING) << "Could not find mirror device \"" << id << "\".";
} }
} }
if (notify) {
controller->onNewMirrorDevice();
}
} }
void AudioManagerWindows::deleteMirrorDevice() { void AudioManagerWindows::deleteMirrorDevice() {
@@ -78,6 +127,13 @@ std::string AudioManagerWindows::getMirrorDevName() {
return ""; return "";
} }
std::string AudioManagerWindows::getMirrorDevId() {
if (mirrorAudioDevice) {
return getDeviceId(mirrorAudioDevice);
}
return "";
}
float AudioManagerWindows::getMirrorVolume() { float AudioManagerWindows::getMirrorVolume() {
float value; float value;
if (mirrorAudioEndpointVolume && mirrorAudioEndpointVolume->GetMasterVolumeLevelScalar(&value) >= 0) { if (mirrorAudioEndpointVolume && mirrorAudioEndpointVolume->GetMasterVolumeLevelScalar(&value) >= 0) {
@@ -119,6 +175,26 @@ bool AudioManagerWindows::isMicValid() {
return micAudioEndpointVolume != nullptr; return micAudioEndpointVolume != nullptr;
} }
void AudioManagerWindows::setMicDevice(const std::string & id, bool notify) {
if (!id.empty()) {
auto dev = getDevice(audioDeviceEnumerator, id);
if (!dev) {
LOG(WARNING) << "Could not find recording device \"" << id << "\".";
} else {
micAudioDevice = dev;
if (policyConfig) {
LPWSTR devId;
if (dev->GetId(&devId) >= 0) {
policyConfig->SetDefaultEndpoint(devId, eConsole);
}
}
}
}
if (notify) {
controller->onNewRecordingDevice();
}
}
std::string AudioManagerWindows::getMicDevName() { std::string AudioManagerWindows::getMicDevName() {
if (micAudioDevice) { if (micAudioDevice) {
return getDeviceName(micAudioDevice); return getDeviceName(micAudioDevice);
@@ -126,6 +202,13 @@ std::string AudioManagerWindows::getMicDevName() {
return ""; return "";
} }
std::string AudioManagerWindows::getMicDevId() {
if (micAudioDevice) {
return getDeviceId(micAudioDevice);
}
return "";
}
float AudioManagerWindows::getMicVolume() { float AudioManagerWindows::getMicVolume() {
float value; float value;
if (micAudioEndpointVolume && micAudioEndpointVolume->GetMasterVolumeLevelScalar(&value) >= 0) { if (micAudioEndpointVolume && micAudioEndpointVolume->GetMasterVolumeLevelScalar(&value) >= 0) {
@@ -162,6 +245,14 @@ bool AudioManagerWindows::setMicMuted(bool value) {
return false; return false;
} }
std::vector<std::pair<std::string, std::string>> AudioManagerWindows::getRecordingDevices() {
return getDevices(audioDeviceEnumerator, eCapture);
}
std::vector<std::pair<std::string, std::string>> AudioManagerWindows::getPlaybackDevices() {
return getDevices(audioDeviceEnumerator, eRender);
}
IMMDeviceEnumerator* AudioManagerWindows::getAudioDeviceEnumerator() { IMMDeviceEnumerator* AudioManagerWindows::getAudioDeviceEnumerator() {
IMMDeviceEnumerator* pEnumerator; IMMDeviceEnumerator* pEnumerator;
@@ -171,6 +262,24 @@ IMMDeviceEnumerator* AudioManagerWindows::getAudioDeviceEnumerator() {
return pEnumerator; return pEnumerator;
} }
IPolicyConfig * AudioManagerWindows::getPolicyConfig() {
IPolicyConfig* policyConfig = nullptr;
// for Win 10
auto hr = CoCreateInstance(__uuidof(CPolicyConfigClient), NULL, CLSCTX_INPROC, IID_IPolicyConfig2, (LPVOID *)&policyConfig);
if (hr != S_OK) {
hr = CoCreateInstance(__uuidof(CPolicyConfigClient), NULL, CLSCTX_INPROC, IID_IPolicyConfig1, (LPVOID *)&policyConfig);
}
// for Win Vista, 7, 8, 8.1
if (hr != S_OK) {
hr = CoCreateInstance(__uuidof(CPolicyConfigClient), NULL, CLSCTX_INPROC, IID_IPolicyConfig0, (LPVOID *)&policyConfig);
}
if (hr != S_OK) {
return nullptr;
} else {
return policyConfig;
}
}
IMMDevice* AudioManagerWindows::getDefaultRecordingDevice(IMMDeviceEnumerator* deviceEnumerator) { IMMDevice* AudioManagerWindows::getDefaultRecordingDevice(IMMDeviceEnumerator* deviceEnumerator) {
IMMDevice* pDevice; IMMDevice* pDevice;
if (deviceEnumerator->GetDefaultAudioEndpoint(eCapture, eCommunications, &pDevice) < 0) { if (deviceEnumerator->GetDefaultAudioEndpoint(eCapture, eCommunications, &pDevice) < 0) {
@@ -179,6 +288,14 @@ IMMDevice* AudioManagerWindows::getDefaultRecordingDevice(IMMDeviceEnumerator* d
return pDevice; return pDevice;
} }
IMMDevice * AudioManagerWindows::getDefaultPlaybackDevice(IMMDeviceEnumerator * deviceEnumerator) {
IMMDevice* pDevice;
if (deviceEnumerator->GetDefaultAudioEndpoint(eRender, eCommunications, &pDevice) < 0) {
return nullptr;
}
return pDevice;
}
IMMDevice* AudioManagerWindows::getDevice(IMMDeviceEnumerator* deviceEnumerator, const std::string& id) { IMMDevice* AudioManagerWindows::getDevice(IMMDeviceEnumerator* deviceEnumerator, const std::string& id) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wid = converter.from_bytes(id); std::wstring wid = converter.from_bytes(id);
@@ -212,6 +329,33 @@ std::string AudioManagerWindows::getDeviceName(IMMDevice* device) {
return ""; return "";
} }
std::string AudioManagerWindows::getDeviceId(IMMDevice* device) {
LPWSTR ppstrId;
if (device->GetId(&ppstrId) >= 0) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.to_bytes(ppstrId);
}
return "";
}
std::vector<std::pair<std::string, std::string>> AudioManagerWindows::getDevices(IMMDeviceEnumerator * deviceEnumerator, EDataFlow dataFlow) {
std::vector<std::pair<std::string, std::string>> retval;
IMMDeviceCollection *ppDevices = nullptr;
if (deviceEnumerator->EnumAudioEndpoints(dataFlow, DEVICE_STATE_ACTIVE, &ppDevices) >= 0) {
UINT count;
ppDevices->GetCount(&count);
for (UINT i = 0; i < count; ++i) {
IMMDevice *device = nullptr;
ppDevices->Item(i, &device);
if (device) {
retval.emplace_back(getDeviceId(device), getDeviceName(device));
}
}
ppDevices->Release();
}
return retval;
}
HRESULT AudioManagerWindows::QueryInterface(REFIID riid, void ** ppvObject) { HRESULT AudioManagerWindows::QueryInterface(REFIID riid, void ** ppvObject) {
if (IID_IUnknown == riid) { if (IID_IUnknown == riid) {
@@ -240,10 +384,12 @@ HRESULT AudioManagerWindows::OnDeviceStateChanged(LPCWSTR, DWORD) {
} }
HRESULT AudioManagerWindows::OnDeviceAdded(LPCWSTR) { HRESULT AudioManagerWindows::OnDeviceAdded(LPCWSTR) {
controller->onDeviceAdded();
return S_OK; return S_OK;
} }
HRESULT AudioManagerWindows::OnDeviceRemoved(LPCWSTR) { HRESULT AudioManagerWindows::OnDeviceRemoved(LPCWSTR) {
controller->onDeviceRemoved();
return S_OK; return S_OK;
} }
@@ -266,6 +412,22 @@ HRESULT AudioManagerWindows::OnDefaultDeviceChanged(EDataFlow flow, ERole role,
controller->onNewRecordingDevice(); controller->onNewRecordingDevice();
} }
} }
} else if (flow == eRender && role == eMultimedia) {
if (audioDeviceEnumerator) {
auto device = getDevice(audioDeviceEnumerator, pwstrDefaultDeviceId);
if (device != playbackAudioDevice) {
if (playbackAudioDevice) {
playbackAudioDevice->Release();
}
playbackAudioDevice = device;
if (!playbackAudioDevice) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string name = converter.to_bytes(pwstrDefaultDeviceId);
LOG(WARNING) << "Could not find playback device \"" << name << "\".";
}
controller->onNewPlaybackDevice();
}
}
} }
/*char* pszFlow = (char*)"?????"; /*char* pszFlow = (char*)"?????";
char* pszRole = (char*)"?????"; char* pszRole = (char*)"?????";
@@ -5,6 +5,7 @@
#include <Mmdeviceapi.h> #include <Mmdeviceapi.h>
#include <Functiondiscoverykeys_devpkey.h> #include <Functiondiscoverykeys_devpkey.h>
#include <Endpointvolume.h> #include <Endpointvolume.h>
#include "IPolicyConfig.h"
// application namespace // application namespace
@@ -15,32 +16,45 @@ friend class AudioNotificationClient;
private: private:
AudioTabController* controller = nullptr; AudioTabController* controller = nullptr;
IMMDeviceEnumerator* audioDeviceEnumerator = nullptr; IMMDeviceEnumerator* audioDeviceEnumerator = nullptr;
IMMDevice* playbackAudioDevice = nullptr;
IMMDevice* mirrorAudioDevice = nullptr; IMMDevice* mirrorAudioDevice = nullptr;
IAudioEndpointVolume* mirrorAudioEndpointVolume = nullptr; IAudioEndpointVolume* mirrorAudioEndpointVolume = nullptr;
IMMDevice* micAudioDevice = nullptr; IMMDevice* micAudioDevice = nullptr;
IAudioEndpointVolume* micAudioEndpointVolume = nullptr; IAudioEndpointVolume* micAudioEndpointVolume = nullptr;
IPolicyConfig* policyConfig = nullptr;
public: public:
~AudioManagerWindows(); ~AudioManagerWindows();
virtual void init(AudioTabController* controller) override; virtual void init(AudioTabController* controller) override;
virtual void setMirrorDevice(const std::string& id) override; virtual void setPlaybackDevice(const std::string& id, bool notify = true) override;
virtual void deleteMirrorDevice() override; virtual std::string getPlaybackDevName() override;
virtual std::string getPlaybackDevId() override;
virtual void setMirrorDevice(const std::string& id, bool notify = true) override;
virtual bool isMirrorValid() override; virtual bool isMirrorValid() override;
virtual std::string getMirrorDevName() override; virtual std::string getMirrorDevName() override;
virtual std::string getMirrorDevId() override;
virtual float getMirrorVolume() override; virtual float getMirrorVolume() override;
virtual bool setMirrorVolume(float value) override; virtual bool setMirrorVolume(float value) override;
virtual bool getMirrorMuted() override; virtual bool getMirrorMuted() override;
virtual bool setMirrorMuted(bool value) override; virtual bool setMirrorMuted(bool value) override;
virtual bool isMicValid() override; virtual bool isMicValid() override;
virtual void setMicDevice(const std::string& id, bool notify = true) override;
virtual std::string getMicDevName() override; virtual std::string getMicDevName() override;
virtual std::string getMicDevId() override;
virtual float getMicVolume() override; virtual float getMicVolume() override;
virtual bool setMicVolume(float value) override; virtual bool setMicVolume(float value) override;
virtual bool getMicMuted() override; virtual bool getMicMuted() override;
virtual bool setMicMuted(bool value) override; virtual bool setMicMuted(bool value) override;
virtual std::vector<std::pair<std::string, std::string>> getRecordingDevices() override;
virtual std::vector<std::pair<std::string, std::string>> getPlaybackDevices() override;
void deleteMirrorDevice();
// from IMMNotificationClient // from IMMNotificationClient
virtual HRESULT QueryInterface(REFIID riid, void ** ppvObject) override; virtual HRESULT QueryInterface(REFIID riid, void ** ppvObject) override;
virtual ULONG AddRef(void) override; virtual ULONG AddRef(void) override;
@@ -53,11 +67,15 @@ public:
private: private:
IMMDeviceEnumerator* getAudioDeviceEnumerator(); IMMDeviceEnumerator* getAudioDeviceEnumerator();
IPolicyConfig* getPolicyConfig();
IMMDevice* getDefaultRecordingDevice(IMMDeviceEnumerator* deviceEnumerator); IMMDevice* getDefaultRecordingDevice(IMMDeviceEnumerator* deviceEnumerator);
IMMDevice* getDefaultPlaybackDevice(IMMDeviceEnumerator* deviceEnumerator);
IMMDevice* getDevice(IMMDeviceEnumerator* deviceEnumerator, const std::string& id); IMMDevice* getDevice(IMMDeviceEnumerator* deviceEnumerator, const std::string& id);
IMMDevice* getDevice(IMMDeviceEnumerator* deviceEnumerator, LPCWSTR id); IMMDevice* getDevice(IMMDeviceEnumerator* deviceEnumerator, LPCWSTR id);
IAudioEndpointVolume* getAudioEndpointVolume(IMMDevice* device); IAudioEndpointVolume* getAudioEndpointVolume(IMMDevice* device);
std::string getDeviceName(IMMDevice* device); std::string getDeviceName(IMMDevice* device);
std::string getDeviceId(IMMDevice* device);
std::vector<std::pair<std::string, std::string>> getDevices(IMMDeviceEnumerator* deviceEnumerator, EDataFlow dataFlow);
}; };
} }
@@ -0,0 +1,177 @@
// ----------------------------------------------------------------------------
// PolicyConfig.h
// Undocumented COM-interface IPolicyConfig.
// Use for set default audio render endpoint
// @author EreTIk
// ----------------------------------------------------------------------------
#pragma once
// ca286fc3-91fd-42c3-8e9b-caafa66242e3
static const GUID IID_IPolicyConfig2 = { 0xCA286FC3, 0x91FD, 0x42C3, { 0x8E, 0x9B, 0xCA, 0xAF, 0xA6, 0x62, 0x42, 0xE3 } };
// 6be54be8-a068-4875-a49d-0c2966473b11
static const GUID IID_IPolicyConfig1 = { 0x6BE54BE8, 0xA068, 0x4875, { 0xA4, 0x9D, 0x0C, 0x29, 0x66, 0x47, 0x3B, 0x11 } };
// f8679f50-850a-41cf-9c72-430f290290c8
static const GUID IID_IPolicyConfig0 = { 0xF8679F50, 0x850A, 0x41CF, { 0x9C, 0x72, 0x43, 0x0F, 0x29, 0x02, 0x90, 0xC8 } };
class DECLSPEC_UUID("870af99c-171d-4f9e-af0d-e63df40c2bc9") CPolicyConfigClient;
interface IPolicyConfig : public IUnknown
{
public:
virtual HRESULT GetMixFormat(
PCWSTR,
WAVEFORMATEX **
);
virtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(
PCWSTR,
INT,
WAVEFORMATEX **
);
virtual HRESULT STDMETHODCALLTYPE ResetDeviceFormat(
PCWSTR
);
virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(
PCWSTR,
WAVEFORMATEX *,
WAVEFORMATEX *
);
virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(
PCWSTR,
INT,
PINT64,
PINT64
);
virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(
PCWSTR,
PINT64
);
virtual HRESULT STDMETHODCALLTYPE GetShareMode(
PCWSTR,
struct DeviceShareMode *
);
virtual HRESULT STDMETHODCALLTYPE SetShareMode(
PCWSTR,
struct DeviceShareMode *
);
virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(
PCWSTR,
int,
const PROPERTYKEY &,
const PROPVARIANT *
);
virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(
PCWSTR,
int,
const PROPERTYKEY &,
const PROPVARIANT *
);
virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint(
__in PCWSTR wszDeviceId,
__in ERole eRole
);
virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(
PCWSTR,
INT
);
};
interface DECLSPEC_UUID("568b9108-44bf-40b4-9006-86afe5b5a620")
IPolicyConfigVista;
class DECLSPEC_UUID("294935CE-F637-4E7C-A41B-AB255460B862")
CPolicyConfigVistaClient;
// ----------------------------------------------------------------------------
// class CPolicyConfigVistaClient
// {294935CE-F637-4E7C-A41B-AB255460B862}
//
// interface IPolicyConfigVista
// {568b9108-44bf-40b4-9006-86afe5b5a620}
//
// Query interface:
// CComPtr<IPolicyConfigVista> PolicyConfig;
// PolicyConfig.CoCreateInstance(__uuidof(CPolicyConfigVistaClient));
//
// @compatible: Windows Vista and Later
// ----------------------------------------------------------------------------
interface IPolicyConfigVista : public IUnknown
{
public:
virtual HRESULT GetMixFormat(
PCWSTR,
WAVEFORMATEX **
); // not available on Windows 7, use method from IPolicyConfig
virtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(
PCWSTR,
INT,
WAVEFORMATEX **
);
virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(
PCWSTR,
WAVEFORMATEX *,
WAVEFORMATEX *
);
virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(
PCWSTR,
INT,
PINT64,
PINT64
); // not available on Windows 7, use method from IPolicyConfig
virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod(
PCWSTR,
PINT64
); // not available on Windows 7, use method from IPolicyConfig
virtual HRESULT STDMETHODCALLTYPE GetShareMode(
PCWSTR,
struct DeviceShareMode *
); // not available on Windows 7, use method from IPolicyConfig
virtual HRESULT STDMETHODCALLTYPE SetShareMode(
PCWSTR,
struct DeviceShareMode *
); // not available on Windows 7, use method from IPolicyConfig
virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(
PCWSTR,
int,
const PROPERTYKEY &,
const PROPVARIANT *
);
virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(
PCWSTR,
int,
const PROPERTYKEY &,
const PROPVARIANT *
);
virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint(
__in PCWSTR wszDeviceId,
__in ERole eRole
);
virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(
PCWSTR,
INT
); // not available on Windows 7, use method from IPolicyConfig
};