objective-c – 耳机插入/拔出时如何获取通知?苹果电脑
发布时间:2020-12-16 05:58:37 所属栏目:百科 来源:网络整理
导读:当耳机插孔插入耳机时,我想收到通知. 我在stackoverflow上搜索了这个,但我似乎找不到我在寻找的Mac,我只能找到iOS. 那么,你有什么想法如何执行这个?我想要做的是:当耳机插拔时,我想以编程方式暂停iTunes(类似iOS的功能). 谢谢! 解决方法 您可以使用CoreAu
当耳机插孔插入耳机时,我想收到通知.
我在stackoverflow上搜索了这个,但我似乎找不到我在寻找的Mac,我只能找到iOS. 那么,你有什么想法如何执行这个?我想要做的是:当耳机插拔时,我想以编程方式暂停iTunes(类似iOS的功能). 谢谢! 解决方法
您可以使用CoreAudio框架观察更改.
耳机和扬声器都是同一个音频输出设备(内置型号)的数据源.其中一个将在基于插入或不插入耳机的音频设备上. 要收到通知,您将收听内置输出设备上活动数据源的更改. 1.获取内置的输出设备 为了保持这个简短,我们将使用默认的输出设备.在大多数情况下,这是内置的输出设备.在现实生活中,您需要循环查找所有可用的设备,因为默认设备可以设置为不同的音频设备(例如soundflower或airplay). AudioDeviceID defaultDevice = 0; UInt32 defaultSize = sizeof(AudioDeviceID); const AudioObjectPropertyAddress defaultAddr = { kAudioHardwarePropertyDefaultOutputDevice,kAudioObjectPropertyScopeGlobal,kAudioObjectPropertyElementMaster }; AudioObjectGetPropertyData(kAudioObjectSystemObject,&defaultAddr,NULL,&defaultSize,&defaultDevice); 2.读取当前的数据源 设备上的当前数据源由UInt32类型的ID标识. AudioObjectPropertyAddress sourceAddr; sourceAddr.mSelector = kAudioDevicePropertyDataSource; sourceAddr.mScope = kAudioDevicePropertyScopeOutput; sourceAddr.mElement = kAudioObjectPropertyElementMaster; UInt32 dataSourceId = 0; UInt32 dataSourceIdSize = sizeof(UInt32); AudioObjectGetPropertyData(defaultDevice,&sourceAddr,&dataSourceIdSize,&dataSourceId); 3.观察数据源的更改 AudioObjectAddPropertyListenerBlock(_defaultDevice,dispatch_get_current_queue(),^(UInt32 inNumberAddresses,const AudioObjectPropertyAddress *inAddresses) { // move to step 2. to read the updated value }); 确定数据源类型 当数据源ID为UInt32时,您可以使用值变换器查询音频对象的属性.例如,将源名称作为字符串使用kAudioDevicePropertyDataSourceNameForIDCFString.这将导致字符串“内部扬声器”或“耳机”.但是这可能会因用户区域而异. 更简单的方法是直接比较数据源ID: if (dataSourceId == 'ispk') { // Recognized as internal speakers } else if (dataSourceId == 'hdpn') { // Recognized as headphones } 然而,我找不到为这些值定义的任何常量,所以这是一种无证的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |