2024-11-25 17:15:44 +08:00

341 lines
8.9 KiB
C++

#include "sounddialog.h"
#include "ui_sounddialog.h"
#include <QDebug>
int SoundDialog::m_value = 0;
#include <QPainter>
SoundDialog::SoundDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SoundDialog)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框
setAttribute(Qt::WA_TranslucentBackground,true); //设置透明
ui->cancel_Btn->setVisible(false);
this->setRange(0,100);
soundController = new SoundController(this);
}
SoundDialog::~SoundDialog()
{
delete ui;
// if(m_player) delete m_player;
// if(m_audioOutput) delete m_audioOutput;
}
void SoundDialog::setTitleAndUnit(QString title, QString unit)
{
ui->title_Label->setText(title);
//ui->unit_Label->setText(unit);
}
int SoundDialog::getValue()
{
return m_value;
}
void SoundDialog::setValue(int value)
{
ui->slider->setValue(value);
ui->value_Label->setText(QString::number(value));
// qDebug()<<"设置滑块和方块数字:"<<value;
// m_value = value;
qDebug() << ui->slider->value();
}
void SoundDialog::setRange(int min, int max)
{
ui->slider->setRange(min,max);
}
void SoundDialog::on_cancel_Btn_clicked()
{
this->close();
}
void SoundDialog::on_slider_sliderMoved(int position)
{
//qDebug() <<"mode的值:"<<position;
ui->value_Label->setText(QString::number(position));
SetSystemVolume(position);
}
void SoundDialog::on_confirm_Btn_clicked()
{
m_value = ui->value_Label->text().toInt();
if(m_value == 0)
SetSystemVolume(-2);//设置禁音
else
{
SetSystemVolume(-1); //取消禁音
SetSystemVolume(m_value -1);
}
this->close();
}
void SoundDialog::on_minus_Btn_clicked()
{
int value = ui->slider->value();
--value;
if(value < 0) return;
ui->slider->setValue(value);
ui->value_Label->setText(QString::number(value));
SetSystemVolume(value);
// m_player->setVolume(value);
// qDebug()<<m_value;
}
void SoundDialog::on_plus_Btn_clicked()
{
int value = ui->slider->value();
++value;
if(value > 100) return;
ui->slider->setValue(value);
ui->value_Label->setText(QString::number(value));
SetSystemVolume(value);
// m_player->setVolume(value);
// qDebug()<<m_value;
}
void SoundDialog::on_slider_valueChanged(int value)
{
//ui->value_Label->setText(QString::number(value));
//SetSystemVolume(value);
//SetSystemVolume2(value);
//soundController->setSystemVolume(value);
// m_player->setVolume(value);
//qDebug()<<"m_value"<<m_value;
}
void SoundDialog::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
painter.fillRect(rect(),QColor(0,0,0,100));
}
void SoundDialog::changeEvent(QEvent* event)
{
switch (event->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
QWidget::changeEvent(event);
break;
}
qDebug()<<"m_value、当前音量"<<m_value<<GetCurrentVolume();
m_value = (GetCurrentVolume()<=1)?m_value:GetCurrentVolume();
this->setValue(m_value);
// testFunction();
}
void SoundDialog::SetSystemVolume(int value)
{
HRESULT hr;
IMMDeviceEnumerator* pDeviceEnumerator=0;
IMMDevice* pDevice=0;
IAudioEndpointVolume* pAudioEndpointVolume=0;
IAudioClient* pAudioClient=0;
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),NULL,CLSCTX_ALL,__uuidof(IMMDeviceEnumerator),(void**)&pDeviceEnumerator);
hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender,eMultimedia,&pDevice);
hr = pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void**)&pAudioEndpointVolume);
hr = pDevice->Activate(__uuidof(IAudioClient),CLSCTX_ALL,NULL,(void**)&pAudioClient);
if(value == -1)
pAudioEndpointVolume->SetMute(FALSE,NULL); /*取消静音*/
else if(value == -2)
pAudioEndpointVolume->SetMute(TRUE,NULL); /*静音*/
else{
value = (value > 100) ? 100 : (value < 0) ? 0: value; /*将音量限制在0-100内*/
float fVolume;
fVolume = value/100.0f;
hr = pAudioEndpointVolume->SetMasterVolumeLevelScalar(fVolume,&GUID_NULL);
}
pAudioClient->Release();
pAudioEndpointVolume->Release();
pDevice->Release();
pDeviceEnumerator->Release();
}
int SoundDialog::GetCurrentVolume()
{
HRESULT hr;
IMMDeviceEnumerator* pDeviceEnumerator=0;
IMMDevice* pDevice=0;
IAudioEndpointVolume* pAudioEndpointVolume=0;
IAudioClient* pAudioClient=0;
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),NULL,CLSCTX_ALL,__uuidof(IMMDeviceEnumerator),(void**)&pDeviceEnumerator);
hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender,eMultimedia,&pDevice);
hr = pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void**)&pAudioEndpointVolume);
hr = pDevice->Activate(__uuidof(IAudioClient),CLSCTX_ALL,NULL,(void**)&pAudioClient);
float fVolume;
hr = pAudioEndpointVolume->GetMasterVolumeLevelScalar(&fVolume);
pAudioClient->Release();
pAudioEndpointVolume->Release();
pDevice->Release();
pDeviceEnumerator->Release();
int intVolume = fVolume*100+1;
if(intVolume>100)
{
intVolume =100;
}
return intVolume;
}
int SoundDialog::GetSystemVolume2() {
HRESULT hr;
int volume = 0;
IMMDeviceEnumerator *deviceEnumerator = NULL;
IMMDevice *device = NULL;
IAudioEndpointVolume *endpointVolume = NULL;
// Initialize COM.
hr = CoInitialize(NULL);
if (FAILED(hr)) {
qDebug() << "Failed to initialize COM";
return -1;
}
// Create the device enumerator.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&deviceEnumerator);
if (FAILED(hr)) {
qDebug() << "Failed to create the device enumerator";
CoUninitialize();
return -1;
}
// Get the default audio endpoint.
hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &device);
if (FAILED(hr)) {
qDebug() << "Failed to get the default audio endpoint";
deviceEnumerator->Release();
CoUninitialize();
return -1;
}
// Activate the endpoint volume interface.
hr = device->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&endpointVolume);
if (FAILED(hr)) {
qDebug() << "Failed to activate the endpoint volume interface";
device->Release();
deviceEnumerator->Release();
CoUninitialize();
return -1;
}
// Get the current volume.
float fVolume;
hr = endpointVolume->GetMasterVolumeLevelScalar(&fVolume);
if (FAILED(hr)) {
qDebug() << "Failed to get the current volume";
endpointVolume->Release();
device->Release();
deviceEnumerator->Release();
CoUninitialize();
return -1;
}
// Convert to an integer percentage.
volume = static_cast<int>(fVolume * 100);
// Clean up.
endpointVolume->Release();
device->Release();
deviceEnumerator->Release();
CoUninitialize();
return volume;
}
bool SoundDialog::SetSystemVolume2(int volume) {
HRESULT hr;
IMMDeviceEnumerator *deviceEnumerator = NULL;
IMMDevice *device = NULL;
IAudioEndpointVolume *endpointVolume = NULL;
// Initialize COM.
hr = CoInitialize(NULL);
if (FAILED(hr)) {
qDebug() << "Failed to initialize COM";
return false;
}
// Create the device enumerator.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&deviceEnumerator);
if (FAILED(hr)) {
qDebug() << "Failed to create the device enumerator";
CoUninitialize();
return false;
}
// Get the default audio endpoint.
hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &device);
if (FAILED(hr)) {
qDebug() << "Failed to get the default audio endpoint";
deviceEnumerator->Release();
CoUninitialize();
return false;
}
// Activate the endpoint volume interface.
hr = device->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&endpointVolume);
if (FAILED(hr)) {
qDebug() << "Failed to activate the endpoint volume interface";
device->Release();
deviceEnumerator->Release();
CoUninitialize();
return false;
}
// Set the master volume level scalar.
float fVolume = static_cast<float>(volume) / 100.0f;
hr = endpointVolume->SetMasterVolumeLevelScalar(fVolume, NULL);
if (FAILED(hr)) {
qDebug() << "Failed to set the volume";
endpointVolume->Release();
device->Release();
deviceEnumerator->Release();
CoUninitialize();
return false;
}
// Clean up.
endpointVolume->Release();
device->Release();
deviceEnumerator->Release();
CoUninitialize();
return true;
}