前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >发布 | 音频设备监听器

发布 | 音频设备监听器

作者头像
Qt君
发布2020-03-19 18:07:58
8140
发布2020-03-19 18:07:58
举报
文章被收录于专栏:跟Qt君学编程

❝可监听音量变化和设备插拔状态变化。❞

对外接口

  • 简化代码:
代码语言:javascript
复制
class AudioDeviceMonitor : public QObject
{
    Q_OBJECT
public:
    AudioDeviceMonitor();
    virtual ~AudioDeviceMonitor();

    static AudioDeviceMonitor *createAudioDeviceMonitor();

signals:
    void deviceStateChanged();
    void volumeStateChanged();

    ...
};
  • 创建监听器(AudioDeviceMonitor)有两种方式方式:
  1. 直接构造创建如:AudioDeviceMonitor monitor;
  2. 通过静态方法createAudioDeviceMonitor()创建,它会在独立的线程中创建资源,不会影响(冲突)主线程的COM资源创建。
  • deviceStateChanged为设备状态变更信号。
  • volumeStateChanged为音量状态变更信号。

音量监听实现

  • 通过实现IAudioEndpointVolumeCallback类并使用IAudioEndpointVolume的RegisterControlChangeNotify注册音量事件监听。
代码语言:javascript
复制
class AudioEndpointVolumeCallback : public IAudioEndpointVolumeCallback
{
    ...
}

m_audioEndpointVolumeCallback = new AudioEndpointVolumeCallback();
m_audioEndpointVolumeCallback->setListener(this); /* 注册事件回调,用于Qt处理 */
m_endpoint->RegisterControlChangeNotify(m_audioEndpointVolumeCallback);
  • 当有音量变化时会触发OnNotify函数,并通过m_listener转发volumeStateChanged信号。
代码语言:javascript
复制
HRESULT STDMETHODCALLTYPE AudioEndpointVolumeCallback::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify)
{
    Q_UNUSED(pNotify)
    if (m_listener) {
        m_listener->volumeStateChanged();
    }

    return S_OK;
}

设备监听实现

  • 通过实现IMMNotificationClient类并使用IAudioEndpointVolume的RegisterEndpointNotificationCallback注册设备状态变更事件。
代码语言:javascript
复制
class DeviceNotificationClient : public IMMNotificationClient
{
    ...
}

m_deviceNotificationClient = new DeviceNotificationClient();
m_deviceNotificationClient->setListener(this);
m_enumerator->RegisterEndpointNotificationCallback(m_deviceNotificationClient);
  • 当设备变更时自动调用OnDeviceStateChanged函数,并通过m_listener转发volumeStateChanged信号。
代码语言:javascript
复制
HRESULT DeviceNotificationClient::OnDeviceStateChanged(LPCWSTR pwstrDeviceId, DWORD dwNewState)
{
    Q_UNUSED(pwstrDeviceId)
    Q_UNUSED(dwNewState)

    if (m_listener) {
        m_listener->deviceStateChanged();
    }

    return S_OK;
}

使用

  使用Qt5风格的信号槽监听。

代码语言:javascript
复制
AudioDeviceMonitor monitor;
QObject::connect(&monitor,
                 &AudioDeviceMonitor::volumeStateChanged,
                 [](){ qDebug() << "Volume changed!"; });

QObject::connect(&monitor,
                 &AudioDeviceMonitor::deviceStateChanged,
                 [](){ qDebug() << "Device status changed!"; });
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对外接口
  • 音量监听实现
  • 设备监听实现
  • 使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档