diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index ef827dd..5030f11 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -55,16 +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(), true); osh->updateMuteCallback(this->ep->getIndex(), eventData.bMuted); - osh->updateVolumeCallback(this->ep->getIndex(), AudioChannel::CHANNEL_MAIN ,eventData.fMasterVolume); + osh->updateMainVolumeCallback(this->ep->getIndex(), eventData.fMasterVolume); log_debugcpp("Onnanokotify says Reported Channel Qty: " << eventData.nChannels); if(multiChannel) for(UINT i = 0; i < eventData.nChannels; i++) { - osh->updateVolumeCallback(this->ep->getIndex(), (uint32_t)i, extraChannelVol[i]); + osh->updateChannelVolumeCallback(this->ep->getIndex(), (uint32_t)i, extraChannelVol[i]); } else - osh->updateVolumeCallback(this->ep->getIndex(), (uint32_t)0, pNotify->afChannelVolumes[0]); + 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 679f921..8281bb8 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -1,4 +1,5 @@ #include "backlasses.h" +#include "qtclasses.h" #include "contclasses.h" //TODO: pragma once @@ -6,8 +7,8 @@ Overseer OverseerHandler::os; EndpointHandler::EndpointHandler(uint64_t idx) { - //std::vector endpoints = osh->getPlaybackEndpoints().at(idx); - this->ep = osh->getPlaybackEndpoints().at(idx); + std::vector endpoints = osh->getPlaybackEndpoints(); + this->ep = endpoints.at(idx); epc = new EndpointCallback(ep); //epName = ep->getName(); ep->setCallback(epc); @@ -25,6 +26,7 @@ uint64_t EndpointHandler::getIndex(){ return idx; } + /* * -1 for master volume */ @@ -62,6 +64,12 @@ std::vector OverseerHandler::getPlaybackEndpoints() { return this->os.getPlaybackEndpoints(); } +/* + * Overseer* OverseerHandler::getOverseer(){ + * return &os; + * } + */ + std::vector OverseerHandler::getEndpointHandlers(){ return endpointHandlers; @@ -100,38 +108,38 @@ void OverseerHandler::setEndpointHandlers(std::vector ephs){ this->endpointHandlers = ephs; } -void OverseerHandler::setFrontVolumeCallback(std::function f) { - this->updateFrontVolumeCallback = f; -} -void OverseerHandler::setFrontMuteCallback(std::function f) { - this->updateFrontMuteCallback = f; +void OverseerHandler::setEndpointWidgets(std::vector ews){ + this->endpointWidgets = ews; } void OverseerHandler::updateMuteCallback(uint64_t idx, bool muted){ - updateFrontMuteCallback(idx, muted); + epwMuteFunc f = &EndpointWidget::updateMute; + pinvoke_mem_fn(endpointWidgets.at(idx),f)(muted); + //std::invoke(f, endpointWidgets.at(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 - uint32_t i = 0; - while (i < channel) - i++; - uint32_t mask = (1 << i); - - updateFrontVolumeCallback(idx, mask, newVal); +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); +} + +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); + 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); } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 320564f..5714a79 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -9,16 +9,11 @@ /* #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; @@ -64,21 +59,21 @@ class OverseerHandler { public: //OverseerHandler(); void setEndpointHandlers(std::vector ephs); + 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 setFrontMuteCallback(std::function f); - void setFrontVolumeCallback(std::function f); - //void updateMainVolumeCallback(uint64_t idx, float newVal); - void updateVolumeCallback(uint64_t idx, uint32_t channel, float newVal); + 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::function updateFrontVolumeCallback; - std::function updateFrontMuteCallback; - + std::vector endpointWidgets; }; diff --git a/src/debug.h b/src/debug.h index e80893f..78cb19c 100644 --- a/src/debug.h +++ b/src/debug.h @@ -16,14 +16,8 @@ std::bitset varToBitset(T info) { #else #define log_debugcpp(str) -#define print_as_binary(len, type, info) +#define print_as_binary(len, 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 9a446ee..a5d0b8a 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -73,14 +73,12 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent) : QWidget( void EndpointWidget::updateMute(bool muted){ log_debugcpp("cliqui callboqui cloqui"); - //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); + //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(muted); + this->muteButton->setChecked(eph->getMute() ? true : false); this->muteButton->setText(this->eph->getMute() ? STRING_UNMUTE : STRING_MUTE); //this->muteButton->blockSignals(false); - //this->blockSignals(false); } void EndpointWidget::updateMute(int checked){ @@ -98,49 +96,35 @@ 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); - if (channel == (uint32_t)AudioChannel::CHANNEL_MAIN) - updateMainVolume(newValue); - int newVal = newValue * 100; log_debugcpp("chanel: " << 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) { - //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); - } + //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(false); + //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::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){ @@ -174,19 +158,12 @@ 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) { - 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" + /* * void MainWindow::setPlotButton() { * button = new QPushButton("push"), diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 4482d23..dc1a82a 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,12 +84,18 @@ 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; @@ -97,7 +103,6 @@ class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr); void reloadEndpointWidgets(); - //TODO: destroy/empty existing EndpointWidgets //void setEndpointHandlers(std::vector *ephs);