From 574c6f039e1e6753f7f89839abc533b9559c1fa3 Mon Sep 17 00:00:00 2001 From: Hane Date: Sat, 3 Feb 2024 17:05:09 +0100 Subject: [PATCH] temp commit --- src/back/backlasses.cpp | 21 ++++++++++++++++++ src/back/backlasses.h | 2 +- src/back/backsessionclasses.cpp | 38 ++++++++++++++++++++++++++++++++- src/back/backsessionclasses.h | 6 ++++++ src/cont/contclasses.cpp | 13 +++++++++++ src/cont/contclasses.h | 5 +++++ src/global.h | 25 ++++++++++++++-------- 7 files changed, 99 insertions(+), 11 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 04aa309..677ce28 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -37,6 +37,22 @@ 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; } @@ -299,6 +315,11 @@ void Endpoint::activateEndpointSessions() { sessionEnumerator->Release(); } +void Endpoint::addSession(Session* session) { + session->setIndex(this->getSessionCount()); + endpointSessions.push_back(session); +} + void Endpoint::activateEndpointVolume() { //bool extraThread = false; /* diff --git a/src/back/backlasses.h b/src/back/backlasses.h index bda4a23..b95be81 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -39,6 +39,7 @@ class Endpoint { /* sessions */ std::vector getSessions(); size_t getSessionCount(); + void addSession(Session* session); ~Endpoint(); @@ -135,7 +136,6 @@ 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 a0a4b5e..7f3b101 100644 --- a/src/back/backsessionclasses.cpp +++ b/src/back/backsessionclasses.cpp @@ -71,6 +71,11 @@ HRESULT SessionStateCallback::OnGroupingParamChanged(LPCGUID NewGroupingParam, L } HRESULT SessionStateCallback::OnStateChanged(AudioSessionState NewState) { + /* enum _AudioSessionState { + * AudioSessionStateInactive, + * AudioSessionStateActive, + * AudioSessionStateExpired + * } AudioSessionState; */ /* * char *pszState = "?????"; * @@ -85,7 +90,6 @@ HRESULT SessionStateCallback::OnStateChanged(AudioSessionState NewState) { * } * printf("New session state = %s\n", pszState); */ - return S_OK; } @@ -126,6 +130,20 @@ 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); @@ -180,6 +198,10 @@ 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?")); }; @@ -268,6 +290,15 @@ 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); } @@ -275,3 +306,8 @@ 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 3354939..e6c8490 100644 --- a/src/back/backsessionclasses.h +++ b/src/back/backsessionclasses.h @@ -30,19 +30,25 @@ 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 a858b0f..7f7dabd 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -161,6 +161,19 @@ std::vector EndpointHandler::getSessionHandlers(){ return this->sessionHandlers; } +Endpoint* EndpointHandler::getEndpoint() { + return this->ep; +} + +void EndpointHandler::addSession(Session* session) { + ep->addSession(session); + + if (this->getState() == EndpointState::ENDPOINT_ACTIVE) { + SessionHandler* sessionHandler = new SessionHandler(this, session, (getSessionCount() - 1)); + sessionHandlers.push_back(sessionHandler); + } +} + EndpointHandler::~EndpointHandler() { ep->removeVolumeCallback(epc); epc->Release(); diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index 4bdd519..e05f082 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -61,6 +61,11 @@ public: /* sessions */ size_t getSessionCount(); std::vector getSessionHandlers(); + void createNewSession(); + Endpoint* getEndpoint(); + + /*Session*/ + void addSession(Session* session); ~EndpointHandler(); private: diff --git a/src/global.h b/src/global.h index 1c72212..ced95ca 100644 --- a/src/global.h +++ b/src/global.h @@ -31,24 +31,31 @@ 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 + ENDPOINT_UNPLUGGED = (1 << 3), + ENDPOINT_ALL = 0x0F +}; + +enum SessionState { + ACTIVE = (1 << 0), + INACTIVE = (1 << 1), + EXPIRED = (1 << 2), + ALL = 0x07 }; 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 {