341 lines
8.9 KiB
C++
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;
|
|
}
|