sessions dynamically removed

This commit is contained in:
Hane 2024-02-03 20:32:49 +01:00
commit 5211b70669
9 changed files with 114 additions and 73 deletions

View file

@ -47,7 +47,7 @@ HRESULT EndpointNewSessionCallback::OnSessionCreated(IAudioSessionControl *NewSe
sessionControl->AddRef();
//sessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), (void**)&sessionVolume);
Session* newSession = new Session(this->eph->getEndpoint(), sessionControl);
eph->addSession(newSession);
eph->addSessionSendFront(newSession);
}
if (result == S_OK)
@ -602,7 +602,6 @@ void Overseer::reloadEndpoints(Flows flow) {
if(deviceCollection->Item(i, &temp) != 0) { log_debugcpp("si"); };
Endpoint *endpoint = new Endpoint(temp, i);
//endpoint->setIndex(i);
if (flow == Flows::FLOW_PLAYBACK)
this->playbackDevices.push_back(endpoint);
else

View file

@ -71,57 +71,26 @@ HRESULT SessionStateCallback::OnGroupingParamChanged(LPCGUID NewGroupingParam, L
}
HRESULT SessionStateCallback::OnStateChanged(AudioSessionState NewState) {
/* enum _AudioSessionState {
* AudioSessionStateInactive,
* AudioSessionStateActive,
* AudioSessionStateExpired
* } AudioSessionState; */
/*
* char *pszState = "?????";
*
* switch (NewState)
* {
* case AudioSessionStateActive:
* pszState = "active";
* break;
* case AudioSessionStateInactive:
* pszState = "inactive";
* break;
* }
* printf("New session state = %s\n", pszState);
*/
SessionState newState;// = sh->getState();
switch (NewState) {
case AudioSessionStateActive:
newState = SessionState::ACTIVE;
break;
case AudioSessionStateInactive:
newState = SessionState::INACTIVE;
break;
case AudioSessionStateExpired:
newState = SessionState::EXPIRED;
break;
}
sh->reviseSessionShowing(newState);
return S_OK;
}
HRESULT SessionStateCallback::OnSessionDisconnected(AudioSessionDisconnectReason DisconnectReason) {
/*
* char *pszReason = "?????";
*
* switch (DisconnectReason)
* {
* case DisconnectReasonDeviceRemoval:
* pszReason = "device removed";
* break;
* case DisconnectReasonServerShutdown:
* pszReason = "server shut down";
* break;
* case DisconnectReasonFormatChanged:
* pszReason = "format changed";
* break;
* case DisconnectReasonSessionLogoff:
* pszReason = "user logged off";
* break;
* case DisconnectReasonSessionDisconnected:
* pszReason = "session disconnected";
* break;
* case DisconnectReasonExclusiveModeOverride:
* pszReason = "exclusive-mode override";
* break;
* }
* printf("Audio session disconnected (reason: %s)\n",
* pszReason);
*/
sh->setState(SessionState::DISCONNECTED);
sh->reviseSessionShowing(SessionState::DISCONNECTED);
return S_OK;
}

View file

@ -153,6 +153,10 @@ void EndpointHandler::setAddSessionWidgetFunction(std::function<void(SessionHand
this->addSessionWidget = addSessionWidget;
}
void EndpointHandler::setRemoveSessionWidgetFunction(std::function<void(SessionHandler*)> removeSessionWidget) {
this->removeSessionWidget = removeSessionWidget;
}
/* sessions */
size_t EndpointHandler::getSessionCount() {
return ep->getSessionCount();
@ -170,7 +174,7 @@ Endpoint* EndpointHandler::getEndpoint() {
return this->ep;
}
void EndpointHandler::addSession(Session* session) {
void EndpointHandler::addSessionSendFront(Session* session) {
ep->addSession(session);
SessionHandler* sessionHandler = new SessionHandler(this, session, (getSessionCount() - 1));
@ -178,6 +182,14 @@ void EndpointHandler::addSession(Session* session) {
this->addSessionWidget(sessionHandler);
}
void EndpointHandler::sendSessionToFront(SessionHandler* sh) {
this->addSessionWidget(sh);
}
void EndpointHandler::removeSessionFromFront(SessionHandler* sh) {
this->removeSessionWidget(sh);
}
EndpointHandler::~EndpointHandler() {
ep->removeVolumeCallback(epc);
ep->unregisterNewSessionNotification(ensc);

View file

@ -66,8 +66,11 @@ public:
Endpoint* getEndpoint();
/*Session*/
void addSession(Session* session);
void addSessionSendFront(Session* session);
void setAddSessionWidgetFunction(std::function<void(SessionHandler*)> addSessionWidget);
void setRemoveSessionWidgetFunction(std::function<void(SessionHandler*)> removeSessionWidget);
void sendSessionToFront(SessionHandler* sh);
void removeSessionFromFront(SessionHandler* sh);
~EndpointHandler();
private:
@ -86,6 +89,7 @@ private:
EndpointNewSessionCallback* ensc;
std::vector<SessionHandler*> sessionHandlers;
std::function<void(SessionHandler*)> addSessionWidget;
std::function<void(SessionHandler*)> removeSessionWidget;
//QSlider *slidy;
};

View file

@ -36,6 +36,44 @@ bool SessionHandler::getMute(){
return session->getMute();
}
void SessionHandler::setFrontIndex(uint64_t frontIdx) {
this->frontIdx = frontIdx;
}
uint64_t SessionHandler::getFrontIndex() {
return frontIdx;
}
SessionVolumeInfo* SessionHandler::getVolumeInfo() {
return &svi;
}
SessionState SessionHandler::getState() {
return session->getState();
}
void SessionHandler::setState(SessionState state) {
session->setState(state);
}
void SessionHandler::reviseSessionShowing(SessionState state) {
SessionState currentState = this->getState();
switch (currentState) {
case SessionState::ACTIVE:
case SessionState::INACTIVE:
if (state == SessionState::EXPIRED) {
eph->removeSessionFromFront(this);
}
break;
case SessionState::EXPIRED:
if (state == SessionState::ACTIVE || INACTIVE) {
eph->sendSessionToFront(this);
}
break;
case SessionState::DISCONNECTED:
if (frontIdx != INT_MAX)
eph->removeSessionFromFront(this);
break;
}
}

View file

@ -24,7 +24,12 @@ class SessionHandler {
float getVolume(int channel);
void setMute(NGuid guid, bool muted);
bool getMute();
void setFrontIndex(uint64_t frontIdx);
SessionState getState();
void setState(SessionState state);
uint64_t getFrontIndex();
std::wstring getName();
void reviseSessionShowing(SessionState state);
SessionVolumeInfo* getVolumeInfo();
private:
@ -33,5 +38,5 @@ class SessionHandler {
Session* session;
SessionStateCallback* ssc;
size_t idx;
uint64_t frontIdx = INT_MAX;
};

View file

@ -42,7 +42,8 @@ enum SessionState {
ACTIVE = (1 << 0),
INACTIVE = (1 << 1),
EXPIRED = (1 << 2),
ALL = 0x07
DISCONNECTED = (1 << 3),
ALL = 0x0F
};
enum Flows {

View file

@ -95,6 +95,11 @@ void SessionWidget::updateMainVolume(int newValue){
this->sh->setVolume(osh->getGuid(), AudioChannel::CHANNEL_MAIN, newValue);
}
SessionWidget::~SessionWidget() {
volumePoller->stop();
delete volumePoller;
}
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;
@ -261,13 +266,18 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare
layout->addWidget(sessionWidget, row, 4);
row++;
sessionWidgets.push_back(sessionWidget);
eph->getSessionHandlers().at(i)->setFrontIndex(i);
}
/* New SessionWidget callback */
/* Add/Remove SessionWidget callback */
eph->setAddSessionWidgetFunction([this](SessionHandler* sessionHandler) {
QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent<SessionHandler*>((QEvent::Type)CustomQEvent::SessionWidgetCreated, sessionHandler));
});
eph->setRemoveSessionWidgetFunction([this](SessionHandler* sessionHandler) {
QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent<SessionHandler*>((QEvent::Type)CustomQEvent::SessionWidgetObsolete, sessionHandler));
});
//todo parent?
layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Minimum), 1, 0);
layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Minimum), 4, 0);
@ -277,23 +287,34 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare
}
void EndpointWidget::addSessionWidget(CustomWidgetEvent<SessionHandler*>* ev){
SessionWidget* sw = new SessionWidget(this->sessionWidgets.size(), ev->payload, this);
uint64_t index = this->sessionWidgets.size();
SessionWidget* sw = new SessionWidget(index, ev->payload, this);
ev->payload->setFrontIndex(index);
this->layout->addWidget(sw, row, 4);
row++;
sessionWidgets.push_back(sw);
return;
}
void EndpointWidget::removeSessionWidget(CustomWidgetEvent<SessionHandler*>* ev){
uint64_t i = ev->payload->getFrontIndex();
this->sessionWidgets.at(i)->setParent(nullptr);
this->layout->removeWidget(sessionWidgets.at(i));
delete sessionWidgets.at(i);
sessionWidgets.at(i) = nullptr;
ev->payload->setFrontIndex(INT_MAX);
//this->sessionWidgetsUpdateTimer->start();
return;
}
void EndpointWidget::customEvent(QEvent* ev) {
if (ev->type() == (QEvent::Type)CustomQEvent::SessionWidgetCreated) {
ev->setAccepted(true);
this->addSessionWidget((CustomWidgetEvent<SessionHandler*>*) ev);
return;
} else if (ev->type() == (QEvent::Type)CustomQEvent::SessionWidgetObsolete) {
ev->setAccepted(true);
//this->addEndpointWidget((CustomWidgetEvent<EndpointHandler*>*)ev);
this->removeSessionWidget((CustomWidgetEvent<SessionHandler*>*) ev);
}
// Make sure the rest of events are handled
QWidget::customEvent(ev);
}
@ -308,12 +329,10 @@ void MainWindow::customEvent(QEvent* ev) {
if (ev->type() == CustomQEvent::EndpointWidgetObsolete) {
ev->setAccepted(true);
this->removeEndpointWidget((CustomWidgetEvent<uint64_t>*)ev);
return;
} else if (ev->type() == (QEvent::Type)CustomQEvent::EndpointWidgetCreated) {
ev->setAccepted(true);
this->addEndpointWidget((CustomWidgetEvent<EndpointHandler*>*)ev);
}
// Make sure the rest of events are handled
QMainWindow::customEvent(ev);
}
@ -326,15 +345,6 @@ void MainWindow::removeEndpointWidget(CustomWidgetEvent<uint64_t>* ev){
delete ews.at(i);
ews.at(i) = nullptr;
this->ewsUpdateTimer->start();
/*
* while ((i + 1) < ews.size()) {
* ews.at(i) = ews.at(i + 1);
* ews.at(i)->setIndex(i);
* i++;
* }
* ews.pop_back();
*/
return;
}
@ -346,6 +356,7 @@ void MainWindow::addEndpointWidget(CustomWidgetEvent<EndpointHandler*>* ev){
}
void MainWindow::reorderEndpointWidgetCollection() {
/* Flatten */
size_t firstNullPosition = 0;
size_t ewsSize = ews.size();
bool breakSorting = false;

View file

@ -92,6 +92,7 @@ Q_OBJECT
public:
SessionWidget(uint64_t idx, SessionHandler* sh, QWidget *parent /* = nullptr */);
~SessionWidget();
public slots:
void updateMainVolume(int newValue);
@ -137,6 +138,7 @@ protected:
private slots:
void addSessionWidget(CustomWidgetEvent<SessionHandler*>* ev);
void removeSessionWidget(CustomWidgetEvent<SessionHandler*>* ev);
private:
int row;