如何在耳机插入/拔出时收到通知?苹果电脑

问题描述 投票:11回答:2

当耳机插入或拔出耳机插孔时,我想收到通知。 我已经在stackoverflow上搜索了这个,但我似乎无法找到我正在寻找的Mac,我只能找到iOS。 那么,您对如何执行此操作有任何想法吗?我想要做的是:当耳机插入时,我想以编程方式暂停iTunes(类似iOS的功能)。 谢谢!

objective-c macos cocoa core-audio headphones
2个回答
22
投票

您可以使用CoreAudio框架观察更改。

耳机和扬声器都是同一音频输出设备(内置类型)的数据源。两者中的一个将基于插入或不插入耳机的音频设备。

要获取通知,您可以监听内置输出设备上活动数据源的更改。

1. Get the built-in output device

为了保持这个简短,我们将使用默认输出设备。在大多数情况下,这是内置输出设备。在实际应用中,您需要循环所有可用设备才能找到它,因为默认设备可以设置为不同的音频设备(例如,音响或播放)。

AudioDeviceID defaultDevice = 0;
UInt32 defaultSize = sizeof(AudioDeviceID);

const AudioObjectPropertyAddress defaultAddr = {
    kAudioHardwarePropertyDefaultOutputDevice,
    kAudioObjectPropertyScopeGlobal,
    kAudioObjectPropertyElementMaster
};

AudioObjectGetPropertyData(kAudioObjectSystemObject, &defaultAddr, 0, NULL, &defaultSize, &defaultDevice); 

2. Read its current data source

设备上的当前数据源由类型为UInt32的ID标识。

AudioObjectPropertyAddress sourceAddr;
sourceAddr.mSelector = kAudioDevicePropertyDataSource;
sourceAddr.mScope = kAudioDevicePropertyScopeOutput;
sourceAddr.mElement = kAudioObjectPropertyElementMaster;

UInt32 dataSourceId = 0;
UInt32 dataSourceIdSize = sizeof(UInt32);
AudioObjectGetPropertyData(defaultDevice, &sourceAddr, 0, NULL, &dataSourceIdSize, &dataSourceId);

3. Observe for changes to the data source

AudioObjectAddPropertyListenerBlock(_defaultDevice, &sourceAddr, dispatch_get_current_queue(), ^(UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses) {
    // move to step 2. to read the updated value
});

Determine the data source type

如果数据源ID为UInt32,则可以使用值转换器查询音频对象的属性。例如,要将源名称作为字符串使用kAudioDevicePropertyDataSourceNameForIDCFString。这将导致字符串“内置扬声器”或“耳机”。但是,这可能因用户区域设置而异。

更简单的方法是直接比较数据源ID:

if (dataSourceId == 'ispk') {
    // Recognized as internal speakers
} else if (dataSourceId == 'hdpn') {
    // Recognized as headphones
}

但是我找不到为这些值定义的任何常量,所以这有点没有文档记录。


0
投票

我正在寻找类似的解决方案,并在应用商店中找到了AutoMute。它运作良好。 https://itunes.apple.com/us/app/automute-preventing-awkward/id1118136179?mt=12我也正在研究自己的一些脚本,并编写了这个脚本来测试耳机是否插入:https://gist.github.com/jordan314/bffa2e6cdbf248f8c558ba6496dcc7ea

© www.soinside.com 2019 - 2024. All rights reserved.