wip: endpoint meter

This commit is contained in:
Hane 2024-04-30 21:30:58 +02:00
commit 6bda4702df
7 changed files with 41 additions and 11 deletions

View file

@ -246,10 +246,6 @@ Endpoint::Endpoint(IMMDevice* ep, uint64_t idx){
// CLSCTX_ALL, NULL, (void**)&audioClient))) { log_debugcpp("audioclntbros..."); }
//audioClient->GetDevicePeriod(&defTime, &minTime);
//todo: check header
//if(FAILED(endpoint->Activate(__uuidof(IAudioMeterInformation),
// CLSCTX_ALL, NULL, (void**)&endpointPeakMeter))) { log_debugcpp("peakbros..."); }
//endpointPeakMeter->GetPeakValue(&test);
}
reloadEndpointChannels();
@ -323,6 +319,12 @@ void Endpoint::activateEndpointVolume() {
if (this->endpointVolume == nullptr){
HRESULT result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
endpoint->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&this->endpointVolume);
//todo: check header
if(FAILED(endpoint->Activate(__uuidof(IAudioMeterInformation),
CLSCTX_ALL, NULL, (void**)&endpointPeakMeter))) { log_debugcpp("peakbros..."); }
//
//if (endpointVolume == nullptr) { //why they returning 0 after dealing with the error jfc CO_E_NOTINITIALIZED) {
//CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
//extraThread = true;
@ -356,6 +358,13 @@ std::wstring Endpoint::getId(){
return endpointId;
}
float Endpoint::getPeakVolume() {
float peakVol;
if(endpointPeakMeter) endpointPeakMeter->GetPeakValue(&peakVol);
else return 0;
return peakVol;
}
float Endpoint::getVolume(int channel){
float volume;
if (channel == AudioChannel::CHANNEL_MAIN) {

View file

@ -30,6 +30,7 @@ class Endpoint {
void removeRoles(Roles role);
void setFlow();
Flows getFlow();
float getPeakVolume();
std::wstring getId();
std::wstring getName();
void updateName();
@ -66,7 +67,7 @@ class Endpoint {
unsigned long endpointState;
Roles endpointRoles = (Roles)0;
uint64_t idx;
//Not implemented in llvm-mingw. Sad!
//Not implemented in llvm-mingw. Sad! todo: mingw patch
IAudioMeterInformation *endpointPeakMeter = nullptr;
};

View file

@ -133,6 +133,10 @@ void EndpointHandler::setState(uint8_t state, uint64_t index){
this->setBackEndpointVolumeCallbackInfoContent(state);
}
float EndpointHandler::getPeakVolume() {
return ep->getPeakVolume();
}
uint8_t EndpointHandler::getRoles(){
return ep->getRoles();
}

View file

@ -58,6 +58,7 @@ public:
void setState(uint8_t state);
void setState(uint8_t state, uint64_t idx);
float getPeakVolume();
/* sessions */
size_t getSessionCount();
std::vector<SessionHandler*> getSessionHandlers();

View file

@ -5,6 +5,10 @@ CustomWidgetEvent<T>::CustomWidgetEvent(QEvent::Type type, T payload) : QEvent(t
this->payload = payload;
}
void MeterSlider::setPeakValue(float peakValue) {
this->peakValue = peakValue;
}
void MeterSlider::paintEvent(QPaintEvent *event) {
//Q_D(QSlider);
/*
@ -23,11 +27,15 @@ void MeterSlider::paintEvent(QPaintEvent *event) {
QStyle *style = QApplication::style();
int lol = style->pixelMetric(QStyle::PM_SliderSpaceAvailable);
QPainter painter(this);
painter.setPen(Qt::blue);
//painter.setPen(Qt::blue);
painter.setOpacity(1.0);
painter.setClipping(false);
painter.setCompositionMode(QPainter::CompositionMode::CompositionMode_Source);
painter.fillRect(0, (this->height() / 2) - 3, this->width(), 4, Qt::black);
float peakLength = (this->width() * (this->peakValue));
//const qreal dpr = painter->device()->devicePixelRatio();
QStyleOptionSlider slider = QStyleOptionSlider();
QRect test = QApplication::style()->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&slider, QStyle::SC_SliderHandle);
painter.fillRect(0, (this->height() / 2) - 3, (this->width() * (this->peakValue)), 4, Qt::green);
}
void ExtendedCheckBox::customEvent(QEvent* ev) {
@ -482,6 +490,8 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent, uint64_t i
mainSlider->blockSignals(true);
muteButton->blockSignals(true);
mainSlider->setValue((int)((eph->getCallbackInfo()->mainVolume + roundingFactor) * 100));
mainSlider->setPeakValue(eph->getPeakVolume());
mainSlider->update();
mainVolumeLabel->setText(QString::number(mainSlider->value()));
muteButton->setCheckState((eph->getCallbackInfo()->muted == false ? Qt::Unchecked : Qt::Checked));
muteButton->setText(eph->getCallbackInfo()->muted ? STRING_UNMUTE : STRING_MUTE);
@ -496,7 +506,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent, uint64_t i
mainSlider->blockSignals(false);
muteButton->blockSignals(false);
});
timer->start(10);
timer->start(2);
/* First Widget batch */
for (size_t i = 0; i < eph->getSessionCount(); i++) {

View file

@ -27,8 +27,12 @@
#include <QToolBar>
#include <QWindow>
#include <QPainter>
#include <QStyle>
#include <QStyleOptionComplex>
#include <QStyleOptionSlider>
#include <QStylePainter>
#include <QStyleOptionSlider>
//#include <QScrollBar>
/*
* #else
@ -71,12 +75,13 @@ public:
class MeterSlider : public QSlider {
Q_OBJECT
private:
float peakValue;
protected:
void paintEvent(QPaintEvent *event) override;
public:
void setPeakValue(float peakValue);
using QSlider::QSlider;
};
class ExtendedCheckBox : public QCheckBox {

View file

@ -52,7 +52,7 @@ int main (int argc, char* argv[]) {
* log_debugcpp(a.toStdString());
* }
*/
//QApplication::setStyle("Fusion");
QApplication::setStyle("Fusion");
//Check if running
//https://stackoverflow.com/questions/48060989/qt-show-application-if-currently-running
initialize_file_log();