一、前言

还是不想写前言的,这边是接着windows下监听系统扬声器、麦克风的音量、静音事件接着写的。话不多说,直接上代码。

值得注意的是,里面使用object C写的。

|版本声明:山河君,未经博主允许,禁止转载

二、实现

以下代码保证可用,各位可以根据需要进行修改

1.接口

   void addPlayoutListener();void removePlayoutListener();void addRecodingListener();void removeRecodingListenr();//静态方法,将系统事件通过以下回调回来//麦克风静音事件static OSStatus inputMutePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData);//麦克风音量事件static OSStatus inputVolumePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData);//扬声器静音事件static OSStatus outputMutePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData);//扬声器音量事件static OSStatus outputVolumePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData);

2.实现

void AudioDeviceMac::addPlayoutListener(){SpeakerMute(_bSpeakerMute);SpeakerVolume(_nSpeakerVolume);AudioObjectPropertyAddress volumeaddress = {kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,kAudioDevicePropertyScopeOutput,kAudioObjectPropertyElementMaster};//_outputDeviceID 输出设备idOSStatus relsult = AudioObjectAddPropertyListener(_outputDeviceID, &volumeaddress, &AudioDeviceMac::outputVolumePropertyListenerProc, this);WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, 0, "AudioDeviceMac::addPlayoutListener Volume result:%d", relsult);AudioObjectPropertyAddress muteaddress = {kAudioDevicePropertyMute,kAudioDevicePropertyScopeOutput,kAudioObjectPropertyElementMaster};relsult = AudioObjectAddPropertyListener(_outputDeviceID, &muteaddress, &AudioDeviceMac::outputMutePropertyListenerProc, this);WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, 0, "AudioDeviceMac::addPlayoutListener mute result:%d", relsult);}void AudioDeviceMac::removePlayoutListener(){AudioObjectPropertyAddress volumeaddress = {kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,kAudioDevicePropertyScopeOutput,kAudioObjectPropertyElementMaster};OSStatus relsult = AudioObjectRemovePropertyListener(_outputDeviceID, &volumeaddress, &AudioDeviceMac::outputVolumePropertyListenerProc, this);WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, 0, "AudioDeviceMac::removePlayoutListener Volume result:%d", relsult);AudioObjectPropertyAddress muteaddress = {kAudioDevicePropertyMute,kAudioDevicePropertyScopeOutput,kAudioObjectPropertyElementMaster};relsult = AudioObjectRemovePropertyListener(_outputDeviceID, &muteaddress, &AudioDeviceMac::outputMutePropertyListenerProc, this);WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, 0, "AudioDeviceMac::removePlayoutListener mute result:%d", relsult);}void AudioDeviceMac::addRecodingListener(){MicrophoneMute(_bMicMute);MicrophoneVolume(_nMicVolume);AudioObjectPropertyAddress volumeaddress = {kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,kAudioDevicePropertyScopeInput,kAudioObjectPropertyElementMaster};//_inputDeviceID 输入设备idOSStatus relsult = AudioObjectAddPropertyListener(_inputDeviceID, &volumeaddress, &AudioDeviceMac::inputVolumePropertyListenerProc, this);WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, 0, "AudioDeviceMac::addRecodingListener Volume result:%d", relsult);}void AudioDeviceMac::removeRecodingListenr(){AudioObjectPropertyAddress volumeaddress = {kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,kAudioDevicePropertyScopeInput,kAudioObjectPropertyElementMaster};OSStatus relsult = AudioObjectRemovePropertyListener(_inputDeviceID, &volumeaddress, &AudioDeviceMac::inputVolumePropertyListenerProc, this);WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, 0, "AudioDeviceMac::removeRecodingListenr Volume result:%d", relsult);}OSStatus AudioDeviceMac::inputMutePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData){AudioDeviceMac* ptrThis = (AudioDeviceMac*)inClientData;for(UInt32 addressIndex = 0; addressIndex < inNumberAddresses; ++addressIndex) {if (inObjectID != ptrThis->_inputDeviceID) {continue;}AudioObjectPropertyAddress currentAddress = inAddresses[addressIndex];switch(currentAddress.mSelector) {case kAudioDevicePropertyMute:{UInt32 mute;UInt32 propsize = sizeof(UInt32);OSStatus result = AudioObjectGetPropertyData(inObjectID, &currentAddress,0, nullptr, &propsize,&mute);if(kAudioHardwareNoError != result) {continue;}if(ptrThis->_bMicMute != mute){ptrThis->_bMicMute = mute;printf("mic is mute:%d", mute);}break;}default:break;}}return 0;}OSStatus AudioDeviceMac::inputVolumePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData){AudioDeviceMac* ptrThis = (AudioDeviceMac*)inClientData;for(UInt32 addressIndex = 0; addressIndex < inNumberAddresses; ++addressIndex) {if (inObjectID != ptrThis->_inputDeviceID) {continue;}AudioObjectPropertyAddress currentAddress = inAddresses[addressIndex];switch(currentAddress.mSelector) {case kAudioHardwareServiceDeviceProperty_VirtualMasterVolume:{Float32 volume = 0;UInt32 dataSize = sizeof(volume);OSStatus result = AudioObjectGetPropertyData(inObjectID, &currentAddress, 0, NULL, &dataSize, &volume);if(kAudioHardwareNoError != result) {continue;}uint32_t uVolumeLast =volume * MAX_CORE_MICROPHONE_VOLUME;if(ptrThis->_nMicVolume != uVolumeLast){ptrThis->_nMicVolume = uVolumeLast;printf("mic volume:%d", uVolumeLast);}break;}default:break;}}return 0;}OSStatus AudioDeviceMac::outputMutePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData){AudioDeviceMac* ptrThis = (AudioDeviceMac*)inClientData;for(UInt32 addressIndex = 0; addressIndex < inNumberAddresses; ++addressIndex) {if (inObjectID != ptrThis->_outputDeviceID) {continue;}AudioObjectPropertyAddress currentAddress = inAddresses[addressIndex];switch(currentAddress.mSelector) {case kAudioDevicePropertyMute:{UInt32 mute;UInt32 propsize = sizeof(UInt32);OSStatus result = AudioObjectGetPropertyData(inObjectID, &currentAddress,0, nullptr, &propsize,&mute);if(kAudioHardwareNoError != result) {continue;}if(ptrThis->_bSpeakerMute != mute){ptrThis->_bSpeakerMute = mute;printf("speakser is mute:%d", mute);}break;}default:break;}}return 0;}OSStatus AudioDeviceMac::outputVolumePropertyListenerProc( AudioObjectID inObjectID,UInt32 inNumberAddresses,const AudioObjectPropertyAddress inAddresses[],void* inClientData){AudioDeviceMac* ptrThis = (AudioDeviceMac*)inClientData;for(UInt32 addressIndex = 0; addressIndex < inNumberAddresses; ++addressIndex) {if (inObjectID != ptrThis->_outputDeviceID) {continue;}AudioObjectPropertyAddress currentAddress = inAddresses[addressIndex];switch(currentAddress.mSelector) {case kAudioHardwareServiceDeviceProperty_VirtualMasterVolume:{Float32 volume = 0;UInt32 dataSize = sizeof(volume);OSStatus result = AudioObjectGetPropertyData(inObjectID, &currentAddress, 0, NULL, &dataSize, &volume);if(kAudioHardwareNoError != result) {continue;}uint32_t uVolumeLast =volume * MAX_CORE_SPEAKER_VOLUME;if(ptrThis->_nSpeakerVolume != uVolumeLast){ptrThis->_nSpeakerVolume = uVolumeLast;printf("speakser volume:%d", uVolumeLast);}break;}default:break;}}return 0;}

mac os监听扬声器、麦克风的音量、静音相关推荐

  1. windows监听扬声器、麦克风静音、音量事件

    一.前言 不想写前言的,就是想记录一下平常在做和操作系统相关的测试时用的demo,整理一下发出来,具体使用场景根据需求具体对待. 该博客只是记录了在windows下如何监听系统扬声器和麦克风静音.音量 ...

  2. mac os之监听触摸板(捏合、旋转、三指)

    文章目录 前言 一.创建工程实例 二.监听事件 1.捏合事件 步骤一 步骤二 2.捏合事件,以中心为坐标 步骤一 步骤二 3.监听旋转手势 步骤一 步骤二 4.滑动手势 步骤一 步骤二 步骤三 前言 ...

  3. win10下实现PyAudio持续监听并录音(麦克风/扬声器)

    Pyaudio默认是通过麦克风录音,扬声器播放. 实现在win10下,录制扬声器的声音需要设置默认音频设备(否则要修改pyaudio的代码) pyaudio对象结构如下: def __init__(s ...

  4. Android 听筒扬声器切换 并且监听音量变化

    记录一下. 在activity 监听按键: @Override public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode = ...

  5. 监听Mac OS X的全局鼠标事件

    因为Mac OS X下没有给力的鼠标手势软件,所以昨天突然想自己实现个玩玩,便研究了一番怎么监听全局的鼠标事件. 首先不能错过的是Cocoa Event-Handling Guide这篇文档.它详细介 ...

  6. 关于监听Android的静音键以及音量按键

    最近项目中涉及到物理键以及静音的监听,上来就写了个BrocastReceiver,然后注册,处理.但是在测的时候发现,在不同的手机上的这块的onReceive()回调是有不一样的,以下为总结: 1.类 ...

  7. 太恐怖!黑客能把你的耳机变成麦克风用来监听

    北京时间11月24日消息,据外媒报道,目前,有关智能手机恶意件或黑客用来监视/监听用户的新手段的消息可谓层出不穷.信息黄金时代为黑客获取用户信息,甚至窃取钱财提供了更多手段. 以色列本·古里安大学网络 ...

  8. jquery控制只监听数字_无源!模拟!颜值高!简单实用!TC Level Pilot监听音量控制器...

    Level Pilot是一款立体声无源模拟音量控制器,独立于电脑.声卡之外工作,用于有源监听音箱的音量控制,设计简洁,操作手感流畅.很多监听都不带音量旋钮,只能通过声卡或电脑进行音量控制,在手边放一个 ...

  9. iOS 设置系统音量和监听系统音量变化

    很简单的调用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 获取系统音量 // 获取系统音量 MP ...

最新文章

  1. mysql 设置 0、1 用什么数据类型_MySQL索引的基本使用
  2. 成为Python大牛必须要掌握的高端语法(附链接代码)
  3. mysql5.5+版本与mysql5.5之前版本部署主从的一些差异
  4. Python之黏包的解决
  5. 2.4g 无线键鼠对码软件_无线路由器的2.4G和5G同时开速度有影响吗?
  6. Boost:双图bimap与双向地图的测试程序
  7. git 工程工作目录下的git相关文件解释
  8. 我计划搞直播了,欢迎来一起聊一聊
  9. vs2013链接Mysql时出现 (由于找不到libmysql.dll,无法继续执行代码。重新安装程序可能会解决此问题)
  10. 如何查看vantUI官方组件的.vue文件(抛转篇)
  11. IE11浏览器:请不要再叫我IE,谢谢
  12. 事件选择WSAEventSelect
  13. PHP PDO连接mysql,sqlsrv;得到任意2个日期之间的所有日期;递归创建文件
  14. 使用JavaVisualVM远程监控JVM虚拟机
  15. 计算机组成原理基本概念,《计算机组成原理》基本概念.doc
  16. 小程序开发之全栈开发(一)
  17. 荣耀30青春版发布 简单说说有哪些亮点
  18. STM32F429实现USB通过IAP在线升级
  19. java int Integer
  20. 高斯过程 (Gaussian Process)

热门文章

  1. 永洪报表工具_表格软件下载排行榜Top7
  2. 工具类源码 IP辅助类 验证IP地址或地址段是否有效 验证指定的IP是否有效 即验证IP是否属于某个IP段
  3. fastqc检验时不能执行java_fastqc对原始测序reads质控
  4. acwing1113 红与黑
  5. 网优5g前景_5G网络优化工程师的前景和待遇
  6. 第一讲:双活容灾技术和方案概述
  7. office是什么意思
  8. ubuntu开机报错/dev/nume0n1p2:clean解决方案
  9. 如何设置excel回车换行
  10. 快鲸科技邀您一起合作,共同发展