diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index c1607cc..04aa309 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -37,22 +37,6 @@ HRESULT EndpointNewSessionCallback::QueryInterface(REFIID riid, VOID **ppvInterf } HRESULT EndpointNewSessionCallback::OnSessionCreated(IAudioSessionControl *NewSession) { - if (eph->getFlow() == Flows::FLOW_CAPTURE) return S_OK; - - HRESULT result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); - IAudioSessionControl2* sessionControl; - //ISimmpleAudioVolume* sessionVolume; - if (FAILED(NewSession->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&sessionControl))) { log_wdebugcpp(L"no nueva sesion......"); }; - if (sessionControl) { - sessionControl->AddRef(); - //sessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), (void**)&sessionVolume); - Session* newSession = new Session(this->eph->getEndpoint(), sessionControl); - eph->addSession(newSession); - } - - if (result == S_OK) - CoUninitialize(); - return S_OK; } @@ -283,7 +267,7 @@ Endpoint::Endpoint(IMMDevice* ep, uint64_t idx){ friendlyName = std::wstring(pv.pwszVal); this->setFlow(); - if (this->flow == Flows::FLOW_PLAYBACK) { + if (this->endpointState == EndpointState::ENDPOINT_ACTIVE && this->flow == Flows::FLOW_PLAYBACK) { activateEndpointSessions(); } } @@ -315,11 +299,6 @@ void Endpoint::activateEndpointSessions() { sessionEnumerator->Release(); } -void Endpoint::addSession(Session* session) { - session->setIndex(this->getSessionCount()); - endpointSessions.push_back(session); -} - void Endpoint::activateEndpointVolume() { //bool extraThread = false; /* @@ -538,14 +517,6 @@ size_t Endpoint::getSessionCount() { return endpointSessions.size(); } -void Endpoint::registerNewSessionNotification(EndpointNewSessionCallback* ensc){ - sessionManager->RegisterSessionNotification(ensc); -} - -void Endpoint::unregisterNewSessionNotification(EndpointNewSessionCallback* ensc){ - sessionManager->UnregisterSessionNotification(ensc); -} - Endpoint::~Endpoint(){ log_wdebugcpp(L"murio endpoint-san uwu"); properties->Release(); diff --git a/src/back/backlasses.h b/src/back/backlasses.h index f70e6d1..bda4a23 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -39,9 +39,6 @@ class Endpoint { /* sessions */ std::vector getSessions(); size_t getSessionCount(); - void addSession(Session* session); - void registerNewSessionNotification(EndpointNewSessionCallback* ensc); - void unregisterNewSessionNotification(EndpointNewSessionCallback* ensc); ~Endpoint(); @@ -138,6 +135,7 @@ class Overseer { class EndpointNewSessionCallback : public IAudioSessionNotification { public: + //EndpointSituationCallback(IMMDeviceEnumerator *deviceEnumerator, std::vector playbackDevices); EndpointNewSessionCallback(EndpointHandler *eph); ULONG AddRef(); ULONG Release(); diff --git a/src/back/backsessionclasses.cpp b/src/back/backsessionclasses.cpp index 7f3b101..a0a4b5e 100644 --- a/src/back/backsessionclasses.cpp +++ b/src/back/backsessionclasses.cpp @@ -71,11 +71,6 @@ HRESULT SessionStateCallback::OnGroupingParamChanged(LPCGUID NewGroupingParam, L } HRESULT SessionStateCallback::OnStateChanged(AudioSessionState NewState) { - /* enum _AudioSessionState { - * AudioSessionStateInactive, - * AudioSessionStateActive, - * AudioSessionStateExpired - * } AudioSessionState; */ /* * char *pszState = "?????"; * @@ -90,6 +85,7 @@ HRESULT SessionStateCallback::OnStateChanged(AudioSessionState NewState) { * } * printf("New session state = %s\n", pszState); */ + return S_OK; } @@ -130,20 +126,6 @@ Session::Session(Endpoint* ep, IAudioSessionControl2* sessionControl, size_t idx this->sessionControl = sessionControl; this->idx = idx; - AudioSessionState msState; - sessionControl->GetState(&msState); - switch (msState) { - case AudioSessionState::AudioSessionStateActive: - this->sessionState = SessionState::ACTIVE; - break; - case AudioSessionState::AudioSessionStateInactive: - this->sessionState = SessionState::INACTIVE; - break; - case AudioSessionState::AudioSessionStateExpired: - this->sessionState = SessionState::EXPIRED; - break; - } - sessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), (void**)&sessionVolume); DWORD pid; sessionControl->GetProcessId(&pid); @@ -198,10 +180,6 @@ void Session::setVolume(NGuid guid, int channel, float volume) { } } -void Session::setIndex(size_t idx) { - this->idx = idx; -} - void Session::setMute(NGuid guid, bool muted) { GUID tempMsGuid = NGuidToGUID(guid); if(FAILED(sessionVolume->SetMute(muted, &tempMsGuid))) { log_wdebugcpp(std::wstring(L"SessionVolume null?")); }; @@ -290,15 +268,6 @@ wchar_t* fileDescription = NULL; return exePath; } -//todo: conflicting names. change callback name -void Session::setState(SessionState state) { - sessionState = state; -} - -SessionState Session::getState() { - return sessionState; -} - void Session::setStateCallback(SessionStateCallback *ssc){ sessionControl->RegisterAudioSessionNotification((IAudioSessionEvents*) ssc); } @@ -306,8 +275,3 @@ void Session::setStateCallback(SessionStateCallback *ssc){ void Session::removeStateCallback(SessionStateCallback *ssc){ sessionControl->UnregisterAudioSessionNotification((IAudioSessionEvents*) ssc); } - -Session::~Session() { - sessionControl->Release(); - sessionVolume->Release(); -} diff --git a/src/back/backsessionclasses.h b/src/back/backsessionclasses.h index e6c8490..3354939 100644 --- a/src/back/backsessionclasses.h +++ b/src/back/backsessionclasses.h @@ -30,25 +30,19 @@ class Session { public: Session(Endpoint* ep, IAudioSessionControl2* sessionControl, size_t idx); - Session(Endpoint* ep, IAudioSessionControl2* sessionControl) : Session(ep, sessionControl, SIZE_MAX) {}; void setVolume(NGuid guid, int channel, float volume); float getVolume(int channel); void setMute(NGuid guid, bool muted); bool getMute(); - SessionState getState(); - void setState(SessionState state); - void setIndex(size_t idx); std::wstring getName(); void setStateCallback(SessionStateCallback *ssc); void removeStateCallback(SessionStateCallback *ssc); - ~Session(); //uint32_t getChannelCount(); private: std::wstring fetchProcessName(DWORD pid); std::wstring sessionName; - SessionState sessionState; Endpoint* ep; IAudioSessionControl2* sessionControl = nullptr; ISimpleAudioVolume* sessionVolume = nullptr; diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index 1982bf8..a858b0f 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -9,14 +9,13 @@ EndpointHandler::EndpointHandler(uint64_t idx, Flows flow) { this->ep = (flow == Flows::FLOW_PLAYBACK ? osh->getPlaybackEndpoints().at(idx) : osh->getCaptureEndpoints().at(idx)); epc = new EndpointVolumeCallback(ep); - ensc = new EndpointNewSessionCallback(this); this->callbackInfo.caller = osh->getGuid(); - ep->registerNewSessionNotification(ensc); + //epName = ep->getName(); this->setBackEndpointVolumeCallbackInfoContent(this->getState()); osh->pushBackEndpointHandler(this, flow); - if (this->flow == Flows::FLOW_PLAYBACK) { + if (this->flow == Flows::FLOW_PLAYBACK && this->getState() == EndpointState::ENDPOINT_ACTIVE) { for (int i = 0; i < this->getSessionCount(); i++) { SessionHandler* sessionHandler = new SessionHandler(this, this->getSessions().at(i),i); sessionHandlers.push_back(sessionHandler); @@ -149,10 +148,6 @@ void EndpointHandler::removeRoles(Roles newRole){ ep->removeRoles(newRole); } -void EndpointHandler::setAddSessionWidgetFunction(std::function addSessionWidget) { - this->addSessionWidget = addSessionWidget; -} - /* sessions */ size_t EndpointHandler::getSessionCount() { return ep->getSessionCount(); @@ -166,21 +161,8 @@ std::vector EndpointHandler::getSessionHandlers(){ return this->sessionHandlers; } -Endpoint* EndpointHandler::getEndpoint() { - return this->ep; -} - -void EndpointHandler::addSession(Session* session) { - ep->addSession(session); - - SessionHandler* sessionHandler = new SessionHandler(this, session, (getSessionCount() - 1)); - sessionHandlers.push_back(sessionHandler); - this->addSessionWidget(sessionHandler); -} - EndpointHandler::~EndpointHandler() { ep->removeVolumeCallback(epc); - ep->unregisterNewSessionNotification(ensc); epc->Release(); delete ep; } @@ -320,6 +302,7 @@ void OverseerHandler::setRemoveEndpointWidgetFunction(std::functionremoveEndpointWidget = removeEndpointWidget; } + void OverseerHandler::setEndpointHandlers(std::vector ephs){ this->playbackEndpointHandlers = ephs; } diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index df4d755..4bdd519 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -10,7 +10,6 @@ class Endpoint; class EndpointVolumeCallback; class Overseer; class SessionHandler; -class EndpointNewSessionCallback; struct BackEndpointVolumeCallbackInfo { NGuid caller; @@ -62,13 +61,7 @@ public: /* sessions */ size_t getSessionCount(); std::vector getSessionHandlers(); - void createNewSession(); - Endpoint* getEndpoint(); - /*Session*/ - void addSession(Session* session); - void setAddSessionWidgetFunction(std::function addSessionWidget); - ~EndpointHandler(); private: std::vector getSessions(); @@ -83,9 +76,7 @@ private: uint64_t frontIdx = INT_MAX; }; EndpointHandlerFrontVisibility ephfv; - EndpointNewSessionCallback* ensc; std::vector sessionHandlers; - std::function addSessionWidget; //QSlider *slidy; }; @@ -113,6 +104,7 @@ public: EndpointHandler* addEndpoint(std::wstring endpointId, Flows *flow); NGuid getGuid(); + /* Session's */ /* * void setSessionVolumeCallback(std::function changeSessionVolume); * void setSessionVolume(float newValue, ); @@ -128,6 +120,7 @@ private: /* Session's */ std::function changeSessionVolume; + //std::function updateFrontVolumeCallback; //std::function updateFrontMuteCallback; diff --git a/src/global.h b/src/global.h index ced95ca..1c72212 100644 --- a/src/global.h +++ b/src/global.h @@ -31,31 +31,24 @@ enum AudioChannel { }; enum EndpointState { - ENDPOINT_ACTIVE = (1 << 0), - ENDPOINT_DISABLED = (1 << 1), + ENDPOINT_ACTIVE = (1 << 0), + ENDPOINT_DISABLED = (1 << 1), ENDPOINT_NOTPRESENT = (1 << 2), - ENDPOINT_UNPLUGGED = (1 << 3), - ENDPOINT_ALL = 0x0F -}; - -enum SessionState { - ACTIVE = (1 << 0), - INACTIVE = (1 << 1), - EXPIRED = (1 << 2), - ALL = 0x07 + ENDPOINT_UNPLUGGED = (1 << 3), + ENDPOINT_ALL = 0x0F }; enum Flows { FLOW_PLAYBACK = (1 << 0), - FLOW_CAPTURE = (1 << 1), - FLOW_BOTH = (1 << 2), + FLOW_CAPTURE = (1 << 1), + FLOW_BOTH = (1 << 2), }; enum Roles { - ROLE_CONSOLE = (1 << 0), - ROLE_MULTIMEDIA = (1 << 1), + ROLE_CONSOLE = (1 << 0), + ROLE_MULTIMEDIA = (1 << 1), ROLE_COMMUNICATIONS = (1 << 2), - ROLE_ALL = 0x07, + ROLE_ALL = 0x07, }; struct NGuid { diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 96cbcc3..f420688 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -1,7 +1,7 @@ #include "qtclasses.h" template -CustomWidgetEvent::CustomWidgetEvent(QEvent::Type type, T payload) : QEvent(type){ +EndpointWidgetEvent::EndpointWidgetEvent(QEvent::Type type, T payload) : QEvent(type){ this->payload = payload; } @@ -97,7 +97,7 @@ void SessionWidget::updateMainVolume(int newValue){ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *parent) : QWidget(parent){ //todo: based on qgridlayout, name+mute should be its own widget, same with channels - row = 0; + int row = 0; this->idx = idx; this->eph = eph; //todo: sussy @@ -255,18 +255,13 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare }); timer->start(10); - /* First SessionWidget batch */ + /* sessions */ for (size_t i = 0; i < eph->getSessionCount(); i++) { SessionWidget* sessionWidget = new SessionWidget(i, eph->getSessionHandlers().at(i), this); layout->addWidget(sessionWidget, row, 4); row++; sessionWidgets.push_back(sessionWidget); } - - /* New SessionWidget callback */ - eph->setAddSessionWidgetFunction([this](SessionHandler* sessionHandler) { - QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent((QEvent::Type)CustomQEvent::SessionWidgetCreated, sessionHandler)); - }); //todo parent? layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Minimum), 1, 0); @@ -276,28 +271,6 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare log_debugcpp("ENDPOINT_WIDGETED"); } -void EndpointWidget::addSessionWidget(CustomWidgetEvent* ev){ - SessionWidget* sw = new SessionWidget(this->sessionWidgets.size(), ev->payload, this); - this->layout->addWidget(sw, row, 4); - row++; - sessionWidgets.push_back(sw); - return; -} - -void EndpointWidget::customEvent(QEvent* ev) { - if (ev->type() == (QEvent::Type)CustomQEvent::SessionWidgetCreated) { - ev->setAccepted(true); - this->addSessionWidget((CustomWidgetEvent*) ev); - return; - } else if (ev->type() == (QEvent::Type)CustomQEvent::SessionWidgetObsolete) { - ev->setAccepted(true); - //this->addEndpointWidget((CustomWidgetEvent*)ev); - } - // Make sure the rest of events are handled - QWidget::customEvent(ev); -} - - EndpointWidget::~EndpointWidget() { timer->stop(); delete timer; @@ -307,17 +280,17 @@ EndpointWidget::~EndpointWidget() { void MainWindow::customEvent(QEvent* ev) { if (ev->type() == CustomQEvent::EndpointWidgetObsolete) { ev->setAccepted(true); - this->removeEndpointWidget((CustomWidgetEvent*)ev); + this->removeEndpointWidget((EndpointWidgetEvent*)ev); return; } else if (ev->type() == (QEvent::Type)CustomQEvent::EndpointWidgetCreated) { ev->setAccepted(true); - this->addEndpointWidget((CustomWidgetEvent*)ev); + this->addEndpointWidget((EndpointWidgetEvent*)ev); } // Make sure the rest of events are handled QMainWindow::customEvent(ev); } -void MainWindow::removeEndpointWidget(CustomWidgetEvent* ev){ +void MainWindow::removeEndpointWidget(EndpointWidgetEvent* ev){ uint64_t i = ev->payload; this->ews.at(i)->setParent(nullptr); this->layout->removeWidget(ews.at(i)); @@ -338,7 +311,7 @@ void MainWindow::removeEndpointWidget(CustomWidgetEvent* ev){ return; } -void MainWindow::addEndpointWidget(CustomWidgetEvent* ev){ +void MainWindow::addEndpointWidget(EndpointWidgetEvent* ev){ EndpointWidget* epw = new EndpointWidget(this->ews.size(), ev->payload, widget); this->layout->addWidget(epw); ews.push_back(epw); @@ -524,11 +497,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { }); osh->setRemoveEndpointWidgetFunction([this](uint64_t index) { - QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent((QEvent::Type)CustomQEvent::EndpointWidgetObsolete, index)); + QCoreApplication::instance()->postEvent(this, new EndpointWidgetEvent((QEvent::Type)CustomQEvent::EndpointWidgetObsolete, index)); }); osh->setAddEndpointWidgetFunction([this](EndpointHandler* eph) { - QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent((QEvent::Type)CustomQEvent::EndpointWidgetCreated, eph)); + QCoreApplication::instance()->postEvent(this, new EndpointWidgetEvent((QEvent::Type)CustomQEvent::EndpointWidgetCreated, eph)); }); } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index c130fdd..6cf85b0 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -58,17 +58,15 @@ */ enum CustomQEvent { EndpointWidgetObsolete = 1001, - EndpointWidgetCreated = 1002, - EndpointDefaultChange = 1003, - SessionWidgetCreated = 1004, - SessionWidgetObsolete = 1005 + EndpointWidgetCreated = 1002, + EndpointDefaultChange = 1003, }; template -class CustomWidgetEvent : public QEvent { +class EndpointWidgetEvent : public QEvent { public: - CustomWidgetEvent(QEvent::Type type, T payload); + EndpointWidgetEvent(QEvent::Type type, T payload); T payload; }; @@ -132,14 +130,7 @@ public slots: void updateMainVolume(int newValue); void updateMute(int checked); -protected: - void customEvent(QEvent* ev) override; - -private slots: - void addSessionWidget(CustomWidgetEvent* ev); - private: - int row; QCheckBox *muteButton = nullptr; QLabel *mainLabel = nullptr, *leftChannelLabel = nullptr, *rightChannelLabel = nullptr; QSlider *mainSlider = nullptr; @@ -147,7 +138,8 @@ private: std::vector channelLabels; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; - std::map defaultRolesCheckBoxes; + std::map defaultRolesCheckBoxes; + EndpointHandler* eph; size_t defaultRolesVectorSize = 4; @@ -176,8 +168,8 @@ protected: private slots: void trayIconActivated(QSystemTrayIcon::ActivationReason reason); - void removeEndpointWidget(CustomWidgetEvent* ev); - void addEndpointWidget(CustomWidgetEvent* ev); + void removeEndpointWidget(EndpointWidgetEvent* ev); + void addEndpointWidget(EndpointWidgetEvent* ev); void reorderEndpointWidgetCollection(); //TODO: destroy/empty existing EndpointWidgets //void setEndpointHandlers(std::vector *ephs);