一、source device和sink device的概念

source device:source可以理解为源泉,表示声音的源,即声音产生的地方

sink device:sink可以理解为水槽,表示声音的接受一方

那么就可以理解为声音从source device流出,流到sink device里面

二、获取sink device的音量和是不是静音

#include <iostream>
#include <memory>
#include <vector>
#include <string>#include <pulse/error.h>
#include <pulse/pulseaudio.h>
#include <pulse/simple.h>enum class PulseAudioContextState {PULSE_CONTEXT_INITIALIZING,PULSE_CONTEXT_READY,PULSE_CONTEXT_FINISHED
};struct SinkInfo {pa_cvolume volume;  //音量int mute;           //是不是静音,1表示静音,0表示非静音
};void DisconnectPulseAudioContext(pa_mainloop** pa_ml, pa_context** pa_ctx) {assert(pa_ml);assert(pa_ctx);if (*pa_ctx) {pa_context_set_state_callback(*pa_ctx, NULL, NULL);pa_context_disconnect(*pa_ctx);pa_context_unref(*pa_ctx);}if (*pa_ml) pa_mainloop_free(*pa_ml);*pa_ml = NULL;*pa_ctx = NULL;
}void PaContextStateCallback(pa_context* pa_ctx, void* userdata) {PulseAudioContextState* context_state = (PulseAudioContextState*)userdata;switch (pa_context_get_state(pa_ctx)) {case PA_CONTEXT_FAILED:case PA_CONTEXT_TERMINATED:*context_state = PulseAudioContextState::PULSE_CONTEXT_FINISHED;break;case PA_CONTEXT_READY:*context_state = PulseAudioContextState::PULSE_CONTEXT_READY;break;default:break;}
}int ConnectPulseAudioContext(pa_mainloop** pa_ml, pa_context** pa_ctx,const char* server, const char* description) {int ret;*pa_ml = NULL;*pa_ml = pa_mainloop_new();if (!(*pa_ml)) { return -1; }pa_mainloop_api* pa_mlapi = NULL;pa_mlapi = pa_mainloop_get_api(*pa_ml);if (!pa_mlapi) { return -1; }*pa_ctx = NULL;*pa_ctx = pa_context_new(pa_mlapi, description);if (!(*pa_ctx)) { return -1; }PulseAudioContextState context_state =PulseAudioContextState::PULSE_CONTEXT_INITIALIZING;pa_context_set_state_callback(*pa_ctx, PaContextStateCallback,&context_state);if (pa_context_connect(*pa_ctx, server, PA_CONTEXT_NOFLAGS, NULL) < 0) {return -1;}while (context_state == PulseAudioContextState::PULSE_CONTEXT_INITIALIZING)pa_mainloop_iterate(*pa_ml, 1, NULL);if (context_state == PulseAudioContextState::PULSE_CONTEXT_FINISHED) {return -1;}return 0;
}void PulseAudioSinkDeviceInfoCallback(pa_context* c, const pa_sink_info* info,int eol, void* userdata) {SinkInfo* sink_info = (SinkInfo*)userdata;if (info != nullptr) {sink_info->volume = info->volume;sink_info->mute = info->mute;for (int i = 0; i < info->volume.channels; ++i) {// 打印各个声道的音量std::cout << (info->volume.values[i]*1.0 / info->base_volume)*100 << std::endl;}std::cout << "mute:" << info->mute << std::endl;}
}SinkInfo GetPulseAudioSinkDeviceInfo(const std::string& sink_device) {SinkInfo sink_info;pa_mainloop* pa_ml = nullptr;pa_operation* pa_op = nullptr;pa_context* pa_ctx = nullptr;ConnectPulseAudioContext(&pa_ml, &pa_ctx, nullptr, "audio recorder");std::shared_ptr<void> raii_connect(nullptr, [&](void*) {DisconnectPulseAudioContext(&pa_ml, &pa_ctx);});if (pa_ctx == nullptr) { return sink_info; }pa_op = pa_context_get_sink_info_by_name(pa_ctx, sink_device.c_str(),PulseAudioSinkDeviceInfoCallback,&sink_info);while (pa_operation_get_state(pa_op) == PA_OPERATION_RUNNING) {pa_mainloop_iterate(pa_ml, 1, nullptr);}pa_operation_unref(pa_op);return sink_info;
}void PulseAudioSinkDeviceCallback(pa_context* c, const pa_sink_info* dev,int eol, void* userdata) {std::vector<std::string>* devices = (std::vector<std::string>*)userdata;if (dev != nullptr) { devices->push_back(dev->name); }
}std::vector<std::string> GetPulseAudioSinkDevice() {std::vector<std::string> sink_devices_vec;pa_mainloop* pa_ml = nullptr;pa_operation* pa_op = nullptr;pa_context* pa_ctx = nullptr;ConnectPulseAudioContext(&pa_ml, &pa_ctx, nullptr, "audio recorder");std::shared_ptr<void> raii_connect(nullptr, [&](void*) {DisconnectPulseAudioContext(&pa_ml, &pa_ctx);});if (pa_ctx == nullptr) { return sink_devices_vec; }pa_op = pa_context_get_sink_info_list(pa_ctx, PulseAudioSinkDeviceCallback,&sink_devices_vec);while (pa_operation_get_state(pa_op) == PA_OPERATION_RUNNING) {pa_mainloop_iterate(pa_ml, 1, nullptr);}pa_operation_unref(pa_op);return sink_devices_vec;
}int main(void) {std::vector<std::string> sink_devices_vec = GetPulseAudioSinkDevice();SinkInfo sink_info = GetPulseAudioSinkDeviceInfo(sink_devices_vec[0]);return 0;
}

编译:g++ main.cpp -lpulse -lpulse-simple -o audio_test

运行:./audio_test

linux下使用PulseAudio获取扬声器的音量和是否静音(C++)相关推荐

  1. Linux下通过v4l2获取视频设备名、支持的编解码及视频size列表实现

    早些时候给出了在Windows下通过dshow获取视频设备信息的实现,包括获取视频设备名.获取每种视频设备支持的编解码格式列表.每种编解码格式支持的video size列表,见:https://blo ...

  2. java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

  3. 有关Linux下request.getRealPath(/)获取路径的问题

    request.getRealPath("/") 在window获取的是服务器的根目录,结尾包含分隔符, 如E:\apache-tomcat-6.0.29-bak\apache-t ...

  4. Linux下百度云盘报 获取bdstoken失败

    在用linux下百度云盘工具(bcloud),登录时,报获取bdstoken失败. 在网上搜了一下,解决办法如下. 找到auth.py文件 locate auth.py |grep bcloud 结果 ...

  5. sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息

    上一篇文章介绍了linux下的sigar 库,并使用sigar 库来获取cpu 使用率,本文在这里介绍一下如何使用sigar 库获取内存信息. 和cpu 一样,sigar中有和内存相关的结构体siga ...

  6. linux c 读取摄像头,Linux下onvif客户端获取ipc摄像头 获取能力:GetCapabilities

    getcapabilities:获取能力,主要目的获取设备能力信息(获取媒体服务地址) 鉴权:但是在调用获取设备能力之前是需要鉴权的.onvif协议规定,部分接口需要鉴权,部分接口不需要鉴权,在调用需 ...

  7. linux dmidecode命令,linux下dmidecode命令获取硬件信息

    dmidecode在 Linux 系统下获取有关硬件方面的信息.dmidecode 遵循 SMBIOS/DMI 标准,以一种可读的方式dump出机器的DMI(Desktop Management In ...

  8. linux下从git获取有权限的代码,linux下从源代码安装git

    之所以有这样的需求,是因为部分预安装的git版本太低,很多功能没有并且安全性存在问题. 比如git submodule add xxx@host:yyy.git必须在父repo的root目录安装,而新 ...

  9. 获取linux命令硬盘信息,Linux 下使用命令获取硬盘信息

    本文主要是一些和硬盘相关的命令,包括如何查看硬盘的型号,容量,还有硬盘上的分区情况,来详细了解本机硬盘的状态. hdparm 如果想要在 Linux 下查看硬盘信息,可以使用命令 hdparm .这个 ...

最新文章

  1. html5 div 鼠标跟随,CSS实用:DIV+CSS打造跟随鼠标的层
  2. golang ping go-ping库 简介
  3. 《剑指offer》-- 调整数组顺序使奇数位于偶数前面、顺时针打印矩阵、数字在排序数组中出现的次数
  4. boost::hana::keys用法的测试程序
  5. Mysql捕捉(网站)应用执行的语句
  6. JSt中对象的prototype属性
  7. php array product,PHP array_product()用法及代码示例
  8. java正则 找出数字_Java使用正则表达式实现找出数字功能示例
  9. 支付宝新版SDK-PC扫码支付-手机浏览器H5支付
  10. 微机原理和计算机组成原理一样吗_计算机组成原理:计算机的层次与编程语言...
  11. [Linux] linux服务器主机性能、空间监控脚本
  12. 微软总部首席测试专家做客中关村图书大厦“说法”
  13. java “lambda expressions not supported at this language level“
  14. 哪种修复redis未授权访问漏洞的方法是相对不安全的_redis漏洞复现
  15. VGG16网络结构与代码
  16. matlab node._matlab调用ansys
  17. alpha因子常见问题_因子体系(一):从因子确定到ALPHA和风险的界定
  18. leapftp:425 failed to establish connection解决方法
  19. perl and LWP 文档
  20. 电子元器件企业面临缺货涨价,SRM协同系统助力企业采购数字化智慧升级

热门文章

  1. puppy linux 默认密码,puppylinux使用手册.doc
  2. C# winForm 定时拷贝覆盖文件小工具
  3. 利用VSCode集成并连接远程Linux服务器上的Docker
  4. TrestZone入门解读
  5. 怎么设计一个秒杀系统
  6. MySQL会成为21世纪的公司典范吗?(转)
  7. 自制WIFI放大器(信号真的有增强)
  8. [置顶]R语言 ggplot2包
  9. 粵語中不同男人的称呼
  10. 【ACM-ICPC 2018 沈阳赛区网络预赛】I.Lattice's basics in digital electronics ---- 字典树