From c28ec1f11d7d0ea4646780868a1969d95538be66 Mon Sep 17 00:00:00 2001 From: Hane Date: Wed, 9 Aug 2023 15:55:25 +0200 Subject: [PATCH 01/22] failed attempt at redrawing --- src/back/backlasses.cpp | 58 ++++++++++++++++++++++++++++++++++++++++ src/back/backlasses.h | 20 ++++++++++++++ src/cont/contclasses.cpp | 43 ++++++++++++++++++++++++----- src/cont/contclasses.h | 21 ++++++++------- src/global.h | 1 - src/qt/qtclasses.cpp | 2 ++ src/qt/qtclasses.h | 12 ++++++--- src/qtestmain.cpp | 10 ++++--- 8 files changed, 142 insertions(+), 25 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index acd4f3a..9232afc 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -1,5 +1,50 @@ #include +ULONG EndpointCallback::AddRef(){ + return InterlockedIncrement(&ref); +} + +ULONG EndpointCallback::Release(){ + ULONG tempRef = InterlockedDecrement(&ref); + if (tempRef == 0) { + delete this; + } + return tempRef; +} + +HRESULT EndpointCallback::QueryInterface(REFIID riid, VOID **ppvInterface) { + if (IID_IUnknown == riid) + { + AddRef(); + *ppvInterface = (IUnknown*)this; + } + else if (__uuidof(IAudioEndpointVolumeCallback) == riid) + { + AddRef(); + *ppvInterface = (IAudioEndpointVolumeCallback*)this; + } + else + { + *ppvInterface = NULL; + return E_NOINTERFACE; + } + return S_OK; +} + +HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { + if (pNotify == NULL) return E_INVALIDARG; + + LPGUID guid = osh->getOverseer()->getGuid(); + if (pNotify->guidEventContext != *guid) { + osh->parseExternalEndpointCallback(this, pNotify); + } + return S_OK; +} + +/* EndpointCallback::~EndpointCallback(){ + * PAUDIO_VOLUME_NOTIFICATION_DATA->Release(); + * } */ + Endpoint::Endpoint(IMMDevice* ep){ this->endpoint = ep; if(FAILED(endpoint->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&endpointVolume))) { log_debugcpp("si"); }; @@ -66,6 +111,13 @@ void Endpoint::setMute() { if(FAILED(endpointVolume->SetMute((mut == false ? 1 : 0), NULL))) { log_debugcpp("si"); }; } +void Endpoint::setCallback(EndpointCallback *epc){ + endpointVolume->RegisterControlChangeNotify((IAudioEndpointVolumeCallback*)*epc); +} + +void Endpoint::removeCallback(EndpointCallback *epc){ + endpointVolume->UnregisterControlChangeNotify((IAudioEndpointVolumeCallback*)*epc); +} Endpoint::~Endpoint(){ log_debugcpp("cum"); @@ -87,6 +139,8 @@ void Overseer::initCOMLibrary(){ (void**)&deviceEnumerator)) ) { log_debugcpp("si"); }; + if(FAILED(CoCreateGuid(guid))) { log_debugcpp("guyyyyyy"); }; + } void Overseer::reloadEndpoints() { @@ -129,6 +183,10 @@ Overseer::Overseer(){ //int Overseer::getDefaultCaptureEndpoint(Endpoint** defaultEndpoint); +LPGUID Overseer::getGuid() { + return guid; +} + std::vector Overseer::getPlaybackEndpoints() { return playbackDevices; } diff --git a/src/back/backlasses.h b/src/back/backlasses.h index ebfe0e5..7c28408 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -19,6 +19,22 @@ //#include #include +class EndpointCallback : public IAudioEndpointVolumeCallback { + + public: + EndpointCallback(); + + ULONG AddRef(); + ULONG Release(); + HRESULT QueryInterface(REFIID riid, VOID **ppvInterface); + HRESULT OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA update); + ~EndpointCallback(); + + private: + ULONG ref; + PAUDIO_VOLUME_NOTIFICATION_DATA update; +}; + class Endpoint { public: @@ -30,6 +46,8 @@ class Endpoint { void setMute(); bool getMute(); LPWSTR getName(); + void setCallback(EndpointCallback *epc); + void removeCallback(EndpointCallback *epc); ~Endpoint(); private: @@ -46,6 +64,7 @@ class Overseer { Overseer(); std::vector getPlaybackEndpoints(); void reloadEndpoints(); + LPGUID getGuid(); //~Overseer(); //int getDefaultPlaybackEndpoint(Endpoint** defaultEndpoint); //int getDefaultCaptureEndpoint(Endpoint** defaultEndpoint); @@ -54,6 +73,7 @@ class Overseer { ~Overseer(); private: + LPGUID guid; unsigned int numPlaybackEndpoints; IMMDeviceEnumerator *deviceEnumerator; std::vector playbackDevices; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index bd05f88..e93de35 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -2,10 +2,13 @@ Overseer OverseerHandler::os; -EndpointHandler::EndpointHandler(Endpoint *ept, QObject *parent) : QObject(parent) { - this->ept = ept; - eptName = QString::fromStdWString(ept->getName()); +EndpointHandler::EndpointHandler(Endpoint *ep, EndpointCallback *epc, QObject *parent) : QObject(parent) { + this->ep = ep; + this->epc = epc; + epName = QString::fromStdWString(ept->getName()); + ep->setCallback(*epc); } + /* * -1 for master volume */ @@ -33,6 +36,13 @@ bool EndpointHandler::getMute(){ return ept->getMute(); } +EndpointHandler::~EndpointHandler() { + ep->removeCallback(*epc); + delete epc; + delete ep; +} + + Overseer* OverseerHandler::getOverseer(){ return &os; } @@ -41,10 +51,29 @@ OverseerHandler::OverseerHandler(QObject *parent) : QObject(parent) { } -std::vector* OverseerHandler::getEndpointHandlers(){ - return endpointHandlers; +std::vector* OverseerHandler::getEndpointWidgets(){ + return &endpointWidgets; } -void OverseerHandler::setEndpointHandlers(std::vector *ephs){ - this->endpointHandlers = ephs; +void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify){ + log_debugcpp("parsing in da ovasiar"); + for (uint64_t i = 0; i < endpointWidgets.size(); i++){ + if(endpointWidgets.at(i)->eph->epc == fEpc) { + endpointWidgets.at(i)->muteButton->setText(endpointWidgets.at(i)->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); + break; + } + } + + /* + * connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); + * connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); + * connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); + * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); + * log_debugcpp("ENDPOINT_WIDGETED"); + */ } + +void OverseerHandler::setEndpointWidgets(std::vector ews){ + this->endpointWidgets = ews; +} + diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index c562b73..f11f312 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -1,4 +1,5 @@ #pragma once + #include #include "backlasses.h" @@ -7,15 +8,18 @@ class EndpointHandler : public QObject { Q_OBJECT public: - EndpointHandler(Endpoint *ept, QObject *parent = nullptr); + EndpointHandler(Endpoint *ept, EndpointCallback *epc, QObject *parent = nullptr); + //TODO: get(); + Endpoint *ep; + EndpointCallback *epc; + QString epName; + QString getName(); float getVolume(int channel); bool getMute(); private: - Endpoint *ept; - QString eptName; - //QSlider *slidy; + //QSlider *slidy; public slots: void setValue(int channel, int value); @@ -31,18 +35,17 @@ class OverseerHandler : public QObject { public: OverseerHandler(QObject *parent = nullptr); - void setEndpointHandlers(std::vector *ephs); - std::vector* getEndpointHandlers(); + void setEndpointWidgets(std::vector ews); + std::vector* getEndpointWidgets(); + void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); static Overseer* getOverseer(); private: static Overseer os; - std::vector *endpointHandlers; + std::vector endpointWidgets; //QSlider *slidy; //public slots: //void setValue(int value); - - }; diff --git a/src/global.h b/src/global.h index 96d177b..977e0b8 100644 --- a/src/global.h +++ b/src/global.h @@ -9,7 +9,6 @@ #define STRING_UNMUTE "Unmute" //INIT BACK - class OverseerHandler; extern OverseerHandler *osh; diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 0cac13d..70334c3 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -85,6 +85,7 @@ MainWindow::MainWindow(std::vector *ephs, QWidget *parent) : Q ews.push_back(epw); layout->addWidget(epw, i, 0); } + osh->setEndpointWidgets(ews); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), i, 0); } @@ -112,3 +113,4 @@ MainWindow::MainWindow(std::vector *ephs, QWidget *parent) : Q * ... */ + diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index a02bff8..e7e9d91 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -19,11 +19,9 @@ class EndpointWidget : public QWidget { public: EndpointWidget(EndpointHandler* eph, QWidget *parent = nullptr); - //void populateEndpointWidget(EndpointHandler *eph); - //void setEndpointHandlers(std::vector *ephs); - -private: + //TODO: get(); EndpointHandler* eph; + QPushButton *muteButton = nullptr; QLabel *mainLabel = nullptr, *leftChannelLabel = nullptr, *rightChannelLabel = nullptr; QSlider *mainSlider = nullptr; @@ -31,6 +29,11 @@ private: QSlider *rightChannelSlider = nullptr; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; + //void populateEndpointWidget(EndpointHandler *eph); + //void setEndpointHandlers(std::vector *ephs); + +private: + //std::vector *ephs; //std::vector *sliders; @@ -67,3 +70,4 @@ private: }; #endif + diff --git a/src/qtestmain.cpp b/src/qtestmain.cpp index 883d7e7..d619db1 100644 --- a/src/qtestmain.cpp +++ b/src/qtestmain.cpp @@ -9,6 +9,7 @@ #include #include "qtclasses.h" +#include "global.h" OverseerHandler *osh = new OverseerHandler(); @@ -21,14 +22,14 @@ QApplication* createApplication(int &argc, char *argv[]) int main (int argc, char* argv[]) { //QApplication::setStyle("windowsvista"); //INIT CONT - std::vector epts = OverseerHandler::getOverseer()->getPlaybackEndpoints(); + std::vector eps = OverseerHandler::getOverseer()->getPlaybackEndpoints(); std::vector* ephs = new std::vector; - for(unsigned int i = 0; i < epts.size(); i++){ - EndpointHandler *eph = new EndpointHandler(epts.at(i)); + for(unsigned int i = 0; i < eps.size(); i++){ + EndpointCallback* epc = new EndpointCallback(); + EndpointHandler* eph = new EndpointHandler(eps.at(i), epc); ephs->push_back(eph); } - osh->setEndpointHandlers(ephs); //INIT FRONT QScopedPointer app(createApplication(argc, argv)); MainWindow window = MainWindow(ephs); @@ -37,3 +38,4 @@ int main (int argc, char* argv[]) { window.show(); return app->exec(); } + From 2f728e41ea1de0d0a333e87ee5f0023ff869db3d Mon Sep 17 00:00:00 2001 From: Phireh Date: Wed, 9 Aug 2023 20:00:18 +0200 Subject: [PATCH 02/22] Declare EndpointWidget before using it --- src/back/backlasses.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 7c28408..2b2ff74 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -19,6 +19,8 @@ //#include #include +class EndpointWidget; + class EndpointCallback : public IAudioEndpointVolumeCallback { public: From 507dc37ad616634e29d028ef642388f34a925ce3 Mon Sep 17 00:00:00 2001 From: Hane Date: Wed, 9 Aug 2023 20:31:47 +0200 Subject: [PATCH 03/22] updated build files --- bueno.bat | 2 +- qtest.pro | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bueno.bat b/bueno.bat index cd190f0..67fbd6a 100644 --- a/bueno.bat +++ b/bueno.bat @@ -1,2 +1,2 @@ qmake -o build\Makefile .\qtest.pro -mingw32-make.exe -C .\build -f Makefile.Release +mingw32-make.exe -C .\build -f Makefile diff --git a/qtest.pro b/qtest.pro index abfbb93..39fad14 100644 --- a/qtest.pro +++ b/qtest.pro @@ -1,3 +1,6 @@ +QMAKE_CXXFLAGS += --target=x86_64-w64-mingw32 +QMAKE_LINKER += clang++ +QMAKE_LFLAGS += -v CONFIG += debug console QT += widgets INCLUDEPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\cont" From e43e4c0569b68677163e2364e991e5b2508ebd44 Mon Sep 17 00:00:00 2001 From: Hane Date: Thu, 10 Aug 2023 21:34:09 +0200 Subject: [PATCH 04/22] wip partial refactor --- src/back/backlasses.cpp | 27 +++++++++++++---- src/back/backlasses.h | 13 ++++++--- src/cont/contclasses.cpp | 63 ++++++++++++++++++++++++++++++---------- src/cont/contclasses.h | 35 ++++++++++++---------- src/qt/qtclasses.cpp | 15 ++++++++-- src/qt/qtclasses.h | 6 ++-- src/qtestmain.cpp | 10 ++----- 7 files changed, 115 insertions(+), 54 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 9232afc..1a48dd7 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -1,5 +1,9 @@ #include +EndpointCallback::EndpointCallback(Endpoint* ep){ + this.ep = ep; +} + ULONG EndpointCallback::AddRef(){ return InterlockedIncrement(&ref); } @@ -33,10 +37,11 @@ HRESULT EndpointCallback::QueryInterface(REFIID riid, VOID **ppvInterface) { HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { if (pNotify == NULL) return E_INVALIDARG; - - LPGUID guid = osh->getOverseer()->getGuid(); - if (pNotify->guidEventContext != *guid) { - osh->parseExternalEndpointCallback(this, pNotify); + AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; + LPGUID guid = osh->getOverseer()->getGuid(); + + if (eventData.guidEventContext != *guid) { + osh->parseExternalEndpointCallback(this, eventData); } return S_OK; } @@ -56,6 +61,15 @@ Endpoint::Endpoint(IMMDevice* ep){ friendlyName = pv.pwszVal; } +void Endpoint::setIndex(uint64_t idx){ + this.idx = idx; +} + +uint64_t Endpoint::getIndex(){ + return idx; +} + + LPWSTR Endpoint::getName(){ return friendlyName; } @@ -112,11 +126,11 @@ void Endpoint::setMute() { } void Endpoint::setCallback(EndpointCallback *epc){ - endpointVolume->RegisterControlChangeNotify((IAudioEndpointVolumeCallback*)*epc); + endpointVolume->RegisterControlChangeNotify((IAudioEndpointVolumeCallback*)epc); } void Endpoint::removeCallback(EndpointCallback *epc){ - endpointVolume->UnregisterControlChangeNotify((IAudioEndpointVolumeCallback*)*epc); + endpointVolume->UnregisterControlChangeNotify((IAudioEndpointVolumeCallback*)epc); } Endpoint::~Endpoint(){ @@ -160,6 +174,7 @@ void Overseer::reloadEndpoints() { IMMDevice *temp; if(deviceCollection->Item(i, &temp) != 0) { log_debugcpp("si"); }; Endpoint *endpoint = new Endpoint(temp); + endpoint->setIndex(i); this->playbackDevices.push_back(endpoint); //TODO: le porblemx std::cout << "ola" << std::endl; } diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 2b2ff74..2da5724 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -5,6 +5,7 @@ #include "global.h" #include #include +#include #include #include @@ -19,12 +20,12 @@ //#include #include -class EndpointWidget; +//class EndpointWidget; class EndpointCallback : public IAudioEndpointVolumeCallback { public: - EndpointCallback(); + EndpointCallback(Endpoint* ep); ULONG AddRef(); ULONG Release(); @@ -33,7 +34,8 @@ class EndpointCallback : public IAudioEndpointVolumeCallback { ~EndpointCallback(); private: - ULONG ref; + ULONG ref = 1; + Endpoint* ep; PAUDIO_VOLUME_NOTIFICATION_DATA update; }; @@ -41,6 +43,8 @@ class Endpoint { public: Endpoint(IMMDevice* endpoint); + uint64_t getIndex(); + void setIndex(uint64_t idx); void setVolume(int channel, float volume); /* float getLeftChannelVolume(); */ /* float getRightChannelVolume(); */ @@ -56,7 +60,8 @@ class Endpoint { IMMDevice* endpoint; IAudioEndpointVolume *endpointVolume ; IPropertyStore *properties; - LPWSTR friendlyName; + std::wstring friendlyName; + uint64_t idx; // LPWSTR endpointID = NULL; }; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index e93de35..f5c2855 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -1,14 +1,25 @@ +#incluse "backlasses.h" #include "contclasses.h" Overseer OverseerHandler::os; -EndpointHandler::EndpointHandler(Endpoint *ep, EndpointCallback *epc, QObject *parent) : QObject(parent) { - this->ep = ep; - this->epc = epc; +EndpointHandler::EndpointHandler(uint64_t idx) { + std::vector endpoints = osh->getPlaybackEndpoints(); + this->ep = endpoints.at(idx); + epc = new EndpointCallback(ep); epName = QString::fromStdWString(ept->getName()); ep->setCallback(*epc); } +void EndpointHandler::setIndex(uint64_t idx){ + this.idx = idx; +} + +uint64_t EndpointHandler::getIndex(){ + return idx; +} + + /* * -1 for master volume */ @@ -42,24 +53,46 @@ EndpointHandler::~EndpointHandler() { delete ep; } - -Overseer* OverseerHandler::getOverseer(){ - return &os; +std::vector OverseerHandler::getPlaybackEndpoints() { + return os->getPlaybackEndpoints(); } -OverseerHandler::OverseerHandler(QObject *parent) : QObject(parent) { - +/* + * Overseer* OverseerHandler::getOverseer(){ + * return &os; + * } + */ + + +std::vector* OverseerHandler::getEndpointHandlers(){ + return &endpointHandlers; } -std::vector* OverseerHandler::getEndpointWidgets(){ - return &endpointWidgets; +uint64_t OverseerHandler::getPlaybackEndpointsCount(){ + return os->getplaybackEndpoints().size(); +} + +void OverseerHandler::reloadEndpointHandlers(){ + //std::vector* ephs = new std::vector; + + for(uint64_t i = 0; i < osh->getPlaybackEndpointsCount(); i++){ + if(i < osh->getPlaybackEndpointsCount().size() && + osh->getPlaybackEndpointsCount().at(i) != nullptr) + delete ephs.at(i); + EndpointHandler* eph = new EndpointHandler(i); + + if (i >= osh->getPlaybackEndpointsCount().size()) + ephs.push_back(eph); + else epsh.at(i) = eph; + } + //setEndpointHandlers(ephs); } void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify){ log_debugcpp("parsing in da ovasiar"); - for (uint64_t i = 0; i < endpointWidgets.size(); i++){ - if(endpointWidgets.at(i)->eph->epc == fEpc) { - endpointWidgets.at(i)->muteButton->setText(endpointWidgets.at(i)->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); + for (uint64_t i = 0; i < endpointHandlers.size(); i++){ + if(endpointHandlers.at(i)->eph->epc == fEpc) { + endpointHandlers.at(i)->muteButton->setText(endpointHandlers.at(i)->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); break; } } @@ -73,7 +106,7 @@ void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUD */ } -void OverseerHandler::setEndpointWidgets(std::vector ews){ - this->endpointWidgets = ews; +void OverseerHandler::setEndpointHandlers(std::vector ews){ + this->endpointHandlers = ews; } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index f11f312..ceeb17c 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -1,48 +1,51 @@ #pragma once -#include #include "backlasses.h" -class EndpointHandler : public QObject { - Q_OBJECT - +class EndpointHandler { + public: - EndpointHandler(Endpoint *ept, EndpointCallback *epc, QObject *parent = nullptr); + EndpointHandler(Endpoint *ept); //TODO: get(); Endpoint *ep; EndpointCallback *epc; QString epName; + + void setIndex(uint64_t idx); + void setVolume(int channel, float volume); + //todo qstrin????? idiota QString getName(); float getVolume(int channel); bool getMute(); - + + void setValue(int channel, int value); + void setMute(); private: + uint64_t idx; //QSlider *slidy; -public slots: - void setValue(int channel, int value); - void setMute(); //signals: }; -class OverseerHandler : public QObject { - Q_OBJECT +class OverseerHandler { public: - OverseerHandler(QObject *parent = nullptr); - void setEndpointWidgets(std::vector ews); - std::vector* getEndpointWidgets(); + //OverseerHandler(); + void setEndpointHandlers(std::vector ews); + std::vector* getEndpointHandlers(); + std::vector getPlaybackEndpoints(); + uint64_t getPlaybackEndpointsCount(); void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); - static Overseer* getOverseer(); + //static Overseer* getOverseer(); private: static Overseer os; - std::vector endpointWidgets; + std::vector endpointHandlers; //QSlider *slidy; //public slots: diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 70334c3..104f7da 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -63,7 +63,17 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( } -MainWindow::MainWindow(std::vector *ephs, QWidget *parent) : QMainWindow(parent) { +void EndpointWidget::setIndex(uint64_t idx){ + this.idx = idx; +} + +uint64_t EndpointWidget::getIndex(){ + return idx; +} + + + +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // setWindowState(Qt::WindowFullScreen); // setCentralWidget(centralWidget); widget = new QWidget(); @@ -81,11 +91,10 @@ MainWindow::MainWindow(std::vector *ephs, QWidget *parent) : Q unsigned int i = 0; for (; i < ephs->size(); i++) { log_debugcpp("EPWidget creation"); - EndpointWidget *epw = new EndpointWidget(ephs->at(i), widget); + EndpointWidget *epw = new EndpointWidget(osh->getEndpointHandlers().at(i), widget); ews.push_back(epw); layout->addWidget(epw, i, 0); } - osh->setEndpointWidgets(ews); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), i, 0); } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index e7e9d91..824fd89 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -21,7 +21,9 @@ public: EndpointWidget(EndpointHandler* eph, QWidget *parent = nullptr); //TODO: get(); EndpointHandler* eph; - + void setIndex(uint64_t idx); + void setVolume(int channel, float volume); + QPushButton *muteButton = nullptr; QLabel *mainLabel = nullptr, *leftChannelLabel = nullptr, *rightChannelLabel = nullptr; QSlider *mainSlider = nullptr; @@ -33,7 +35,7 @@ public: //void setEndpointHandlers(std::vector *ephs); private: - + uint64_t idx; //std::vector *ephs; //std::vector *sliders; diff --git a/src/qtestmain.cpp b/src/qtestmain.cpp index d619db1..5fa6360 100644 --- a/src/qtestmain.cpp +++ b/src/qtestmain.cpp @@ -22,17 +22,11 @@ QApplication* createApplication(int &argc, char *argv[]) int main (int argc, char* argv[]) { //QApplication::setStyle("windowsvista"); //INIT CONT - std::vector eps = OverseerHandler::getOverseer()->getPlaybackEndpoints(); - std::vector* ephs = new std::vector; - for(unsigned int i = 0; i < eps.size(); i++){ - EndpointCallback* epc = new EndpointCallback(); - EndpointHandler* eph = new EndpointHandler(eps.at(i), epc); - ephs->push_back(eph); - } + osh->reloadEndpointHandlers(); //INIT FRONT QScopedPointer app(createApplication(argc, argv)); - MainWindow window = MainWindow(ephs); + MainWindow window = MainWindow(); //window.setEndpointHandlers(ephs); app->setStyle("windowsvista"); window.show(); From 80685f1a21c2ad0fd1b5784e60fb672dea0a74cb Mon Sep 17 00:00:00 2001 From: Hane Date: Fri, 11 Aug 2023 16:39:10 +0200 Subject: [PATCH 05/22] Refactored program structure --- qtest.pro | 1 + src/back/backlasses.cpp | 47 ++++++++++++++++--------- src/back/backlasses.h | 52 +++++++++++++++------------- src/cont/contclasses.cpp | 74 ++++++++++++++++++++++------------------ src/cont/contclasses.h | 33 +++++++++++------- src/debug.h | 1 + src/global.h | 6 ++++ src/qt/qtclasses.cpp | 6 ++-- src/qt/qtclasses.h | 9 +++-- src/qtestmain.cpp | 5 ++- 10 files changed, 139 insertions(+), 95 deletions(-) diff --git a/qtest.pro b/qtest.pro index 39fad14..73f3f80 100644 --- a/qtest.pro +++ b/qtest.pro @@ -1,6 +1,7 @@ QMAKE_CXXFLAGS += --target=x86_64-w64-mingw32 QMAKE_LINKER += clang++ QMAKE_LFLAGS += -v +DEFINES += DEBUG CONFIG += debug console QT += widgets INCLUDEPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\cont" diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 1a48dd7..1cf1006 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -1,7 +1,7 @@ #include EndpointCallback::EndpointCallback(Endpoint* ep){ - this.ep = ep; + this->ep = ep; } ULONG EndpointCallback::AddRef(){ @@ -36,13 +36,15 @@ HRESULT EndpointCallback::QueryInterface(REFIID riid, VOID **ppvInterface) { } HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { - if (pNotify == NULL) return E_INVALIDARG; - AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; - LPGUID guid = osh->getOverseer()->getGuid(); - - if (eventData.guidEventContext != *guid) { - osh->parseExternalEndpointCallback(this, eventData); - } + if (pNotify == NULL) return E_INVALIDARG; + /* + * AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; + * LPGUID guid = osh->getOverseer()->getGuid(); + * + * if (eventData.guidEventContext != *guid) { + * osh->parseExternalEndpointCallback(this, eventData); + * } + */ return S_OK; } @@ -58,11 +60,11 @@ Endpoint::Endpoint(IMMDevice* ep){ endpoint->OpenPropertyStore(STGM_READ, &properties); PROPVARIANT pv; properties->GetValue(PKEY_Device_FriendlyName , &pv); - friendlyName = pv.pwszVal; + friendlyName = std::wstring(pv.pwszVal); } void Endpoint::setIndex(uint64_t idx){ - this.idx = idx; + this->idx = idx; } uint64_t Endpoint::getIndex(){ @@ -70,7 +72,7 @@ uint64_t Endpoint::getIndex(){ } -LPWSTR Endpoint::getName(){ +std::wstring Endpoint::getName(){ return friendlyName; } @@ -118,10 +120,10 @@ void Endpoint::setVolume(int channel, float volume) { } void Endpoint::setMute() { - log_debugcpp("bool mute arrives as " << mut); BOOL mut; + //log_debugcpp("bool mute arrives as " << mut); if(FAILED(endpointVolume->GetMute(&mut))) { log_debugcpp("si"); } - log_debugcpp("translate to BOOL as " << mute); + log_debugcpp("translate to BOOL as " << mut); if(FAILED(endpointVolume->SetMute((mut == false ? 1 : 0), NULL))) { log_debugcpp("si"); }; } @@ -135,7 +137,6 @@ void Endpoint::removeCallback(EndpointCallback *epc){ Endpoint::~Endpoint(){ log_debugcpp("cum"); - free(friendlyName); properties->Release(); endpointVolume->Release(); endpoint->Release(); @@ -153,8 +154,18 @@ void Overseer::initCOMLibrary(){ (void**)&deviceEnumerator)) ) { log_debugcpp("si"); }; - if(FAILED(CoCreateGuid(guid))) { log_debugcpp("guyyyyyy"); }; - + /* + * LPGUID tempGuid = nullptr; + * if(FAILED(CoCreateGuid(tempGuid))) { log_debugcpp("Failed to obtain GUID"); }; + * + * this->guid.data1 = tempGuid->Data1; + * this->guid.data2 = tempGuid->Data2; + * this->guid.data3 = tempGuid->Data3; + * for (int i = 0; i < 8; i++){ + * this->guid.data4[i] = tempGuid->Data4[i]; + * } + */ + //TODO: Release lpguid? } void Overseer::reloadEndpoints() { @@ -184,6 +195,7 @@ void Overseer::reloadEndpoints() { Overseer::Overseer(){ //Initializing COM library + log_debugcpp("Initializing Overseer"); initCOMLibrary(); //Obtaining playback endpoint collection on this point in time @@ -198,7 +210,8 @@ Overseer::Overseer(){ //int Overseer::getDefaultCaptureEndpoint(Endpoint** defaultEndpoint); -LPGUID Overseer::getGuid() { +//TODO guid +NGuid Overseer::getGuid() { return guid; } diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 2da5724..9f97dde 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -1,11 +1,13 @@ #pragma once #define WIN32_LEAN_AND_MEAN +//done by qt by def #define UNICODE -#include "debug.h" +//#include "debug.h" #include "global.h" -#include -#include -#include +#include "contclasses.h" +/* #include */ +/* #include */ +/* #include */ #include #include @@ -20,24 +22,9 @@ //#include #include -//class EndpointWidget; +#include "contclasses.h" -class EndpointCallback : public IAudioEndpointVolumeCallback { - - public: - EndpointCallback(Endpoint* ep); - - ULONG AddRef(); - ULONG Release(); - HRESULT QueryInterface(REFIID riid, VOID **ppvInterface); - HRESULT OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA update); - ~EndpointCallback(); - - private: - ULONG ref = 1; - Endpoint* ep; - PAUDIO_VOLUME_NOTIFICATION_DATA update; -}; +class EndpointCallback; class Endpoint { @@ -51,7 +38,7 @@ class Endpoint { float getVolume(int channel); void setMute(); bool getMute(); - LPWSTR getName(); + std::wstring getName(); void setCallback(EndpointCallback *epc); void removeCallback(EndpointCallback *epc); ~Endpoint(); @@ -65,13 +52,30 @@ class Endpoint { // LPWSTR endpointID = NULL; }; +class EndpointCallback : public IAudioEndpointVolumeCallback { + + public: + EndpointCallback(Endpoint* ep); + + ULONG AddRef(); + ULONG Release(); + HRESULT QueryInterface(REFIID riid, VOID **ppvInterface); + HRESULT OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA update); + //~EndpointCallback(); + + private: + ULONG ref = 1; + Endpoint* ep; + //PAUDIO_VOLUME_NOTIFICATION_DATA update; +}; + class Overseer { //TODO singleton? public: Overseer(); std::vector getPlaybackEndpoints(); void reloadEndpoints(); - LPGUID getGuid(); + NGuid getGuid(); //~Overseer(); //int getDefaultPlaybackEndpoint(Endpoint** defaultEndpoint); //int getDefaultCaptureEndpoint(Endpoint** defaultEndpoint); @@ -80,7 +84,7 @@ class Overseer { ~Overseer(); private: - LPGUID guid; + NGuid guid; unsigned int numPlaybackEndpoints; IMMDeviceEnumerator *deviceEnumerator; std::vector playbackDevices; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index f5c2855..e26bf25 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -1,4 +1,4 @@ -#incluse "backlasses.h" +#include "backlasses.h" #include "contclasses.h" Overseer OverseerHandler::os; @@ -7,12 +7,12 @@ EndpointHandler::EndpointHandler(uint64_t idx) { std::vector endpoints = osh->getPlaybackEndpoints(); this->ep = endpoints.at(idx); epc = new EndpointCallback(ep); - epName = QString::fromStdWString(ept->getName()); - ep->setCallback(*epc); + //epName = ep->getName(); + //ep->setCallback(*epc); } void EndpointHandler::setIndex(uint64_t idx){ - this.idx = idx; + this->idx = idx; } uint64_t EndpointHandler::getIndex(){ @@ -25,36 +25,36 @@ uint64_t EndpointHandler::getIndex(){ */ void EndpointHandler::setValue(int channel, int value){ if (channel == ENDPOINT_MASTER_VOLUME) - ept->setVolume(channel, (float)value / 100); - else ept->setVolume(channel, (float)value / 100); + ep->setVolume(channel, (float)value / 100); + else ep->setVolume(channel, (float)value / 100); } void EndpointHandler::setMute(){ //Qt momento, de ahi el param? log_debugcpp("kinda handling the muting tbh"); - ept->setMute(); + ep->setMute(); } -QString EndpointHandler::getName(){ - return eptName; +std::wstring EndpointHandler::getName(){ + return ep->getName(); } float EndpointHandler::getVolume(int channel){ - return ept->getVolume(channel); + return ep->getVolume(channel); } bool EndpointHandler::getMute(){ - return ept->getMute(); + return ep->getMute(); } EndpointHandler::~EndpointHandler() { - ep->removeCallback(*epc); + ep->removeCallback(epc); delete epc; delete ep; } std::vector OverseerHandler::getPlaybackEndpoints() { - return os->getPlaybackEndpoints(); + return os.getPlaybackEndpoints(); } /* @@ -64,38 +64,46 @@ std::vector OverseerHandler::getPlaybackEndpoints() { */ -std::vector* OverseerHandler::getEndpointHandlers(){ - return &endpointHandlers; +std::vector OverseerHandler::getEndpointHandlers(){ + return endpointHandlers; } uint64_t OverseerHandler::getPlaybackEndpointsCount(){ - return os->getplaybackEndpoints().size(); + return os.getPlaybackEndpoints().size(); } void OverseerHandler::reloadEndpointHandlers(){ //std::vector* ephs = new std::vector; + log_debugcpp(" VSize: " << this->getPlaybackEndpointsCount()); + + for(uint64_t i = 0; i < this->getPlaybackEndpointsCount(); i++){ + log_debugcpp("Creating handler " << i); + + if(i < (this->endpointHandlers.size()) && + this->endpointHandlers.at(i) != nullptr) + delete endpointHandlers.at(i); + - for(uint64_t i = 0; i < osh->getPlaybackEndpointsCount(); i++){ - if(i < osh->getPlaybackEndpointsCount().size() && - osh->getPlaybackEndpointsCount().at(i) != nullptr) - delete ephs.at(i); EndpointHandler* eph = new EndpointHandler(i); - - if (i >= osh->getPlaybackEndpointsCount().size()) - ephs.push_back(eph); - else epsh.at(i) = eph; + log_debugcpp("Created handler " << i << ", adding to vector. " << " VSize: " << this->getPlaybackEndpointsCount()); + + if (i >= this->endpointHandlers.size()) + endpointHandlers.push_back(eph); + else endpointHandlers.at(i) = eph; } //setEndpointHandlers(ephs); } -void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify){ - log_debugcpp("parsing in da ovasiar"); - for (uint64_t i = 0; i < endpointHandlers.size(); i++){ - if(endpointHandlers.at(i)->eph->epc == fEpc) { - endpointHandlers.at(i)->muteButton->setText(endpointHandlers.at(i)->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); - break; - } - } +/* + * void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify){ + * log_debugcpp("parsing in da ovasiar"); + * for (uint64_t i = 0; i < endpointHandlers.size(); i++){ + * if(endpointHandlers.at(i)->eph->epc == fEpc) { + * endpointHandlers.at(i)->muteButton->setText(endpointHandlers.at(i)->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); + * break; + * } + * } + */ /* * connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); @@ -104,7 +112,7 @@ void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUD * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); * log_debugcpp("ENDPOINT_WIDGETED"); */ -} + void OverseerHandler::setEndpointHandlers(std::vector ews){ this->endpointHandlers = ews; diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index ceeb17c..db013b0 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -1,27 +1,36 @@ #pragma once -#include "backlasses.h" +class Endpoint; +class EndpointCallback; +class Overseer; +struct NGuid { + uint32_t data1; + uint16_t data2; + uint16_t data3; + unsigned char data4[8]; +}; class EndpointHandler { public: - EndpointHandler(Endpoint *ept); + EndpointHandler(uint64_t idx); //TODO: get(); Endpoint *ep; EndpointCallback *epc; - QString epName; + //std::wstring epName; void setIndex(uint64_t idx); + uint64_t getIndex(); void setVolume(int channel, float volume); - //todo qstrin????? idiota - QString getName(); + std::wstring getName(); float getVolume(int channel); bool getMute(); void setValue(int channel, int value); - void setMute(); + void setMute(); + ~EndpointHandler(); private: uint64_t idx; //QSlider *slidy; @@ -37,18 +46,16 @@ class OverseerHandler { public: //OverseerHandler(); void setEndpointHandlers(std::vector ews); - std::vector* getEndpointHandlers(); + std::vector getEndpointHandlers(); std::vector getPlaybackEndpoints(); uint64_t getPlaybackEndpointsCount(); - void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); + void reloadEndpointHandlers(); + + //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); //static Overseer* getOverseer(); private: static Overseer os; std::vector endpointHandlers; - //QSlider *slidy; - - //public slots: - //void setValue(int value); - + }; diff --git a/src/debug.h b/src/debug.h index f91232b..6e4baa8 100644 --- a/src/debug.h +++ b/src/debug.h @@ -8,3 +8,4 @@ #else #define log_debugcpp(str) #endif + diff --git a/src/global.h b/src/global.h index 977e0b8..6b949b6 100644 --- a/src/global.h +++ b/src/global.h @@ -1,5 +1,11 @@ #pragma once +#include +#include +#include + +#include "debug.h" + //TODO enum capullo #define ENDPOINT_MASTER_VOLUME -1 #define ENDPOINT_LEFT_CHANNEL_VOLUME 0 diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 104f7da..79c1909 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -9,7 +9,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( if (parent == nullptr) { log_debugcpp("owo?"); } muteButton = new QPushButton(); - mainLabel = new QLabel(eph->getName()); + mainLabel = new QLabel(QString::fromStdWString(eph->getName())); leftChannelLabel = new QLabel("88"); rightChannelLabel = new QLabel("77"); mainSlider = new QSlider(Qt::Horizontal); @@ -64,7 +64,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( void EndpointWidget::setIndex(uint64_t idx){ - this.idx = idx; + this->idx = idx; } uint64_t EndpointWidget::getIndex(){ @@ -89,7 +89,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { * setEndpointHandlers(ephs); */ unsigned int i = 0; - for (; i < ephs->size(); i++) { + for (; i < (osh->getEndpointHandlers().size()); i++) { log_debugcpp("EPWidget creation"); EndpointWidget *epw = new EndpointWidget(osh->getEndpointHandlers().at(i), widget); ews.push_back(epw); diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 824fd89..a543c25 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -2,13 +2,16 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include +//#include #include #include #include #include #include #include + +//#include "debug.h" +#include "global.h" #include "contclasses.h" //#include //#include @@ -22,6 +25,8 @@ public: //TODO: get(); EndpointHandler* eph; void setIndex(uint64_t idx); + uint64_t getIndex(); + void setVolume(int channel, float volume); QPushButton *muteButton = nullptr; @@ -53,7 +58,7 @@ class MainWindow : public QMainWindow { //QWidget *centralWidget; public: - MainWindow(std::vector *ephs, QWidget *parent = nullptr); + MainWindow(QWidget *parent = nullptr); //void setEndpointHandlers(std::vector *ephs); private: diff --git a/src/qtestmain.cpp b/src/qtestmain.cpp index 5fa6360..453cce6 100644 --- a/src/qtestmain.cpp +++ b/src/qtestmain.cpp @@ -1,6 +1,3 @@ -#include -#include - //#include //#include @@ -22,7 +19,9 @@ QApplication* createApplication(int &argc, char *argv[]) int main (int argc, char* argv[]) { //QApplication::setStyle("windowsvista"); //INIT CONT + log_debugcpp("main init"); osh->reloadEndpointHandlers(); + log_debugcpp("Reloaded endpoint handlers"); //INIT FRONT QScopedPointer app(createApplication(argc, argv)); From 7e741f3bcae0e9bc268015e84565e97da802fcca Mon Sep 17 00:00:00 2001 From: Hane Date: Fri, 11 Aug 2023 21:35:48 +0200 Subject: [PATCH 06/22] template and fixed guid obtaining --- src/back/backlasses.cpp | 37 +++++++++++++++++++++++++------------ src/debug.h | 14 +++++++++++++- src/global.h | 1 + 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 1cf1006..1a6f463 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -144,7 +144,8 @@ Endpoint::~Endpoint(){ void Overseer::initCOMLibrary(){ - if(FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED))) { log_debugcpp("si"); }; + if(FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) { + log_debugcpp("si"); }; //Retrieving endpoint enumerator @@ -154,17 +155,29 @@ void Overseer::initCOMLibrary(){ (void**)&deviceEnumerator)) ) { log_debugcpp("si"); }; - /* - * LPGUID tempGuid = nullptr; - * if(FAILED(CoCreateGuid(tempGuid))) { log_debugcpp("Failed to obtain GUID"); }; - * - * this->guid.data1 = tempGuid->Data1; - * this->guid.data2 = tempGuid->Data2; - * this->guid.data3 = tempGuid->Data3; - * for (int i = 0; i < 8; i++){ - * this->guid.data4[i] = tempGuid->Data4[i]; - * } - */ + + GUID tempGuid; + /* + * HRESULT her = CoCreateGuid(&tempGuid); + * std::bitset<32> bon(her); + * //if (hr == EPT_S_CANT_CREATE) + * log_debugcpp("Failed to obtain GUID: " /\*<< std::hex *\/<< her << std::dec << " " << bon); + */ + if(FAILED(CoCreateGuid(&tempGuid))) { log_debugcpp("Failed to obtain GUID: " ); }; + + + this->guid.data1 = tempGuid.Data1; + this->guid.data2 = tempGuid.Data2; + this->guid.data3 = tempGuid.Data3; + for (int i = 0; i < 8; i++){ + this->guid.data4[i] = tempGuid.Data4[i]; + log_debugcpp("GUID DATA4 BYTE " << i << ": "); + log_debugcpp(print_as_binary(8, uint32_t, this->guid.data4[i])); + } + log_debugcpp("GUID DATA1: " << this->guid.data1); + log_debugcpp("GUID DATA2: " << this->guid.data2); + log_debugcpp("GUID DATA3: " << this->guid.data3); + //TODO: Release lpguid? } diff --git a/src/debug.h b/src/debug.h index 6e4baa8..78cb19c 100644 --- a/src/debug.h +++ b/src/debug.h @@ -2,10 +2,22 @@ #if defined (QT_DEBUG) || defined (DEBUG) || defined (_DEBUG) +template +std::bitset varToBitset(T info) { + std::bitset content(info); + return content; +} + #define log_debugcpp(str) do { \ std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << str << std::endl; \ } while (0) + +#define print_as_binary(len, type, info) varToBitset(info) + #else -#define log_debugcpp(str) +#define log_debugcpp(str) +#define print_as_binary(len, info) #endif + + diff --git a/src/global.h b/src/global.h index 6b949b6..eaf2968 100644 --- a/src/global.h +++ b/src/global.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "debug.h" From a24bba35be8af3c9f117bd4ba924897da8b24638 Mon Sep 17 00:00:00 2001 From: Hane Date: Sat, 12 Aug 2023 12:29:01 +0200 Subject: [PATCH 07/22] guid sent and validated for mute --- qtest.pro | 2 +- src/back/backfuncs.h | 33 +++++++++++++++++++++++ src/back/backlasses.cpp | 56 ++++++++++++++++------------------------ src/back/backlasses.h | 7 +++-- src/cont/contclasses.cpp | 28 +++++--------------- src/cont/contclasses.h | 7 ++--- src/qt/qtclasses.cpp | 2 +- 7 files changed, 71 insertions(+), 64 deletions(-) create mode 100644 src/back/backfuncs.h diff --git a/qtest.pro b/qtest.pro index 73f3f80..d2ac80f 100644 --- a/qtest.pro +++ b/qtest.pro @@ -8,5 +8,5 @@ INCLUDEPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\cont" DESTPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\cont" VPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\cont" SOURCES += qtestmain.cpp qtclasses.cpp backlasses.cpp contclasses.cpp -HEADERS += qtclasses.h backlasses.h contclasses.h global.h debug.h +HEADERS += qtclasses.h backlasses.h contclasses.h global.h debug.h backfuncs.h #DESTDIR += "build" diff --git a/src/back/backfuncs.h b/src/back/backfuncs.h new file mode 100644 index 0000000..13f36bc --- /dev/null +++ b/src/back/backfuncs.h @@ -0,0 +1,33 @@ +GUID NGuidToGUID(NGuid* guid){ + GUID msGuid = GUID(); + msGuid.Data1 = guid->data1; + msGuid.Data2 = guid->data2; + msGuid.Data3 = guid->data3; + msGuid.Data1 = guid->data1; + for (int i = 0; i < 8; i++){ + msGuid.Data4[i] = guid->data4[i]; + log_debugcpp("MSGUID DATA4 BYTE " << i << ": "); + log_debugcpp(print_as_binary(8, uint32_t, msGuid.Data4[i])); + } + log_debugcpp("MSGUID DATA1: " << msGuid.Data1); + log_debugcpp("MSGUID DATA2: " << msGuid.Data2); + log_debugcpp("MSGUID DATA3: " << msGuid.Data3); + + return msGuid; +} + +NGuid GUIDToNGuid(LPGUID msGuid){ + NGuid guid = NGuid(); + guid.data1 = msGuid->Data1; + guid.data2 = msGuid->Data2; + guid.data3 = msGuid->Data3; + for (int i = 0; i < 8; i++){ + guid.data4[i] = msGuid->Data4[i]; + log_debugcpp("GUID DATA4 BYTE " << i << ": "); + log_debugcpp(print_as_binary(8, uint32_t, guid.data4[i])); + } + log_debugcpp("GUID DATA1: " << guid.data1); + log_debugcpp("GUID DATA2: " << guid.data2); + log_debugcpp("GUID DATA3: " << guid.data3); + return guid; +} diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 1a6f463..e56da14 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -1,4 +1,5 @@ #include +#include EndpointCallback::EndpointCallback(Endpoint* ep){ this->ep = ep; @@ -37,14 +38,17 @@ HRESULT EndpointCallback::QueryInterface(REFIID riid, VOID **ppvInterface) { HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { if (pNotify == NULL) return E_INVALIDARG; - /* - * AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; - * LPGUID guid = osh->getOverseer()->getGuid(); - * - * if (eventData.guidEventContext != *guid) { - * osh->parseExternalEndpointCallback(this, eventData); - * } - */ + + AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; + NGuid* guid = osh->getGuid(); + + if (memcmp(guid, &eventData, sizeof(guid)) == 0) { + log_debugcpp("perlitas"); + } else { + log_debugcpp("Onnanokotify says Stored: " << guid->data1); + log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); + } + return S_OK; } @@ -119,12 +123,14 @@ void Endpoint::setVolume(int channel, float volume) { } } -void Endpoint::setMute() { +void Endpoint::setMute(NGuid* guid) { BOOL mut; //log_debugcpp("bool mute arrives as " << mut); if(FAILED(endpointVolume->GetMute(&mut))) { log_debugcpp("si"); } - log_debugcpp("translate to BOOL as " << mut); - if(FAILED(endpointVolume->SetMute((mut == false ? 1 : 0), NULL))) { log_debugcpp("si"); }; + log_debugcpp("translate to BOOL as " << mut); + //TODO: use new funcs + GUID tempMsGuid = NGuidToGUID(guid); + if(FAILED(endpointVolume->SetMute((mut == false ? 1 : 0), &tempMsGuid))) { log_debugcpp("si"); }; } void Endpoint::setCallback(EndpointCallback *epc){ @@ -142,8 +148,7 @@ Endpoint::~Endpoint(){ endpoint->Release(); } - -void Overseer::initCOMLibrary(){ +void Overseer::initCOMLibrary() { if(FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) { log_debugcpp("si"); }; @@ -155,30 +160,13 @@ void Overseer::initCOMLibrary(){ (void**)&deviceEnumerator)) ) { log_debugcpp("si"); }; - GUID tempGuid; - /* - * HRESULT her = CoCreateGuid(&tempGuid); - * std::bitset<32> bon(her); - * //if (hr == EPT_S_CANT_CREATE) - * log_debugcpp("Failed to obtain GUID: " /\*<< std::hex *\/<< her << std::dec << " " << bon); - */ if(FAILED(CoCreateGuid(&tempGuid))) { log_debugcpp("Failed to obtain GUID: " ); }; - - this->guid.data1 = tempGuid.Data1; - this->guid.data2 = tempGuid.Data2; - this->guid.data3 = tempGuid.Data3; - for (int i = 0; i < 8; i++){ - this->guid.data4[i] = tempGuid.Data4[i]; - log_debugcpp("GUID DATA4 BYTE " << i << ": "); - log_debugcpp(print_as_binary(8, uint32_t, this->guid.data4[i])); - } - log_debugcpp("GUID DATA1: " << this->guid.data1); - log_debugcpp("GUID DATA2: " << this->guid.data2); - log_debugcpp("GUID DATA3: " << this->guid.data3); + this->guid = GUIDToNGuid(&tempGuid); //TODO: Release lpguid? + //TODO: Uninitialize COM } void Overseer::reloadEndpoints() { @@ -224,8 +212,8 @@ Overseer::Overseer(){ //int Overseer::getDefaultCaptureEndpoint(Endpoint** defaultEndpoint); //TODO guid -NGuid Overseer::getGuid() { - return guid; +NGuid* Overseer::getGuid() { + return &guid; } std::vector Overseer::getPlaybackEndpoints() { diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 9f97dde..3be9f2d 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -3,8 +3,6 @@ //done by qt by def #define UNICODE //#include "debug.h" -#include "global.h" -#include "contclasses.h" /* #include */ /* #include */ /* #include */ @@ -22,6 +20,7 @@ //#include #include +#include "global.h" #include "contclasses.h" class EndpointCallback; @@ -36,7 +35,7 @@ class Endpoint { /* float getLeftChannelVolume(); */ /* float getRightChannelVolume(); */ float getVolume(int channel); - void setMute(); + void setMute(NGuid* guid); bool getMute(); std::wstring getName(); void setCallback(EndpointCallback *epc); @@ -75,7 +74,7 @@ class Overseer { Overseer(); std::vector getPlaybackEndpoints(); void reloadEndpoints(); - NGuid getGuid(); + NGuid* getGuid(); //~Overseer(); //int getDefaultPlaybackEndpoint(Endpoint** defaultEndpoint); //int getDefaultCaptureEndpoint(Endpoint** defaultEndpoint); diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index e26bf25..85bb2fb 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -8,7 +8,7 @@ EndpointHandler::EndpointHandler(uint64_t idx) { this->ep = endpoints.at(idx); epc = new EndpointCallback(ep); //epName = ep->getName(); - //ep->setCallback(*epc); + ep->setCallback(epc); } void EndpointHandler::setIndex(uint64_t idx){ @@ -29,10 +29,10 @@ void EndpointHandler::setValue(int channel, int value){ else ep->setVolume(channel, (float)value / 100); } -void EndpointHandler::setMute(){ +void EndpointHandler::setMute(NGuid* guid){ //Qt momento, de ahi el param? log_debugcpp("kinda handling the muting tbh"); - ep->setMute(); + ep->setMute(guid); } std::wstring EndpointHandler::getName(){ @@ -94,24 +94,10 @@ void OverseerHandler::reloadEndpointHandlers(){ //setEndpointHandlers(ephs); } -/* - * void OverseerHandler::parseExternalEndpointCallback(EndpointCallback *fEpc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify){ - * log_debugcpp("parsing in da ovasiar"); - * for (uint64_t i = 0; i < endpointHandlers.size(); i++){ - * if(endpointHandlers.at(i)->eph->epc == fEpc) { - * endpointHandlers.at(i)->muteButton->setText(endpointHandlers.at(i)->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); - * break; - * } - * } - */ - - /* - * connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); - * connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); - * connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); - * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); - * log_debugcpp("ENDPOINT_WIDGETED"); - */ + +NGuid* OverseerHandler::getGuid() { + return os.getGuid(); +} void OverseerHandler::setEndpointHandlers(std::vector ews){ diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index db013b0..c7e7ecf 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -16,8 +16,8 @@ class EndpointHandler { public: EndpointHandler(uint64_t idx); //TODO: get(); - Endpoint *ep; - EndpointCallback *epc; + Endpoint *ep = nullptr; + EndpointCallback *epc = nullptr; //std::wstring epName; void setIndex(uint64_t idx); @@ -29,7 +29,7 @@ public: bool getMute(); void setValue(int channel, int value); - void setMute(); + void setMute(NGuid* guid); ~EndpointHandler(); private: uint64_t idx; @@ -50,6 +50,7 @@ public: std::vector getPlaybackEndpoints(); uint64_t getPlaybackEndpointsCount(); void reloadEndpointHandlers(); + NGuid* getGuid(); //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); //static Overseer* getOverseer(); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 79c1909..d675be1 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -58,7 +58,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); - connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); + connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(osh->getGuid()); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); log_debugcpp("ENDPOINT_WIDGETED"); } From f21619aa1f09e01faa1e7b6854e791331aa7050e Mon Sep 17 00:00:00 2001 From: Hane Date: Sat, 12 Aug 2023 17:29:01 +0200 Subject: [PATCH 08/22] reverted failed attempt, fixed callback release --- src/back/backlasses.cpp | 2 +- src/back/backlasses.h | 1 - src/cont/contclasses.cpp | 23 +++++++++++++++-------- src/cont/contclasses.h | 13 +++++++++++-- src/qt/qtclasses.cpp | 18 ++++++------------ src/qt/qtclasses.h | 21 +++++++++++++++------ src/qtestmain.cpp | 3 +++ 7 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index e56da14..36dc9bf 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -42,7 +42,7 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; NGuid* guid = osh->getGuid(); - if (memcmp(guid, &eventData, sizeof(guid)) == 0) { + if (memcmp(guid, &eventData, sizeof(*guid)) == 0) { log_debugcpp("perlitas"); } else { log_debugcpp("Onnanokotify says Stored: " << guid->data1); diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 3be9f2d..0176ebf 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -65,7 +65,6 @@ class EndpointCallback : public IAudioEndpointVolumeCallback { private: ULONG ref = 1; Endpoint* ep; - //PAUDIO_VOLUME_NOTIFICATION_DATA update; }; class Overseer { diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 85bb2fb..1b58317 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -1,6 +1,9 @@ #include "backlasses.h" +#include "qtclasses.h" #include "contclasses.h" +//TODO: pragma once +//TODO: ????? Overseer OverseerHandler::os; EndpointHandler::EndpointHandler(uint64_t idx) { @@ -49,12 +52,12 @@ bool EndpointHandler::getMute(){ EndpointHandler::~EndpointHandler() { ep->removeCallback(epc); - delete epc; + epc->Release(); delete ep; } std::vector OverseerHandler::getPlaybackEndpoints() { - return os.getPlaybackEndpoints(); + return this->os.getPlaybackEndpoints(); } /* @@ -69,7 +72,7 @@ std::vector OverseerHandler::getEndpointHandlers(){ } uint64_t OverseerHandler::getPlaybackEndpointsCount(){ - return os.getPlaybackEndpoints().size(); + return this->os.getPlaybackEndpoints().size(); } void OverseerHandler::reloadEndpointHandlers(){ @@ -83,7 +86,6 @@ void OverseerHandler::reloadEndpointHandlers(){ this->endpointHandlers.at(i) != nullptr) delete endpointHandlers.at(i); - EndpointHandler* eph = new EndpointHandler(i); log_debugcpp("Created handler " << i << ", adding to vector. " << " VSize: " << this->getPlaybackEndpointsCount()); @@ -96,11 +98,16 @@ void OverseerHandler::reloadEndpointHandlers(){ NGuid* OverseerHandler::getGuid() { - return os.getGuid(); + return this->os.getGuid(); } - -void OverseerHandler::setEndpointHandlers(std::vector ews){ - this->endpointHandlers = ews; +void OverseerHandler::setEndpointHandlers(std::vector ephs){ + this->endpointHandlers = ephs; } +/* + * void OverseerHandler::setEndpointWidgets(std::vector ews){ + * this->endpointWidgets = ews; + * } + */ + diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index c7e7ecf..2a27a2e 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -1,5 +1,13 @@ #pragma once +/* #ifndef QTBLESSED */ +/* //#define Q_OBJECT */ +/* class QWidget{}; */ +/* class QMainWindow{}; */ +/* #endif */ + +/* class EndpointWidget; */ + class Endpoint; class EndpointCallback; class Overseer; @@ -45,7 +53,8 @@ class OverseerHandler { public: //OverseerHandler(); - void setEndpointHandlers(std::vector ews); + void setEndpointHandlers(std::vector ephs); + /* void setEndpointWidgets(std::vector ews); */ std::vector getEndpointHandlers(); std::vector getPlaybackEndpoints(); uint64_t getPlaybackEndpointsCount(); @@ -58,5 +67,5 @@ public: private: static Overseer os; std::vector endpointHandlers; - + /* std::vector endpointWidgets; */ }; diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index d675be1..9f10764 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -1,6 +1,5 @@ #include "qtclasses.h" - EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget(parent){ this->eph = eph; layout = new QGridLayout(); @@ -71,8 +70,6 @@ uint64_t EndpointWidget::getIndex(){ return idx; } - - MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // setWindowState(Qt::WindowFullScreen); // setCentralWidget(centralWidget); @@ -84,10 +81,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { //layout->addWidget(pintas, 0, 0); setWindowTitle("slidea resbala nu c"); + + reloadEndpointWidgets(); +} - /*s - * setEndpointHandlers(ephs); - */ +void MainWindow::reloadEndpointWidgets() { unsigned int i = 0; for (; i < (osh->getEndpointHandlers().size()); i++) { log_debugcpp("EPWidget creation"); @@ -95,15 +93,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { ews.push_back(epw); layout->addWidget(epw, i, 0); } + //osh->setEndpointWidgets(ews); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), i, 0); } -/* - * void MainWindow::setEndpointHandlers(std::vector *ephs){ - * this->ephs = ephs; - */ - - +//#include "qtclosemwh.h" /* * void MainWindow::setPlotButton() { diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index a543c25..0a18ac9 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -1,8 +1,8 @@ #pragma once + #ifndef MAINWINDOW_H #define MAINWINDOW_H -//#include #include #include #include @@ -10,12 +10,20 @@ #include #include -//#include "debug.h" +/* + * #else + * class QSlider; + * class QLabel; + * class QGridLayout; + * class QPushButton; + * class QWidget; + * class QMainWindow; + * #endif + */ + #include "global.h" #include "contclasses.h" -//#include -//#include - +//class EndpointHandler; class EndpointWidget : public QWidget { Q_OBJECT @@ -59,6 +67,8 @@ class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr); + void reloadEndpointWidgets(); + //TODO: destroy/empty existing EndpointWidgets //void setEndpointHandlers(std::vector *ephs); private: @@ -77,4 +87,3 @@ private: }; #endif - diff --git a/src/qtestmain.cpp b/src/qtestmain.cpp index 453cce6..15d18fc 100644 --- a/src/qtestmain.cpp +++ b/src/qtestmain.cpp @@ -2,9 +2,12 @@ //#include //#include + +//#define QTBLESSED #include #include +//#include "contclasses.h" #include "qtclasses.h" #include "global.h" From ad53af655bb5dcf86610a68f1f8af6608ff34f3e Mon Sep 17 00:00:00 2001 From: Hane Date: Sat, 12 Aug 2023 19:26:50 +0200 Subject: [PATCH 09/22] first callback implemented; overload not working --- src/back/backlasses.cpp | 13 ++++++------ src/back/backlasses.h | 2 +- src/cont/contclasses.cpp | 17 +++++++++------ src/cont/contclasses.h | 9 ++++---- src/qt/qtclasses.cpp | 46 ++++++++++++++++++++++++++++++++++------ src/qt/qtclasses.h | 34 +++++++++++++++++++++++++---- 6 files changed, 92 insertions(+), 29 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 36dc9bf..b9c54c8 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -43,10 +43,11 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { NGuid* guid = osh->getGuid(); if (memcmp(guid, &eventData, sizeof(*guid)) == 0) { - log_debugcpp("perlitas"); + log_debugcpp("Onnanokotify says You Shall Not Update Thy Interface."); } else { log_debugcpp("Onnanokotify says Stored: " << guid->data1); log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); + osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); } return S_OK; @@ -123,14 +124,14 @@ void Endpoint::setVolume(int channel, float volume) { } } -void Endpoint::setMute(NGuid* guid) { - BOOL mut; +void Endpoint::setMute(NGuid* guid, bool muted) { + //BOOL mut; //log_debugcpp("bool mute arrives as " << mut); - if(FAILED(endpointVolume->GetMute(&mut))) { log_debugcpp("si"); } - log_debugcpp("translate to BOOL as " << mut); + //if(FAILED(endpointVolume->GetMute(&mut))) { log_debugcpp("si"); } + //log_debugcpp("translate to BOOL as " << mut); //TODO: use new funcs GUID tempMsGuid = NGuidToGUID(guid); - if(FAILED(endpointVolume->SetMute((mut == false ? 1 : 0), &tempMsGuid))) { log_debugcpp("si"); }; + if(FAILED(endpointVolume->SetMute(muted, &tempMsGuid))) { log_debugcpp("si"); }; } void Endpoint::setCallback(EndpointCallback *epc){ diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 0176ebf..386344f 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -35,7 +35,7 @@ class Endpoint { /* float getLeftChannelVolume(); */ /* float getRightChannelVolume(); */ float getVolume(int channel); - void setMute(NGuid* guid); + void setMute(NGuid* guid, bool muted); bool getMute(); std::wstring getName(); void setCallback(EndpointCallback *epc); diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 1b58317..81e71cb 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -32,10 +32,10 @@ void EndpointHandler::setValue(int channel, int value){ else ep->setVolume(channel, (float)value / 100); } -void EndpointHandler::setMute(NGuid* guid){ +void EndpointHandler::setMute(NGuid* guid, bool muted){ //Qt momento, de ahi el param? log_debugcpp("kinda handling the muting tbh"); - ep->setMute(guid); + ep->setMute(guid, muted); } std::wstring EndpointHandler::getName(){ @@ -105,9 +105,12 @@ void OverseerHandler::setEndpointHandlers(std::vector ephs){ this->endpointHandlers = ephs; } -/* - * void OverseerHandler::setEndpointWidgets(std::vector ews){ - * this->endpointWidgets = ews; - * } - */ +void OverseerHandler::setEndpointWidgets(std::vector ews){ + this->endpointWidgets = ews; +} + +void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ + epwMuteFunc f = &EndpointWidget::updateMuteC; + std::invoke(f, endpointWidgets.at(idx), muted); +} diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 2a27a2e..16cab7c 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -6,7 +6,7 @@ /* class QMainWindow{}; */ /* #endif */ -/* class EndpointWidget; */ +class EndpointWidget; class Endpoint; class EndpointCallback; @@ -37,7 +37,7 @@ public: bool getMute(); void setValue(int channel, int value); - void setMute(NGuid* guid); + void setMute(NGuid* guid, bool muted); ~EndpointHandler(); private: uint64_t idx; @@ -54,12 +54,13 @@ class OverseerHandler { public: //OverseerHandler(); void setEndpointHandlers(std::vector ephs); - /* void setEndpointWidgets(std::vector ews); */ + void setEndpointWidgets(std::vector ews); std::vector getEndpointHandlers(); std::vector getPlaybackEndpoints(); uint64_t getPlaybackEndpointsCount(); void reloadEndpointHandlers(); NGuid* getGuid(); + void updateMuteCallback(uint64_t idx, bool muted); //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); //static Overseer* getOverseer(); @@ -67,5 +68,5 @@ public: private: static Overseer os; std::vector endpointHandlers; - /* std::vector endpointWidgets; */ + std::vector endpointWidgets; }; diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 9f10764..1a48c91 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -1,5 +1,21 @@ #include "qtclasses.h" +/* + * ToggleButton::ToggleButton(QWidget *parent) : QAbstractButton(parent) { + * this->setCheckable(true); + * } + * + * ToggleButton::~ToggleButton(){ + * + * } + * + * void ToggleButton::checkStateSet(){ } + * + * bool hitButton(const QPoint &pos) { + * + * } + */ + EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget(parent){ this->eph = eph; layout = new QGridLayout(); @@ -7,7 +23,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( log_debugcpp("olaW"); if (parent == nullptr) { log_debugcpp("owo?"); } - muteButton = new QPushButton(); + muteButton = new QCheckBox(); mainLabel = new QLabel(QString::fromStdWString(eph->getName())); leftChannelLabel = new QLabel("88"); rightChannelLabel = new QLabel("77"); @@ -15,7 +31,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( leftChannelSlider = new QSlider(Qt::Horizontal); rightChannelSlider = new QSlider(Qt::Horizontal); - muteButton->setStyleSheet("background-color: #A3C1DA; color: red"); + //muteButton->setStyleSheet("background-color: #A3C1DA; color: red"); mainSlider->setFocusPolicy(Qt::StrongFocus); mainSlider->setTickPosition(QSlider::TicksBothSides); mainSlider->setTickInterval(5); @@ -28,6 +44,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( rightChannelSlider->setSingleStep(1); rightChannelSlider->setRange(0,100); + muteButton->setCheckState((eph->getMute() == false ? Qt::Unchecked : Qt::Checked)); muteButton->setText(eph->getMute() ? STRING_UNMUTE : STRING_MUTE); float volume = eph->getVolume(ENDPOINT_MASTER_VOLUME) * 100; mainSlider->setValue((int)volume); @@ -51,16 +68,31 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); - /* - * connect(mainSlider, &QSlider::valueChanged, eph, &EndpointHandler::setValue); - */ connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); - connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(osh->getGuid()); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); + connect(muteButton, &QCheckBox::stateChanged, this, &EndpointWidget::updateMute); + /* + * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(osh->getGuid()); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); + */ log_debugcpp("ENDPOINT_WIDGETED"); } +void EndpointWidget::updateMuteC(bool muted){ + log_debugcpp("cliqui callboqui cloqui"); + this->eph->setMute(osh->getGuid(), muted); + this->muteButton->setChecked(eph->getMute() ? true : false); + this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); +} + +void EndpointWidget::updateMute(int checked){ + log_debugcpp("cliqui slOtty cloqui"); + bool muted = (checked == 2 ? true : false); + log_debugcpp("int: " << checked << " bool: " << muted); + this->eph->setMute(osh->getGuid(), muted); + //this->muteButton->setCheckState(); + this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); +} void EndpointWidget::setIndex(uint64_t idx){ this->idx = idx; @@ -93,7 +125,7 @@ void MainWindow::reloadEndpointWidgets() { ews.push_back(epw); layout->addWidget(epw, i, 0); } - //osh->setEndpointWidgets(ews); + osh->setEndpointWidgets(ews); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), i, 0); } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 0a18ac9..d4d1d31 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -9,7 +9,7 @@ #include #include #include - +#include /* * #else * class QSlider; @@ -25,6 +25,30 @@ #include "contclasses.h" //class EndpointHandler; +/* + * class ToggleButton : public QAbstractButton { + * Q_OBJECT + * + * public: + * ToggleButton(QWidget *parent = nullptr); + * void checkStateSet(); + * bool hitButton(const QPoint &pos) const; + * void nextCheckState(); + * void changeEvent(QEvent *e) override; + * bool event(QEvent *e) override; + * void focusInEvent(QFocusEvent *e) override; + * void focusOutEvent(QFocusEvent *e) override; + * void keyPressEvent(QKeyEvent *e) override; + * void keyReleaseEvent(QKeyEvent *e) override; + * void mouseMoveEvent(QMouseEvent *e) override; + * void mousePressEvent(QMouseEvent *e) override; + * void mouseReleaseEvent(QMouseEvent *e) override; + * void paintEvent(QPaintEvent *e) override = 0; + * void timerEvent(QTimerEvent *e) override; + * ToggleButton(QWidget *parent = nullptr); + * }; + */ + class EndpointWidget : public QWidget { Q_OBJECT @@ -37,29 +61,31 @@ public: void setVolume(int channel, float volume); - QPushButton *muteButton = nullptr; + QCheckBox *muteButton = nullptr; QLabel *mainLabel = nullptr, *leftChannelLabel = nullptr, *rightChannelLabel = nullptr; QSlider *mainSlider = nullptr; QSlider *leftChannelSlider = nullptr; QSlider *rightChannelSlider = nullptr; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; + void updateMuteC(bool muted); //void populateEndpointWidget(EndpointHandler *eph); //void setEndpointHandlers(std::vector *ephs); +public slots: + void updateMute(int checked); private: uint64_t idx; //std::vector *ephs; //std::vector *sliders; - //public slots: - // void setEndpointHandlers(std::vector *ephs); //signals: //void valueChanged(int value); }; +typedef void (EndpointWidget::*epwMuteFunc)(bool muted); class MainWindow : public QMainWindow { Q_OBJECT From c5eed2774d0d6effaf45b492f097de19ea69acab Mon Sep 17 00:00:00 2001 From: Hane Date: Sat, 12 Aug 2023 19:48:22 +0200 Subject: [PATCH 10/22] fixed overload funcs and connect() --- src/cont/contclasses.cpp | 2 +- src/qt/qtclasses.cpp | 4 ++-- src/qt/qtclasses.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 81e71cb..9df5822 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -111,6 +111,6 @@ void OverseerHandler::setEndpointWidgets(std::vector ews){ } void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ - epwMuteFunc f = &EndpointWidget::updateMuteC; + epwMuteFunc f = &EndpointWidget::updateMute; std::invoke(f, endpointWidgets.at(idx), muted); } diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 1a48c91..082766e 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -71,14 +71,14 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); - connect(muteButton, &QCheckBox::stateChanged, this, &EndpointWidget::updateMute); + connect(muteButton, &QCheckBox::stateChanged, this, (&EndpointWidget::updateMute)); /* * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(osh->getGuid()); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); */ log_debugcpp("ENDPOINT_WIDGETED"); } -void EndpointWidget::updateMuteC(bool muted){ +void EndpointWidget::updateMute(bool muted){ log_debugcpp("cliqui callboqui cloqui"); this->eph->setMute(osh->getGuid(), muted); this->muteButton->setChecked(eph->getMute() ? true : false); diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index d4d1d31..3f2afb9 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -68,7 +68,7 @@ public: QSlider *rightChannelSlider = nullptr; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; - void updateMuteC(bool muted); + void updateMute(bool muted); //void populateEndpointWidget(EndpointHandler *eph); //void setEndpointHandlers(std::vector *ephs); public slots: From 833b417441bf39ac78e609f6cdb410b3d20091e6 Mon Sep 17 00:00:00 2001 From: Hane Date: Sun, 13 Aug 2023 15:25:34 +0200 Subject: [PATCH 11/22] main slider cbk, detected minor l_dcpp bug --- src/back/backfuncs.h | 22 +++++++++++----------- src/back/backlasses.cpp | 8 +++++--- src/back/backlasses.h | 2 +- src/cont/contclasses.cpp | 13 ++++++++++--- src/cont/contclasses.h | 3 ++- src/qt/qtclasses.cpp | 20 +++++++++++++++++--- src/qt/qtclasses.h | 3 +++ 7 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/back/backfuncs.h b/src/back/backfuncs.h index 13f36bc..06adc7e 100644 --- a/src/back/backfuncs.h +++ b/src/back/backfuncs.h @@ -1,4 +1,4 @@ -GUID NGuidToGUID(NGuid* guid){ +GUID NGuidToGUID(NGuid* guid) { GUID msGuid = GUID(); msGuid.Data1 = guid->data1; msGuid.Data2 = guid->data2; @@ -6,12 +6,12 @@ GUID NGuidToGUID(NGuid* guid){ msGuid.Data1 = guid->data1; for (int i = 0; i < 8; i++){ msGuid.Data4[i] = guid->data4[i]; - log_debugcpp("MSGUID DATA4 BYTE " << i << ": "); - log_debugcpp(print_as_binary(8, uint32_t, msGuid.Data4[i])); + //log_debugcpp("MSGUID DATA4 BYTE " << i << ": "); + //log_debugcpp(print_as_binary(8, uint32_t, msGuid.Data4[i])); } - log_debugcpp("MSGUID DATA1: " << msGuid.Data1); - log_debugcpp("MSGUID DATA2: " << msGuid.Data2); - log_debugcpp("MSGUID DATA3: " << msGuid.Data3); + //log_debugcpp("MSGUID DATA1: " << msGuid.Data1); + //log_debugcpp("MSGUID DATA2: " << msGuid.Data2); + //log_debugcpp("MSGUID DATA3: " << msGuid.Data3); return msGuid; } @@ -23,11 +23,11 @@ NGuid GUIDToNGuid(LPGUID msGuid){ guid.data3 = msGuid->Data3; for (int i = 0; i < 8; i++){ guid.data4[i] = msGuid->Data4[i]; - log_debugcpp("GUID DATA4 BYTE " << i << ": "); - log_debugcpp(print_as_binary(8, uint32_t, guid.data4[i])); + //log_debugcpp("GUID DATA4 BYTE " << i << ": "); + //log_debugcpp(print_as_binary(8, uint32_t, guid.data4[i])); } - log_debugcpp("GUID DATA1: " << guid.data1); - log_debugcpp("GUID DATA2: " << guid.data2); - log_debugcpp("GUID DATA3: " << guid.data3); + //log_debugcpp("GUID DATA1: " << guid.data1); + //log_debugcpp("GUID DATA2: " << guid.data2); + //log_debugcpp("GUID DATA3: " << guid.data3); return guid; } diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index b9c54c8..6500e1c 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -48,6 +48,7 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { log_debugcpp("Onnanokotify says Stored: " << guid->data1); log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); + osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); } return S_OK; @@ -116,11 +117,12 @@ bool Endpoint::getMute(){ */ -void Endpoint::setVolume(int channel, float volume) { +void Endpoint::setVolume(NGuid* guid, int channel, float volume) { + GUID tempMsGuid = NGuidToGUID(guid); if (channel == ENDPOINT_MASTER_VOLUME) { - if(FAILED(endpointVolume->SetMasterVolumeLevelScalar(volume, NULL))) { log_debugcpp("si"); }; + if(FAILED(endpointVolume->SetMasterVolumeLevelScalar(volume, &tempMsGuid))) { log_debugcpp("si"); }; } else { - if(FAILED(endpointVolume->SetChannelVolumeLevelScalar(channel, volume, NULL))) { log_debugcpp("si"); }; + if(FAILED(endpointVolume->SetChannelVolumeLevelScalar(channel, volume, &tempMsGuid))) { log_debugcpp("si"); }; } } diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 386344f..8e0b943 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -31,7 +31,7 @@ class Endpoint { Endpoint(IMMDevice* endpoint); uint64_t getIndex(); void setIndex(uint64_t idx); - void setVolume(int channel, float volume); + void setVolume(NGuid* guid, int channel, float volume); /* float getLeftChannelVolume(); */ /* float getRightChannelVolume(); */ float getVolume(int channel); diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 9df5822..12daf2f 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -26,10 +26,10 @@ uint64_t EndpointHandler::getIndex(){ /* * -1 for master volume */ -void EndpointHandler::setValue(int channel, int value){ +void EndpointHandler::setVolume(NGuid* guid, int channel, int value){ if (channel == ENDPOINT_MASTER_VOLUME) - ep->setVolume(channel, (float)value / 100); - else ep->setVolume(channel, (float)value / 100); + ep->setVolume(guid, channel, (float)value / 100); + else ep->setVolume(guid, channel, (float)value / 100); } void EndpointHandler::setMute(NGuid* guid, bool muted){ @@ -114,3 +114,10 @@ void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ epwMuteFunc f = &EndpointWidget::updateMute; std::invoke(f, endpointWidgets.at(idx), muted); } + +void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ + //int translatedNewVal = newVal * 100; + log_debugcpp("mainvolcallback float: " << newVal); + epwMainVolumeFunc f = &EndpointWidget::updateMainVolume; + std::invoke(f, endpointWidgets.at(idx), newVal); +} diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 16cab7c..0c4d279 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -36,7 +36,7 @@ public: float getVolume(int channel); bool getMute(); - void setValue(int channel, int value); + void setVolume(NGuid* guid, int channel, int value); void setMute(NGuid* guid, bool muted); ~EndpointHandler(); private: @@ -61,6 +61,7 @@ public: void reloadEndpointHandlers(); NGuid* getGuid(); void updateMuteCallback(uint64_t idx, bool muted); + void updateMainVolumeCallback(uint64_t idx, float newVal); //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); //static Overseer* getOverseer(); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 082766e..e1508fa 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -68,9 +68,9 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); - connect(mainSlider, &QSlider::valueChanged, [this](int newValue){this->eph->setValue(ENDPOINT_MASTER_VOLUME, newValue); }); - connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); - connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setValue(ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); + connect(mainSlider, &QSlider::valueChanged, this,&EndpointWidget::updateMainVolume); + connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); + connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); connect(muteButton, &QCheckBox::stateChanged, this, (&EndpointWidget::updateMute)); /* * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(osh->getGuid()); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); @@ -94,6 +94,20 @@ void EndpointWidget::updateMute(int checked){ this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); } +void EndpointWidget::updateMainVolume(int newValue){ + log_debugcpp("updateMainVolume slot"); + this->eph->setVolume(osh->getGuid(), ENDPOINT_MASTER_VOLUME, newValue); +} + + +void EndpointWidget::updateMainVolume(float newValue){ + int newVal = newValue * 100; + if(this->mainSlider->value() != newVal) { + this->mainSlider->setValue(newVal); + } +} + + void EndpointWidget::setIndex(uint64_t idx){ this->idx = idx; } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 3f2afb9..4ad1567 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -68,10 +68,12 @@ public: QSlider *rightChannelSlider = nullptr; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; + void updateMainVolume(float newValue); void updateMute(bool muted); //void populateEndpointWidget(EndpointHandler *eph); //void setEndpointHandlers(std::vector *ephs); public slots: + void updateMainVolume(int newValue); void updateMute(int checked); private: @@ -86,6 +88,7 @@ private: }; typedef void (EndpointWidget::*epwMuteFunc)(bool muted); +typedef void (EndpointWidget::*epwMainVolumeFunc)(float newValue); class MainWindow : public QMainWindow { Q_OBJECT From 312de5ce2ccb4327bfb04929b482732ce3d8237e Mon Sep 17 00:00:00 2001 From: Hane Date: Sun, 13 Aug 2023 17:43:09 +0200 Subject: [PATCH 12/22] channels added to front programmatically --- src/back/backlasses.cpp | 15 +++++--- src/back/backlasses.h | 6 ++-- src/cont/contclasses.cpp | 4 +++ src/cont/contclasses.h | 2 ++ src/qt/qtclasses.cpp | 78 +++++++++++++++++++++++++++------------- src/qt/qtclasses.h | 8 +++-- 6 files changed, 78 insertions(+), 35 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 6500e1c..5f643f8 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -58,9 +58,11 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { * PAUDIO_VOLUME_NOTIFICATION_DATA->Release(); * } */ -Endpoint::Endpoint(IMMDevice* ep){ +Endpoint::Endpoint(IMMDevice* ep, uint64_t idx){ this->endpoint = ep; + this->idx = idx; if(FAILED(endpoint->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&endpointVolume))) { log_debugcpp("si"); }; + if (FAILED(endpointVolume->GetChannelCount(&channelCount))) log_debugcpp("get channel count fail"); //Obtaining friendly name: IPropertyStore creates PROPVARIANT per field // hr = endpointPtr->GetId(&endpointID); endpoint->OpenPropertyStore(STGM_READ, &properties); @@ -92,6 +94,10 @@ float Endpoint::getVolume(int channel){ return volume; } +uint32_t Endpoint::getChannelCount(){ + return (uint32_t)channelCount; +} + bool Endpoint::getMute(){ BOOL mut; @@ -122,6 +128,7 @@ void Endpoint::setVolume(NGuid* guid, int channel, float volume) { if (channel == ENDPOINT_MASTER_VOLUME) { if(FAILED(endpointVolume->SetMasterVolumeLevelScalar(volume, &tempMsGuid))) { log_debugcpp("si"); }; } else { + log_debugcpp("channel being updated: " << channel); if(FAILED(endpointVolume->SetChannelVolumeLevelScalar(channel, volume, &tempMsGuid))) { log_debugcpp("si"); }; } } @@ -165,9 +172,7 @@ void Overseer::initCOMLibrary() { GUID tempGuid; if(FAILED(CoCreateGuid(&tempGuid))) { log_debugcpp("Failed to obtain GUID: " ); }; - this->guid = GUIDToNGuid(&tempGuid); - //TODO: Release lpguid? //TODO: Uninitialize COM } @@ -188,8 +193,8 @@ void Overseer::reloadEndpoints() { for (unsigned int i = 0; i < numPlaybackEndpoints; i++){ IMMDevice *temp; if(deviceCollection->Item(i, &temp) != 0) { log_debugcpp("si"); }; - Endpoint *endpoint = new Endpoint(temp); - endpoint->setIndex(i); + Endpoint *endpoint = new Endpoint(temp, i); + //endpoint->setIndex(i); this->playbackDevices.push_back(endpoint); //TODO: le porblemx std::cout << "ola" << std::endl; } diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 8e0b943..0e816a8 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -28,12 +28,11 @@ class EndpointCallback; class Endpoint { public: - Endpoint(IMMDevice* endpoint); + Endpoint(IMMDevice* endpoint, uint64_t idx); uint64_t getIndex(); void setIndex(uint64_t idx); void setVolume(NGuid* guid, int channel, float volume); - /* float getLeftChannelVolume(); */ - /* float getRightChannelVolume(); */ + uint32_t getChannelCount(); float getVolume(int channel); void setMute(NGuid* guid, bool muted); bool getMute(); @@ -43,6 +42,7 @@ class Endpoint { ~Endpoint(); private: + uint32_t channelCount; IMMDevice* endpoint; IAudioEndpointVolume *endpointVolume ; IPropertyStore *properties; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 12daf2f..86820c8 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -14,6 +14,10 @@ EndpointHandler::EndpointHandler(uint64_t idx) { ep->setCallback(epc); } +uint32_t EndpointHandler::getChannelCount(){ + return ep->getChannelCount(); +} + void EndpointHandler::setIndex(uint64_t idx){ this->idx = idx; } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 0c4d279..f41549f 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -28,6 +28,8 @@ public: EndpointCallback *epc = nullptr; //std::wstring epName; + uint32_t getChannelCount(); + void setIndex(uint64_t idx); uint64_t getIndex(); void setVolume(int channel, float volume); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index e1508fa..d58d7e9 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -25,11 +25,11 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( muteButton = new QCheckBox(); mainLabel = new QLabel(QString::fromStdWString(eph->getName())); - leftChannelLabel = new QLabel("88"); - rightChannelLabel = new QLabel("77"); + //leftChannelLabel = new QLabel("88"); + //rightChannelLabel = new QLabel("77"); mainSlider = new QSlider(Qt::Horizontal); - leftChannelSlider = new QSlider(Qt::Horizontal); - rightChannelSlider = new QSlider(Qt::Horizontal); + //leftChannelSlider = new QSlider(Qt::Horizontal); + //rightChannelSlider = new QSlider(Qt::Horizontal); //muteButton->setStyleSheet("background-color: #A3C1DA; color: red"); mainSlider->setFocusPolicy(Qt::StrongFocus); @@ -37,23 +37,29 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( mainSlider->setTickInterval(5); mainSlider->setSingleStep(1); mainSlider->setRange(0,100); - leftChannelSlider->setTickInterval(5); - leftChannelSlider->setSingleStep(1); - leftChannelSlider->setRange(0,100); - rightChannelSlider->setTickInterval(5); - rightChannelSlider->setSingleStep(1); - rightChannelSlider->setRange(0,100); + + /* + * leftChannelSlider->setTickInterval(5); + * leftChannelSlider->setSingleStep(1); + * leftChannelSlider->setRange(0,100); + * rightChannelSlider->setTickInterval(5); + * rightChannelSlider->setSingleStep(1); + * rightChannelSlider->setRange(0,100); + */ muteButton->setCheckState((eph->getMute() == false ? Qt::Unchecked : Qt::Checked)); muteButton->setText(eph->getMute() ? STRING_UNMUTE : STRING_MUTE); float volume = eph->getVolume(ENDPOINT_MASTER_VOLUME) * 100; mainSlider->setValue((int)volume); volume = eph->getVolume(ENDPOINT_LEFT_CHANNEL_VOLUME) * 100; - leftChannelSlider->setValue((int)volume); - leftChannelLabel->setText(QString::number(volume)); - volume = eph->getVolume(ENDPOINT_RIGHT_CHANNEL_VOLUME) * 100; - rightChannelSlider->setValue((int)volume); - rightChannelLabel->setText(QString::number(volume)); + + /* + * leftChannelSlider->setValue((int)volume); + * leftChannelLabel->setText(QString::number(volume)); + * volume = eph->getVolume(ENDPOINT_RIGHT_CHANNEL_VOLUME) * 100; + * rightChannelSlider->setValue((int)volume); + * rightChannelLabel->setText(QString::number(volume)); + */ log_debugcpp("ENDPOINT SET WITH VOLUME " << volume); mainMuteLayout = new QGridLayout(); @@ -61,20 +67,42 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( mainMuteLayout->addWidget(mainLabel, 0, 0); mainMuteLayout->addWidget(muteButton, 0, 1); layout->addWidget(mainSlider, 0, 1); - layout->addWidget(leftChannelSlider, 1, 0); - layout->addWidget(leftChannelLabel, 2, 0); - layout->addWidget(rightChannelSlider, 1, 1); - layout->addWidget(rightChannelLabel, 2, 1); - layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); - layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); + + /* + * layout->addWidget(leftChannelSlider, 1, 0); + * layout->addWidget(leftChannelLabel, 2, 0); + * layout->addWidget(rightChannelSlider, 1, 1); + * layout->addWidget(rightChannelLabel, 2, 1); + */ + /* + * layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); + * layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); + */ connect(mainSlider, &QSlider::valueChanged, this,&EndpointWidget::updateMainVolume); - connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); - connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); - connect(muteButton, &QCheckBox::stateChanged, this, (&EndpointWidget::updateMute)); /* - * connect(muteButton, &QPushButton::clicked, [this](bool clicked){ log_debugcpp("cliqui" << clicked << "cloqui"); this->eph->setMute(osh->getGuid()); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); }); + * connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); + * connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); */ + connect(muteButton, &QCheckBox::stateChanged, this, (&EndpointWidget::updateMute)); + + for(uint32_t i = 0; i < eph->getChannelCount(); i++){ + QSlider* tmp = new QSlider(Qt::Horizontal); + QLabel* tmpLb = new QLabel(""); + tmp->setTickInterval(5); + tmp->setSingleStep(1); + tmp->setRange(0,100); + volume = eph->getVolume(i) * 100; + tmp->setValue((int) volume); + tmpLb->setText(QString::number(volume)); + this->channelSliders.push_back(tmp); + this->channelLabels.push_back(tmpLb); + layout->addWidget(tmp, 1, i); + layout->addWidget(tmpLb, 2, i); + connect(tmp, &QSlider::valueChanged, [this, i](int newValue){ this->eph->setVolume(osh->getGuid(), i, newValue); this->channelLabels.at(i)->setText(QString::number(newValue)); }); + } + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); log_debugcpp("ENDPOINT_WIDGETED"); } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 4ad1567..aa134fb 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -64,8 +64,12 @@ public: QCheckBox *muteButton = nullptr; QLabel *mainLabel = nullptr, *leftChannelLabel = nullptr, *rightChannelLabel = nullptr; QSlider *mainSlider = nullptr; - QSlider *leftChannelSlider = nullptr; - QSlider *rightChannelSlider = nullptr; + std::vector channelSliders; + std::vector channelLabels; + /* + * QSlider *leftChannelSlider = nullptr; + * QSlider *rightChannelSlider = nullptr; + */ QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; void updateMainVolume(float newValue); From b4401dd98436b6179327f75352027926914ef343 Mon Sep 17 00:00:00 2001 From: Hane Date: Sun, 13 Aug 2023 18:29:24 +0200 Subject: [PATCH 13/22] wip channel callback --- src/back/backlasses.cpp | 4 ++++ src/cont/contclasses.cpp | 7 ++++++ src/cont/contclasses.h | 1 + src/global.h | 5 ++-- src/qt/qtclasses.cpp | 50 ++++++++-------------------------------- src/qt/qtclasses.h | 8 +++---- 6 files changed, 28 insertions(+), 47 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 5f643f8..928750e 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -49,6 +49,10 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); + log_debugcpp("Onnanokotify says Reported Channel Qty: " << eventData.nChannels); + for(UINT i = 0; i < eventData.nChannels; i++) { + osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)i, eventData.afChannelVolumes[i]); + } } return S_OK; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 86820c8..304547d 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -125,3 +125,10 @@ void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ epwMainVolumeFunc f = &EndpointWidget::updateMainVolume; std::invoke(f, endpointWidgets.at(idx), newVal); } + +void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ + //int translatedNewVal = newVal * 100; + log_debugcpp("chanel: " << channel << " volcallback float: " << newVal); + epwChannelVolumeFunc f = &EndpointWidget::updateChannelVolume; + std::invoke(f, endpointWidgets.at(idx), channel, newVal); +} diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index f41549f..59dd035 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -64,6 +64,7 @@ public: NGuid* getGuid(); void updateMuteCallback(uint64_t idx, bool muted); void updateMainVolumeCallback(uint64_t idx, float newVal); + void updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal); //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); //static Overseer* getOverseer(); diff --git a/src/global.h b/src/global.h index eaf2968..c4cf2af 100644 --- a/src/global.h +++ b/src/global.h @@ -7,10 +7,9 @@ #include "debug.h" -//TODO enum capullo #define ENDPOINT_MASTER_VOLUME -1 -#define ENDPOINT_LEFT_CHANNEL_VOLUME 0 -#define ENDPOINT_RIGHT_CHANNEL_VOLUME 1 +/* #define ENDPOINT_LEFT_CHANNEL_VOLUME 0 */ +/* #define ENDPOINT_RIGHT_CHANNEL_VOLUME 1 */ #define STRING_MUTE "Mute" #define STRING_UNMUTE "Unmute" diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index d58d7e9..79da832 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -25,41 +25,19 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( muteButton = new QCheckBox(); mainLabel = new QLabel(QString::fromStdWString(eph->getName())); - //leftChannelLabel = new QLabel("88"); - //rightChannelLabel = new QLabel("77"); mainSlider = new QSlider(Qt::Horizontal); - //leftChannelSlider = new QSlider(Qt::Horizontal); - //rightChannelSlider = new QSlider(Qt::Horizontal); - + //muteButton->setStyleSheet("background-color: #A3C1DA; color: red"); mainSlider->setFocusPolicy(Qt::StrongFocus); mainSlider->setTickPosition(QSlider::TicksBothSides); mainSlider->setTickInterval(5); mainSlider->setSingleStep(1); mainSlider->setRange(0,100); - - /* - * leftChannelSlider->setTickInterval(5); - * leftChannelSlider->setSingleStep(1); - * leftChannelSlider->setRange(0,100); - * rightChannelSlider->setTickInterval(5); - * rightChannelSlider->setSingleStep(1); - * rightChannelSlider->setRange(0,100); - */ muteButton->setCheckState((eph->getMute() == false ? Qt::Unchecked : Qt::Checked)); muteButton->setText(eph->getMute() ? STRING_UNMUTE : STRING_MUTE); float volume = eph->getVolume(ENDPOINT_MASTER_VOLUME) * 100; mainSlider->setValue((int)volume); - volume = eph->getVolume(ENDPOINT_LEFT_CHANNEL_VOLUME) * 100; - - /* - * leftChannelSlider->setValue((int)volume); - * leftChannelLabel->setText(QString::number(volume)); - * volume = eph->getVolume(ENDPOINT_RIGHT_CHANNEL_VOLUME) * 100; - * rightChannelSlider->setValue((int)volume); - * rightChannelLabel->setText(QString::number(volume)); - */ log_debugcpp("ENDPOINT SET WITH VOLUME " << volume); mainMuteLayout = new QGridLayout(); @@ -68,24 +46,9 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( mainMuteLayout->addWidget(muteButton, 0, 1); layout->addWidget(mainSlider, 0, 1); - /* - * layout->addWidget(leftChannelSlider, 1, 0); - * layout->addWidget(leftChannelLabel, 2, 0); - * layout->addWidget(rightChannelSlider, 1, 1); - * layout->addWidget(rightChannelLabel, 2, 1); - */ - /* - * layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); - * layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); - */ - connect(mainSlider, &QSlider::valueChanged, this,&EndpointWidget::updateMainVolume); - /* - * connect(leftChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_LEFT_CHANNEL_VOLUME, newValue); this->leftChannelLabel->setText(QString::number(newValue)); }); - * connect(rightChannelSlider, &QSlider::valueChanged, [this](int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_RIGHT_CHANNEL_VOLUME, newValue); this->rightChannelLabel->setText(QString::number(newValue)); }); - */ connect(muteButton, &QCheckBox::stateChanged, this, (&EndpointWidget::updateMute)); - + for(uint32_t i = 0; i < eph->getChannelCount(); i++){ QSlider* tmp = new QSlider(Qt::Horizontal); QLabel* tmpLb = new QLabel(""); @@ -101,6 +64,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( layout->addWidget(tmpLb, 2, i); connect(tmp, &QSlider::valueChanged, [this, i](int newValue){ this->eph->setVolume(osh->getGuid(), i, newValue); this->channelLabels.at(i)->setText(QString::number(newValue)); }); } + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 0); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 3, 1); log_debugcpp("ENDPOINT_WIDGETED"); @@ -127,7 +91,6 @@ void EndpointWidget::updateMainVolume(int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_MASTER_VOLUME, newValue); } - void EndpointWidget::updateMainVolume(float newValue){ int newVal = newValue * 100; if(this->mainSlider->value() != newVal) { @@ -135,6 +98,13 @@ void EndpointWidget::updateMainVolume(float newValue){ } } +void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ + int newVal = newValue * 100; + if(this->channelSliders.at(channel)->value() != newVal) { + this->channelSliders.at(channel)->setValue(newVal); + this->channelLabels.at(channel)->setText(QString::number((int)(newValue * 100))); + } +} void EndpointWidget::setIndex(uint64_t idx){ this->idx = idx; diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index aa134fb..79acc74 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -66,16 +66,15 @@ public: QSlider *mainSlider = nullptr; std::vector channelSliders; std::vector channelLabels; - /* - * QSlider *leftChannelSlider = nullptr; - * QSlider *rightChannelSlider = nullptr; - */ QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; void updateMainVolume(float newValue); + void updateChannelVolume(uint32_t channel, float newValue); void updateMute(bool muted); + //void populateEndpointWidget(EndpointHandler *eph); //void setEndpointHandlers(std::vector *ephs); + public slots: void updateMainVolume(int newValue); void updateMute(int checked); @@ -93,6 +92,7 @@ private: typedef void (EndpointWidget::*epwMuteFunc)(bool muted); typedef void (EndpointWidget::*epwMainVolumeFunc)(float newValue); +typedef void (EndpointWidget::*epwChannelVolumeFunc)(uint32_t channel, float newValue); class MainWindow : public QMainWindow { Q_OBJECT From 67626a34e4ec52862d66dc49d51cae969873f7e9 Mon Sep 17 00:00:00 2001 From: Hane Date: Sun, 13 Aug 2023 18:31:34 +0200 Subject: [PATCH 14/22] forgot todo --- src/qt/qtclasses.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 79da832..cdcb988 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -62,6 +62,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( this->channelLabels.push_back(tmpLb); layout->addWidget(tmp, 1, i); layout->addWidget(tmpLb, 2, i); + //TODO: check if there's a need to prevent deadlocks; probably this will eventually turn into its own func connect(tmp, &QSlider::valueChanged, [this, i](int newValue){ this->eph->setVolume(osh->getGuid(), i, newValue); this->channelLabels.at(i)->setText(QString::number(newValue)); }); } From bea0a2af94650ad99ba37e94c2aefd6c8cae7d61 Mon Sep 17 00:00:00 2001 From: Hane Date: Mon, 14 Aug 2023 16:10:35 +0200 Subject: [PATCH 15/22] broken: play dj outside, get it stuck --- src/back/backlasses.cpp | 30 ++++++++++++++++++++++-------- src/cont/contclasses.cpp | 10 +++++++++- src/cont/contclasses.h | 3 ++- src/qt/qtclasses.cpp | 24 ++++++++++++++++++++++-- src/qt/qtclasses.h | 3 +++ 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 928750e..5051b22 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -38,8 +38,16 @@ HRESULT EndpointCallback::QueryInterface(REFIID riid, VOID **ppvInterface) { HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { if (pNotify == NULL) return E_INVALIDARG; - + + float extraChannelVol[pNotify->nChannels]; + bool multiChannel = false; AUDIO_VOLUME_NOTIFICATION_DATA eventData = *pNotify; + if(pNotify->nChannels > 1) { + multiChannel = true; + for (UINT i = 0; i < pNotify->nChannels; i++){ + extraChannelVol[i] = pNotify->afChannelVolumes[i]; + } + } NGuid* guid = osh->getGuid(); if (memcmp(guid, &eventData, sizeof(*guid)) == 0) { @@ -47,12 +55,18 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { } else { log_debugcpp("Onnanokotify says Stored: " << guid->data1); log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); + osh->toggleFrontEvents(this->ep->getIndex(), false); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); log_debugcpp("Onnanokotify says Reported Channel Qty: " << eventData.nChannels); - for(UINT i = 0; i < eventData.nChannels; i++) { - osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)i, eventData.afChannelVolumes[i]); - } + + if(multiChannel) + for(UINT i = 0; i < eventData.nChannels; i++) { + osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)i, extraChannelVol[i]); + } + else + osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)0, pNotify->afChannelVolumes[0]); + osh->toggleFrontEvents(this->ep->getIndex(), true); } return S_OK; @@ -130,10 +144,10 @@ bool Endpoint::getMute(){ void Endpoint::setVolume(NGuid* guid, int channel, float volume) { GUID tempMsGuid = NGuidToGUID(guid); if (channel == ENDPOINT_MASTER_VOLUME) { - if(FAILED(endpointVolume->SetMasterVolumeLevelScalar(volume, &tempMsGuid))) { log_debugcpp("si"); }; + if(FAILED(endpointVolume->SetMasterVolumeLevelScalar(volume, &tempMsGuid))) { log_debugcpp("MASTER VOLUME FAILED"); }; } else { - log_debugcpp("channel being updated: " << channel); - if(FAILED(endpointVolume->SetChannelVolumeLevelScalar(channel, volume, &tempMsGuid))) { log_debugcpp("si"); }; + log_debugcpp("Channel being updated: " << channel); + if(FAILED(endpointVolume->SetChannelVolumeLevelScalar(channel, volume, &tempMsGuid))) { log_debugcpp("CHANNEL "<< channel <<" VOLUME FAILED"); }; } } @@ -144,7 +158,7 @@ void Endpoint::setMute(NGuid* guid, bool muted) { //log_debugcpp("translate to BOOL as " << mut); //TODO: use new funcs GUID tempMsGuid = NGuidToGUID(guid); - if(FAILED(endpointVolume->SetMute(muted, &tempMsGuid))) { log_debugcpp("si"); }; + if(FAILED(endpointVolume->SetMute(muted, &tempMsGuid))) { log_debugcpp("MUTE FAILED"); }; } void Endpoint::setCallback(EndpointCallback *epc){ diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 304547d..fb7a6c3 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -100,7 +100,6 @@ void OverseerHandler::reloadEndpointHandlers(){ //setEndpointHandlers(ephs); } - NGuid* OverseerHandler::getGuid() { return this->os.getGuid(); } @@ -128,7 +127,16 @@ void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ //int translatedNewVal = newVal * 100; + log_debugcpp("chanel: " << channel << " volcallback float: " << newVal); epwChannelVolumeFunc f = &EndpointWidget::updateChannelVolume; std::invoke(f, endpointWidgets.at(idx), channel, newVal); + + //TODO: Soy retrasado + //endpointWidgets.at(idx)->updateChannelVolume(channel, newVal); +} + +void OverseerHandler::toggleFrontEvents(uint64_t idx, bool active) { + epwToggleFrontFunc f = &EndpointWidget::toggleFrontEvents; + std::invoke(f, endpointWidgets.at(idx), active); } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 59dd035..da58587 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -40,6 +40,7 @@ public: void setVolume(NGuid* guid, int channel, int value); void setMute(NGuid* guid, bool muted); + ~EndpointHandler(); private: uint64_t idx; @@ -65,7 +66,7 @@ public: void updateMuteCallback(uint64_t idx, bool muted); void updateMainVolumeCallback(uint64_t idx, float newVal); void updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal); - + void toggleFrontEvents(uint64_t idx, bool active); //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); //static Overseer* getOverseer(); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index cdcb988..f6e01b4 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -73,9 +73,12 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( void EndpointWidget::updateMute(bool muted){ log_debugcpp("cliqui callboqui cloqui"); + //TODO: Here to diagnose slider visuals locking when playing DJ with external volume bar. Functionality is restored when mute checkbox is clicked. + //this->muteButton->blockSignals(true); this->eph->setMute(osh->getGuid(), muted); this->muteButton->setChecked(eph->getMute() ? true : false); - this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); + this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); + //this->muteButton->blockSignals(false); } void EndpointWidget::updateMute(int checked){ @@ -88,25 +91,42 @@ void EndpointWidget::updateMute(int checked){ } void EndpointWidget::updateMainVolume(int newValue){ - log_debugcpp("updateMainVolume slot"); + log_debugcpp("updateMainVolume slot."); this->eph->setVolume(osh->getGuid(), ENDPOINT_MASTER_VOLUME, newValue); } void EndpointWidget::updateMainVolume(float newValue){ int newVal = newValue * 100; + log_debugcpp("mainvolcallback int: " << newVal); + //this->mainSlider->blockSignals(true); + //TODO: Above if(this->mainSlider->value() != newVal) { this->mainSlider->setValue(newVal); } + //this->mainSlider->blockSignals(false); } void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ int newVal = newValue * 100; + log_debugcpp("chanel: " << channel << " volcallback int: " << newVal); + //TODO: Above + //this->channelSliders.at(channel)->blockSignals(true); if(this->channelSliders.at(channel)->value() != newVal) { this->channelSliders.at(channel)->setValue(newVal); this->channelLabels.at(channel)->setText(QString::number((int)(newValue * 100))); } + //this->channelSliders.at(channel)->blockSignals(false); } +void EndpointWidget::toggleFrontEvents(bool active){ + this->muteButton->blockSignals(active); + this->mainSlider->blockSignals(active); + for(uint32_t i = 0; i < this->channelSliders.size(); i++){ + this->channelSliders.at(i)->blockSignals(active); + } +} + + void EndpointWidget::setIndex(uint64_t idx){ this->idx = idx; } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 79acc74..21bdf0d 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -71,6 +71,7 @@ public: void updateMainVolume(float newValue); void updateChannelVolume(uint32_t channel, float newValue); void updateMute(bool muted); + void toggleFrontEvents(bool active); //void populateEndpointWidget(EndpointHandler *eph); //void setEndpointHandlers(std::vector *ephs); @@ -93,6 +94,8 @@ private: typedef void (EndpointWidget::*epwMuteFunc)(bool muted); typedef void (EndpointWidget::*epwMainVolumeFunc)(float newValue); typedef void (EndpointWidget::*epwChannelVolumeFunc)(uint32_t channel, float newValue); +typedef void (EndpointWidget::*epwToggleFrontFunc)(bool active); + class MainWindow : public QMainWindow { Q_OBJECT From 4f900ad4259c78162df33a069c6cb8ad230673e1 Mon Sep 17 00:00:00 2001 From: Hane Date: Mon, 14 Aug 2023 16:24:07 +0200 Subject: [PATCH 16/22] broken: fixed event toggling order --- src/back/backlasses.cpp | 4 ++-- src/cont/contclasses.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 5051b22..5030f11 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -55,7 +55,7 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { } else { log_debugcpp("Onnanokotify says Stored: " << guid->data1); log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); - osh->toggleFrontEvents(this->ep->getIndex(), false); + osh->toggleFrontEvents(this->ep->getIndex(), true); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); log_debugcpp("Onnanokotify says Reported Channel Qty: " << eventData.nChannels); @@ -66,7 +66,7 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { } else osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)0, pNotify->afChannelVolumes[0]); - osh->toggleFrontEvents(this->ep->getIndex(), true); + osh->toggleFrontEvents(this->ep->getIndex(), false); } return S_OK; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index fb7a6c3..b7db7dc 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -128,9 +128,11 @@ void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ //int translatedNewVal = newVal * 100; + log_debugcpp("chanel: " << channel << " volcallback float: " << newVal); epwChannelVolumeFunc f = &EndpointWidget::updateChannelVolume; std::invoke(f, endpointWidgets.at(idx), channel, newVal); + //TODO: Soy retrasado //endpointWidgets.at(idx)->updateChannelVolume(channel, newVal); From 01d2611d65089430aa7ae9ba5a0cda99af94b7b9 Mon Sep 17 00:00:00 2001 From: Hane Date: Mon, 14 Aug 2023 18:00:59 +0200 Subject: [PATCH 17/22] added pdb generation, fixed unintended back call --- qtest.pro | 6 +++--- src/cont/contclasses.cpp | 4 +--- src/qt/qtclasses.cpp | 2 +- src/qt/qtclasses.h | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/qtest.pro b/qtest.pro index d2ac80f..511e78a 100644 --- a/qtest.pro +++ b/qtest.pro @@ -1,6 +1,6 @@ -QMAKE_CXXFLAGS += --target=x86_64-w64-mingw32 -QMAKE_LINKER += clang++ -QMAKE_LFLAGS += -v +QMAKE_CXXFLAGS += --target=x86_64-w64-mingw32 -g -gcodeview +#QMAKE_LINK += clang++ +QMAKE_LFLAGS += --target=x86_64-w64-mingw32 -g -gcodeview -Wl,-pdb= -v DEFINES += DEBUG CONFIG += debug console QT += widgets diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index b7db7dc..7bca344 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -127,12 +127,10 @@ void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ //int translatedNewVal = newVal * 100; - - + log_debugcpp("chanel: " << channel << " volcallback float: " << newVal); epwChannelVolumeFunc f = &EndpointWidget::updateChannelVolume; std::invoke(f, endpointWidgets.at(idx), channel, newVal); - //TODO: Soy retrasado //endpointWidgets.at(idx)->updateChannelVolume(channel, newVal); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index f6e01b4..a5d0b8a 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -75,7 +75,7 @@ void EndpointWidget::updateMute(bool muted){ log_debugcpp("cliqui callboqui cloqui"); //TODO: Here to diagnose slider visuals locking when playing DJ with external volume bar. Functionality is restored when mute checkbox is clicked. //this->muteButton->blockSignals(true); - this->eph->setMute(osh->getGuid(), muted); + //this->eph->setMute(osh->getGuid(), muted); this->muteButton->setChecked(eph->getMute() ? true : false); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); //this->muteButton->blockSignals(false); diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 21bdf0d..dc1a82a 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -96,7 +96,6 @@ typedef void (EndpointWidget::*epwMainVolumeFunc)(float newValue); typedef void (EndpointWidget::*epwChannelVolumeFunc)(uint32_t channel, float newValue); typedef void (EndpointWidget::*epwToggleFrontFunc)(bool active); - class MainWindow : public QMainWindow { Q_OBJECT //QWidget *centralWidget; From e5eb0878a61c8b5852b3f123cec6337cef8c5736 Mon Sep 17 00:00:00 2001 From: Hane Date: Mon, 14 Aug 2023 18:23:49 +0200 Subject: [PATCH 18/22] changed invoke instances with call-to-mem-fun macro --- src/cont/contclasses.cpp | 13 ++++++++----- src/cont/contclasses.h | 2 ++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 7bca344..8281bb8 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -115,14 +115,16 @@ void OverseerHandler::setEndpointWidgets(std::vector ews){ void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ epwMuteFunc f = &EndpointWidget::updateMute; - std::invoke(f, endpointWidgets.at(idx), muted); + pinvoke_mem_fn(endpointWidgets.at(idx),f)(muted); + //std::invoke(f, endpointWidgets.at(idx), muted); } void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ //int translatedNewVal = newVal * 100; log_debugcpp("mainvolcallback float: " << newVal); epwMainVolumeFunc f = &EndpointWidget::updateMainVolume; - std::invoke(f, endpointWidgets.at(idx), newVal); + pinvoke_mem_fn(endpointWidgets.at(idx),f)(newVal); + //std::invoke(f, endpointWidgets.at(idx), newVal); } void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ @@ -130,13 +132,14 @@ void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel log_debugcpp("chanel: " << channel << " volcallback float: " << newVal); epwChannelVolumeFunc f = &EndpointWidget::updateChannelVolume; - std::invoke(f, endpointWidgets.at(idx), channel, newVal); - + //std::invoke(f, endpointWidgets.at(idx), channel, newVal); + pinvoke_mem_fn(endpointWidgets.at(idx),f)(channel, newVal); //TODO: Soy retrasado //endpointWidgets.at(idx)->updateChannelVolume(channel, newVal); } void OverseerHandler::toggleFrontEvents(uint64_t idx, bool active) { epwToggleFrontFunc f = &EndpointWidget::toggleFrontEvents; - std::invoke(f, endpointWidgets.at(idx), active); + pinvoke_mem_fn(endpointWidgets.at(idx),f)(active); + //std::invoke(f, , active); } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index da58587..5714a79 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -1,4 +1,6 @@ #pragma once +#define invoke_mem_fn(object,ptrToMember) ((object).*(ptrToMember)) +#define pinvoke_mem_fn(object,ptrToMember) ((object)->*(ptrToMember)) /* #ifndef QTBLESSED */ /* //#define Q_OBJECT */ From c435fcfa076dfbf3d3205062dfca9d8bd7935043 Mon Sep 17 00:00:00 2001 From: Phireh Date: Mon, 14 Aug 2023 20:10:59 +0200 Subject: [PATCH 19/22] Remove frontend header from contclasses --- src/back/backlasses.cpp | 2 -- src/cont/contclasses.cpp | 44 ++++++++++++++++------------------------ src/cont/contclasses.h | 16 ++++++++++----- src/qt/qtclasses.cpp | 39 ++++++++++++++++++++++++++--------- src/qt/qtclasses.h | 1 + 5 files changed, 58 insertions(+), 44 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 5030f11..32c7940 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -55,7 +55,6 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { } else { log_debugcpp("Onnanokotify says Stored: " << guid->data1); log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); - osh->toggleFrontEvents(this->ep->getIndex(), true); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); log_debugcpp("Onnanokotify says Reported Channel Qty: " << eventData.nChannels); @@ -66,7 +65,6 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { } else osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)0, pNotify->afChannelVolumes[0]); - osh->toggleFrontEvents(this->ep->getIndex(), false); } return S_OK; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 8281bb8..36b913d 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -1,5 +1,4 @@ #include "backlasses.h" -#include "qtclasses.h" #include "contclasses.h" //TODO: pragma once @@ -64,12 +63,6 @@ std::vector OverseerHandler::getPlaybackEndpoints() { return this->os.getPlaybackEndpoints(); } -/* - * Overseer* OverseerHandler::getOverseer(){ - * return &os; - * } - */ - std::vector OverseerHandler::getEndpointHandlers(){ return endpointHandlers; @@ -114,32 +107,29 @@ void OverseerHandler::setEndpointWidgets(std::vector ews){ } void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ - epwMuteFunc f = &EndpointWidget::updateMute; - pinvoke_mem_fn(endpointWidgets.at(idx),f)(muted); - //std::invoke(f, endpointWidgets.at(idx), muted); + updateFrontMuteCallback(idx, muted); } void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ - //int translatedNewVal = newVal * 100; log_debugcpp("mainvolcallback float: " << newVal); - epwMainVolumeFunc f = &EndpointWidget::updateMainVolume; - pinvoke_mem_fn(endpointWidgets.at(idx),f)(newVal); - //std::invoke(f, endpointWidgets.at(idx), newVal); + updateFrontVolumeCallback(idx, AudioChannel::CHANNEL_MAIN, newVal); +} + +void OverseerHandler::setFrontVolumeCallback(std::function f) { + this->updateFrontVolumeCallback = f; +} + +void OverseerHandler::setFrontMuteCallback(std::function f) { + this->updateFrontMuteCallback = f; } void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ - //int translatedNewVal = newVal * 100; + log_debugcpp("channel: " << channel << " volcallback float: " << newVal); - log_debugcpp("chanel: " << channel << " volcallback float: " << newVal); - epwChannelVolumeFunc f = &EndpointWidget::updateChannelVolume; - //std::invoke(f, endpointWidgets.at(idx), channel, newVal); - pinvoke_mem_fn(endpointWidgets.at(idx),f)(channel, newVal); - //TODO: Soy retrasado - //endpointWidgets.at(idx)->updateChannelVolume(channel, newVal); -} - -void OverseerHandler::toggleFrontEvents(uint64_t idx, bool active) { - epwToggleFrontFunc f = &EndpointWidget::toggleFrontEvents; - pinvoke_mem_fn(endpointWidgets.at(idx),f)(active); - //std::invoke(f, , active); + // convert channel to bitmask + int i = 0; + while (i++); + uint32_t mask = (1 << i); + + updateFrontVolumeCallback(idx, mask, newVal); } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 5714a79..bb47131 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -9,11 +9,16 @@ /* #endif */ class EndpointWidget; - class Endpoint; class EndpointCallback; class Overseer; +enum AudioChannel { + CHANNEL_LEFT = (1 << 0), + CHANNEL_RIGHT = (1 << 1), + CHANNEL_MAIN = ~0, +}; + struct NGuid { uint32_t data1; uint16_t data2; @@ -66,14 +71,15 @@ public: void reloadEndpointHandlers(); NGuid* getGuid(); void updateMuteCallback(uint64_t idx, bool muted); + void setFrontMuteCallback(std::function f); + void setFrontVolumeCallback(std::function f); void updateMainVolumeCallback(uint64_t idx, float newVal); void updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal); - void toggleFrontEvents(uint64_t idx, bool active); - //void parseExternalEndpointCallback(EndpointCallback *epc, PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); - //static Overseer* getOverseer(); private: static Overseer os; std::vector endpointHandlers; - std::vector endpointWidgets; + std::vector endpointWidgets; + std::function updateFrontVolumeCallback = {}; + std::function updateFrontMuteCallback = {}; }; diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index a5d0b8a..24287e9 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -74,11 +74,11 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( void EndpointWidget::updateMute(bool muted){ log_debugcpp("cliqui callboqui cloqui"); //TODO: Here to diagnose slider visuals locking when playing DJ with external volume bar. Functionality is restored when mute checkbox is clicked. - //this->muteButton->blockSignals(true); + this->muteButton->blockSignals(true); //this->eph->setMute(osh->getGuid(), muted); - this->muteButton->setChecked(eph->getMute() ? true : false); + this->muteButton->setChecked(muted); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); - //this->muteButton->blockSignals(false); + this->muteButton->blockSignals(false); } void EndpointWidget::updateMute(int checked){ @@ -107,14 +107,23 @@ void EndpointWidget::updateMainVolume(float newValue){ } void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ - int newVal = newValue * 100; - log_debugcpp("chanel: " << channel << " volcallback int: " << newVal); - //TODO: Above - //this->channelSliders.at(channel)->blockSignals(true); - if(this->channelSliders.at(channel)->value() != newVal) { - this->channelSliders.at(channel)->setValue(newVal); - this->channelLabels.at(channel)->setText(QString::number((int)(newValue * 100))); + this->blockSignals(true); + if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) { + updateMainVolume(newValue); + } else { + int newVal = newValue * 100; + log_debugcpp("chanel: " << channel << " volcallback int: " << newVal); + //TODO: Above + //this->channelSliders.at(channel)->blockSignals(true); + + for (size_t i = 0; i < sizeof(uint32_t) * 8; ++i) { + if ((channel << i & 1) && this->channelSliders.at(channel)->value() != newVal) { + this->channelSliders.at(channel)->setValue(newVal); + this->channelLabels.at(channel)->setText(QString::number((int)(newValue * 100))); + } + } } + this->blockSignals(false); //this->channelSliders.at(channel)->blockSignals(false); } @@ -160,8 +169,18 @@ void MainWindow::reloadEndpointWidgets() { } osh->setEndpointWidgets(ews); layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), i, 0); + + osh->setFrontVolumeCallback([this](uint64_t device, uint32_t channel, float value) { + if (device < ews.size()) + ews[device]->updateChannelVolume(channel, value); + }); + osh->setFrontMuteCallback([this](uint64_t device, bool muted) { + if (device < ews.size()) + ews[device]->updateMute(muted); + }); } + //#include "qtclosemwh.h" /* diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index dc1a82a..788e279 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -103,6 +103,7 @@ class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr); void reloadEndpointWidgets(); + //TODO: destroy/empty existing EndpointWidgets //void setEndpointHandlers(std::vector *ephs); From c4b1c4b7966f0e0a8ef2d9bd9573211575b41fa3 Mon Sep 17 00:00:00 2001 From: Phireh Date: Mon, 14 Aug 2023 22:18:24 +0200 Subject: [PATCH 20/22] Correctly update channel sliders --- src/cont/contclasses.cpp | 3 ++- src/qt/qtclasses.cpp | 25 +++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 36b913d..3727fd4 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -128,7 +128,8 @@ void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel // convert channel to bitmask int i = 0; - while (i++); + while (i < channel) + i++; uint32_t mask = (1 << i); updateFrontVolumeCallback(idx, mask, newVal); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 24287e9..bebddf2 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -108,23 +108,24 @@ void EndpointWidget::updateMainVolume(float newValue){ void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ this->blockSignals(true); - if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) { + if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) updateMainVolume(newValue); - } else { - int newVal = newValue * 100; - log_debugcpp("chanel: " << channel << " volcallback int: " << newVal); - //TODO: Above - //this->channelSliders.at(channel)->blockSignals(true); + + int newVal = newValue * 100; + log_debugcpp("chanel: " << channel << " volcallback int: " << newVal); - for (size_t i = 0; i < sizeof(uint32_t) * 8; ++i) { - if ((channel << i & 1) && this->channelSliders.at(channel)->value() != newVal) { - this->channelSliders.at(channel)->setValue(newVal); - this->channelLabels.at(channel)->setText(QString::number((int)(newValue * 100))); - } + for (size_t i = 0; i < sizeof(uint32_t) * 8 && i < channelSliders.size(); ++i) { + if (((channel >> i) & 1) && this->channelSliders.at(i)->value() != newVal) { + this->channelSliders.at(i)->blockSignals(true); + + this->channelSliders.at(i)->setValue(newVal); + this->channelLabels.at(i)->setText(QString::number((int)(newValue * 100))); + + this->channelSliders.at(i)->blockSignals(false); } } + this->blockSignals(false); - //this->channelSliders.at(channel)->blockSignals(false); } void EndpointWidget::toggleFrontEvents(bool active){ From 831dceb89ac85bcc2abb70c561f57ecc2bd3d45b Mon Sep 17 00:00:00 2001 From: Hane Date: Tue, 15 Aug 2023 17:03:23 +0200 Subject: [PATCH 21/22] code cleanup; channels callback coalesced again --- src/back/backlasses.cpp | 6 +++--- src/cont/contclasses.cpp | 39 +++++++++++++++++++------------------- src/cont/contclasses.h | 11 +++++------ src/debug.h | 8 +++++++- src/qt/qtclasses.cpp | 41 +++++++++++++++++++++------------------- src/qt/qtclasses.h | 8 +------- 6 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 32c7940..ef827dd 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -56,15 +56,15 @@ HRESULT EndpointCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) { log_debugcpp("Onnanokotify says Stored: " << guid->data1); log_debugcpp("Onnanokotify says Grace of God: " << eventData.guidEventContext.Data1); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); - osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); + osh->updateVolumeCallback(this->ep->getIndex(), AudioChannel::CHANNEL_MAIN ,eventData.fMasterVolume); log_debugcpp("Onnanokotify says Reported Channel Qty: " << eventData.nChannels); if(multiChannel) for(UINT i = 0; i < eventData.nChannels; i++) { - osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)i, extraChannelVol[i]); + osh->updateVolumeCallback(this->ep->getIndex(), (uint32_t)i, extraChannelVol[i]); } else - osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)0, pNotify->afChannelVolumes[0]); + osh->updateVolumeCallback(this->ep->getIndex(), (uint32_t)0, pNotify->afChannelVolumes[0]); } return S_OK; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 3727fd4..679f921 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -6,8 +6,8 @@ Overseer OverseerHandler::os; EndpointHandler::EndpointHandler(uint64_t idx) { - std::vector endpoints = osh->getPlaybackEndpoints(); - this->ep = endpoints.at(idx); + //std::vector endpoints = osh->getPlaybackEndpoints().at(idx); + this->ep = osh->getPlaybackEndpoints().at(idx); epc = new EndpointCallback(ep); //epName = ep->getName(); ep->setCallback(epc); @@ -25,7 +25,6 @@ uint64_t EndpointHandler::getIndex(){ return idx; } - /* * -1 for master volume */ @@ -101,20 +100,6 @@ void OverseerHandler::setEndpointHandlers(std::vector ephs){ this->endpointHandlers = ephs; } - -void OverseerHandler::setEndpointWidgets(std::vector ews){ - this->endpointWidgets = ews; -} - -void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ - updateFrontMuteCallback(idx, muted); -} - -void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ - log_debugcpp("mainvolcallback float: " << newVal); - updateFrontVolumeCallback(idx, AudioChannel::CHANNEL_MAIN, newVal); -} - void OverseerHandler::setFrontVolumeCallback(std::function f) { this->updateFrontVolumeCallback = f; } @@ -123,11 +108,27 @@ void OverseerHandler::setFrontMuteCallback(std::function f this->updateFrontMuteCallback = f; } -void OverseerHandler::updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ +void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ + updateFrontMuteCallback(idx, muted); +} + +/* + * void OverseerHandler::updateMainVolumeCallback(uint64_t idx, float newVal){ + * + * } + */ + +void OverseerHandler::updateVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ + if (channel == AudioChannel::CHANNEL_MAIN) { + log_debugcpp("mainvolcallback float: " << newVal); + updateFrontVolumeCallback(idx, AudioChannel::CHANNEL_MAIN, newVal); + return; + } + log_debugcpp("channel: " << channel << " volcallback float: " << newVal); // convert channel to bitmask - int i = 0; + uint32_t i = 0; while (i < channel) i++; uint32_t mask = (1 << i); diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index bb47131..320564f 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -64,7 +64,6 @@ class OverseerHandler { public: //OverseerHandler(); void setEndpointHandlers(std::vector ephs); - void setEndpointWidgets(std::vector ews); std::vector getEndpointHandlers(); std::vector getPlaybackEndpoints(); uint64_t getPlaybackEndpointsCount(); @@ -73,13 +72,13 @@ public: void updateMuteCallback(uint64_t idx, bool muted); void setFrontMuteCallback(std::function f); void setFrontVolumeCallback(std::function f); - void updateMainVolumeCallback(uint64_t idx, float newVal); - void updateChannelVolumeCallback(uint64_t idx, uint32_t channel, float newVal); + //void updateMainVolumeCallback(uint64_t idx, float newVal); + void updateVolumeCallback(uint64_t idx, uint32_t channel, float newVal); private: static Overseer os; std::vector endpointHandlers; - std::vector endpointWidgets; - std::function updateFrontVolumeCallback = {}; - std::function updateFrontMuteCallback = {}; + std::function updateFrontVolumeCallback; + std::function updateFrontMuteCallback; + }; diff --git a/src/debug.h b/src/debug.h index 78cb19c..e80893f 100644 --- a/src/debug.h +++ b/src/debug.h @@ -16,8 +16,14 @@ std::bitset varToBitset(T info) { #else #define log_debugcpp(str) -#define print_as_binary(len, info) +#define print_as_binary(len, type, info) #endif +/* Here as a quick reference, in case smthn similar is needed again */ +/* typedef void (EndpointWidget::*epwMuteFunc)(bool muted); */ +/* typedef void (EndpointWidget::*epwMainVolumeFunc)(float newValue); */ +/* typedef void (EndpointWidget::*epwChannelVolumeFunc)(uint32_t channel, float newValue); */ +/* typedef void (EndpointWidget::*epwToggleFrontFunc)(bool active); */ + diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index bebddf2..9a446ee 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -73,12 +73,14 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( void EndpointWidget::updateMute(bool muted){ log_debugcpp("cliqui callboqui cloqui"); - //TODO: Here to diagnose slider visuals locking when playing DJ with external volume bar. Functionality is restored when mute checkbox is clicked. - this->muteButton->blockSignals(true); + //TIP: Blocksignals here to diagnose slider visuals locking when playing DJ with external volume bar. Functionality is restored when mute checkbox is clicked. + //this->blockSignals(true); + //this->muteButton->blockSignals(true); //this->eph->setMute(osh->getGuid(), muted); this->muteButton->setChecked(muted); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); - this->muteButton->blockSignals(false); + //this->muteButton->blockSignals(false); + //this->blockSignals(false); } void EndpointWidget::updateMute(int checked){ @@ -96,18 +98,20 @@ void EndpointWidget::updateMainVolume(int newValue){ } void EndpointWidget::updateMainVolume(float newValue){ + //this->blockSignals(true); int newVal = newValue * 100; log_debugcpp("mainvolcallback int: " << newVal); //this->mainSlider->blockSignals(true); - //TODO: Above + if(this->mainSlider->value() != newVal) { this->mainSlider->setValue(newVal); } //this->mainSlider->blockSignals(false); + //this->blockSignals(false); } void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ - this->blockSignals(true); + //this->blockSignals(true); if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) updateMainVolume(newValue); @@ -116,25 +120,27 @@ void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ for (size_t i = 0; i < sizeof(uint32_t) * 8 && i < channelSliders.size(); ++i) { if (((channel >> i) & 1) && this->channelSliders.at(i)->value() != newVal) { - this->channelSliders.at(i)->blockSignals(true); + //this->channelSliders.at(i)->blockSignals(true); this->channelSliders.at(i)->setValue(newVal); this->channelLabels.at(i)->setText(QString::number((int)(newValue * 100))); - this->channelSliders.at(i)->blockSignals(false); + //this->channelSliders.at(i)->blockSignals(false); } } - this->blockSignals(false); + //this->blockSignals(false); } -void EndpointWidget::toggleFrontEvents(bool active){ - this->muteButton->blockSignals(active); - this->mainSlider->blockSignals(active); - for(uint32_t i = 0; i < this->channelSliders.size(); i++){ - this->channelSliders.at(i)->blockSignals(active); - } -} +/* + * void EndpointWidget::toggleFrontEvents(bool active){ + * this->muteButton->blockSignals(active); + * this->mainSlider->blockSignals(active); + * for(uint32_t i = 0; i < this->channelSliders.size(); i++){ + * this->channelSliders.at(i)->blockSignals(active); + * } + * } + */ void EndpointWidget::setIndex(uint64_t idx){ @@ -168,7 +174,7 @@ void MainWindow::reloadEndpointWidgets() { ews.push_back(epw); layout->addWidget(epw, i, 0); } - osh->setEndpointWidgets(ews); + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), i, 0); osh->setFrontVolumeCallback([this](uint64_t device, uint32_t channel, float value) { @@ -181,9 +187,6 @@ void MainWindow::reloadEndpointWidgets() { }); } - -//#include "qtclosemwh.h" - /* * void MainWindow::setPlotButton() { * button = new QPushButton("push"), diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 788e279..4482d23 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -71,7 +71,7 @@ public: void updateMainVolume(float newValue); void updateChannelVolume(uint32_t channel, float newValue); void updateMute(bool muted); - void toggleFrontEvents(bool active); + //void toggleFrontEvents(bool active); //void populateEndpointWidget(EndpointHandler *eph); //void setEndpointHandlers(std::vector *ephs); @@ -84,18 +84,12 @@ private: uint64_t idx; //std::vector *ephs; //std::vector *sliders; - //signals: //void valueChanged(int value); }; -typedef void (EndpointWidget::*epwMuteFunc)(bool muted); -typedef void (EndpointWidget::*epwMainVolumeFunc)(float newValue); -typedef void (EndpointWidget::*epwChannelVolumeFunc)(uint32_t channel, float newValue); -typedef void (EndpointWidget::*epwToggleFrontFunc)(bool active); - class MainWindow : public QMainWindow { Q_OBJECT //QWidget *centralWidget; From 03e726f3e66e3db2d99ba512bd229f0b7b78bec2 Mon Sep 17 00:00:00 2001 From: Hane Date: Tue, 15 Aug 2023 18:06:55 +0200 Subject: [PATCH 22/22] more code cleanup; changed define for channel enum --- src/back/backlasses.cpp | 4 ++-- src/cont/contclasses.cpp | 7 ++++--- src/qt/qtclasses.cpp | 33 ++++++++++++++------------------- src/qt/qtclasses.h | 4 ++-- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index ef827dd..5269c29 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -141,10 +141,10 @@ bool Endpoint::getMute(){ void Endpoint::setVolume(NGuid* guid, int channel, float volume) { GUID tempMsGuid = NGuidToGUID(guid); - if (channel == ENDPOINT_MASTER_VOLUME) { + if (channel == AudioChannel::CHANNEL_MAIN) { if(FAILED(endpointVolume->SetMasterVolumeLevelScalar(volume, &tempMsGuid))) { log_debugcpp("MASTER VOLUME FAILED"); }; } else { - log_debugcpp("Channel being updated: " << channel); + log_debugcpp("Windows: Channel being updated: " << channel); if(FAILED(endpointVolume->SetChannelVolumeLevelScalar(channel, volume, &tempMsGuid))) { log_debugcpp("CHANNEL "<< channel <<" VOLUME FAILED"); }; } } diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 679f921..381550b 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -119,19 +119,20 @@ void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ */ void OverseerHandler::updateVolumeCallback(uint64_t idx, uint32_t channel, float newVal){ - if (channel == AudioChannel::CHANNEL_MAIN) { + if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) { log_debugcpp("mainvolcallback float: " << newVal); updateFrontVolumeCallback(idx, AudioChannel::CHANNEL_MAIN, newVal); return; } - log_debugcpp("channel: " << channel << " volcallback float: " << newVal); - + // convert channel to bitmask uint32_t i = 0; while (i < channel) i++; uint32_t mask = (1 << i); + + log_debugcpp("Back->Cont Channel: " << mask << " volcallback float: " << newVal); updateFrontVolumeCallback(idx, mask, newVal); } diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 9a446ee..155cd90 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -76,6 +76,7 @@ void EndpointWidget::updateMute(bool muted){ //TIP: Blocksignals here to diagnose slider visuals locking when playing DJ with external volume bar. Functionality is restored when mute checkbox is clicked. //this->blockSignals(true); //this->muteButton->blockSignals(true); + //this->eph->setMute(osh->getGuid(), muted); this->muteButton->setChecked(muted); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); @@ -97,26 +98,20 @@ void EndpointWidget::updateMainVolume(int newValue){ this->eph->setVolume(osh->getGuid(), ENDPOINT_MASTER_VOLUME, newValue); } -void EndpointWidget::updateMainVolume(float newValue){ - //this->blockSignals(true); - int newVal = newValue * 100; - log_debugcpp("mainvolcallback int: " << newVal); - //this->mainSlider->blockSignals(true); - - if(this->mainSlider->value() != newVal) { - this->mainSlider->setValue(newVal); - } - //this->mainSlider->blockSignals(false); - //this->blockSignals(false); -} - -void EndpointWidget::updateChannelVolume(uint32_t channel, float newValue){ +void EndpointWidget::updateVolume(uint32_t channel, float newValue){ //this->blockSignals(true); - if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) - updateMainVolume(newValue); - int newVal = newValue * 100; - log_debugcpp("chanel: " << channel << " volcallback int: " << newVal); + if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) { + log_debugcpp("mainvolcallback int: " << newVal); + //this->mainSlider->blockSignals(true); + + if(this->mainSlider->value() != newVal) { + this->mainSlider->setValue(newVal); + } + return; + } + + log_debugcpp("Cont->Front Channel:: " << channel << " volcallback int: " << newVal); for (size_t i = 0; i < sizeof(uint32_t) * 8 && i < channelSliders.size(); ++i) { if (((channel >> i) & 1) && this->channelSliders.at(i)->value() != newVal) { @@ -179,7 +174,7 @@ void MainWindow::reloadEndpointWidgets() { osh->setFrontVolumeCallback([this](uint64_t device, uint32_t channel, float value) { if (device < ews.size()) - ews[device]->updateChannelVolume(channel, value); + ews[device]->updateVolume(channel, value); }); osh->setFrontMuteCallback([this](uint64_t device, bool muted) { if (device < ews.size()) diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 4482d23..c5eee14 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -68,8 +68,8 @@ public: std::vector channelLabels; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; - void updateMainVolume(float newValue); - void updateChannelVolume(uint32_t channel, float newValue); + //void updateMainVolume(float newValue); + void updateVolume(uint32_t channel, float newValue); void updateMute(bool muted); //void toggleFrontEvents(bool active);