037-第三代软件开发-系统音量设置_qml

第三代软件开发-系统音量设置


文章目录

  • 第三代软件开发-系统音量设置
  • 项目介绍
  • 系统音量设置
  • QML 实现
  • C++ 实现
  • 总结一下



关键字:

Qt

Qml

volume

声音

GPT

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!


系统音量设置

先看下效果,重点在C++

037-第三代软件开发-系统音量设置_GPT_02

QML 实现

音量调节的前端实现方式很简单,就是一个Slider 和一个按钮组成

import QtQuick 2.15
import QtQuick.Layouts 1.15                                             // 布局需要
import QtQuick.Controls 2.15
import XXXX 1.0
Popup
{
    id:root
    width: 360
    height: 60
    visible: false
    background: Rectangle
    {
        color:"#24272B"
    }
    RowLayout
    {
        anchors.centerIn: parent
        spacing: 20
        Button
        {
            width: 26
            height: 26
            checkable: true
            checked:(slider_volume.value === 0) ? true : false
            background: Image{
                anchors.centerIn: parent
                width: parent.checked ? 26 : 17
                height: 26
                source: parent.checked ? "qrc:/MainWindow/T_Resource/T_Image/MainWindow/jingyin.png" : "qrc:/MainWindow/T_Resource/T_Image/MainWindow/lb.png"
            }

            onClicked:
            {
                playSound.play()
                if(checked)
                {
                    slider_volume.value = 0;
                }
            }
        }
        Slider
        {
            id:slider_volume
            width: 250
            height: 20
            from: 0
            stepSize: 1
            to:100
            value: Setting.systemVolume
            background: Rectangle {
                x: slider_volume.leftPadding
                y: slider_volume.topPadding + slider_volume.availableHeight / 2 - height / 2
                implicitWidth: 200
                implicitHeight: 4
                width: slider_volume.availableWidth
                height: implicitHeight
                radius: 2
                color: "#bdbebf"

                Rectangle {
                    width: slider_volume.visualPosition * parent.width
                    height: parent.height
                    color: "#51A7DE"
                    radius: 2
                }
            }

            handle: Rectangle {
                x: slider_volume.leftPadding + slider_volume.visualPosition * (slider_volume.availableWidth - width)
                y: slider_volume.topPadding + slider_volume.availableHeight / 2 - height / 2
                implicitWidth: 26
                implicitHeight: 26
                radius: 13
                color: slider_volume.pressed ? "#f0f0f0" : "#f6f6f6"
                border.color: "#bdbebf"
            }

            onValueChanged:
            {
                Setting.systemVolume = value
            }

        }
        Text {
            font.pixelSize: 20
            color: "#56A8DC"
            text: Setting.systemVolume
        }
    }
}

C++ 实现

这里需要系统安装一个库,执行以下代码

sudo apt-get install libasound2-dev

要使用下面函数生效,需要包含头文件

#include "alsa/asoundlib.h"

设置音响实现代码:

/**
 * @brief XXXX::setSystemVolume
 * @param newSystemVolume
 * 设置系统音量
 */
void XXXX::setSystemVolume(int newSystemVolume)
{

#ifdef Q_OS_LINUX
    if (m_systemVolume == newSystemVolume)
        return;
    m_systemVolume = newSystemVolume;
    emit systemVolumeChanged();

    snd_mixer_t *handle;
    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, "default");
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);
    snd_mixer_selem_id_t *sid;
    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, "Master");
    snd_mixer_elem_t *elem = snd_mixer_find_selem(handle, sid);
    snd_mixer_selem_set_playback_volume_all(elem, m_systemVolume * (0xFFFF / 100));
    snd_mixer_close(handle);
#endif
}

设置第一步是不是我们得获取系统音量,代码如下:

/**
 * @brief XXXX::getVolume
 * @return
 * 获取系统音量
 */
int XXXX::getVolume()
{
#ifdef Q_OS_LINUX
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    snd_mixer_elem_t *elem;
    long volume;
    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, "default");
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);
    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, "Master");
    elem = snd_mixer_find_selem(handle, sid);
    snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &volume);
    snd_mixer_close(handle);
    return volume/(0xFFFF / 100);
#endif

#ifdef Q_OS_WIN32
    return 0;
#endif

}

总结一下

如上所述,这段代码不具备普遍性,仅仅适用于Linux,是通过snd_mixer库来实现系统音量的调节。其实也想过使用指令实现,不过没有发现好用的。也问过GPT,不过答案也不理想,和我上面的原理也基本一样。

要在Ubuntu中设置系统音量,您可以使用以下命令:

  1. 调整音量大小:
  • amixer set Master <volume>:将音量设置为指定的值。例如,amixer set Master 50%将音量设置为50%。
  • amixer set Master <volume>%:将音量设置为百分比。例如,amixer set Master 80%将音量设置为80%。
  • amixer set Master <volume>+/-<increment>:增加或减少音量。例如,amixer set Master 5%+将音量增加5%,amixer set Master 5%-将音量减少5%。
  1. 静音和取消静音:
  • amixer set Master mute:将音频静音。
  • amixer set Master unmute:取消音频静音。

请注意,这些命令将直接调整系统的主音量控制器。但请确保您具有适当的权限来执行这些操作。

另一个版本的GPT

要在Ubuntu上设置系统音量,你可以使用amixer命令。以下是一些常用的指令:

  1. 查看当前的音量状态:

amixer get Master

  1. 将音量设置为特定百分比(例如50%):

amixer set Master 50%

  1. 增加音量:

amixer set Master 5%+

  1. 减小音量:

amixer set Master 5%-

请注意,这些命令会更改系统的主音量。你也可以使用其他工具,如pactlalsamixer来调整音量。


037-第三代软件开发-系统音量设置_qt_03