Objective c 如何在耳机插入/拔出时获取通知?雨衣

Objective c 如何在耳机插入/拔出时获取通知?雨衣,objective-c,macos,cocoa,core-audio,headphones,Objective C,Macos,Cocoa,Core Audio,Headphones,我希望在耳机插孔中插入或拔出耳机时得到通知。 我已经在stackoverflow上搜索过了,但我似乎找不到我要找的Mac,我只能找到iOS。 那么,你对如何实现这一点有什么想法吗?我想做的是:当耳机拔出时,我想通过编程暂停iTunes(类似iOS的功能)。 谢谢大家! 您可以使用CoreAudio框架观察更改 耳机和扬声器都是同一音频输出设备(内置型)上的数据源。根据是否插入耳机,两者之一将位于音频设备上 要获取通知,请侦听内置输出设备上活动数据源的更改 1.获取内置的输出设备 为了保持简短,我

我希望在耳机插孔中插入或拔出耳机时得到通知。
我已经在stackoverflow上搜索过了,但我似乎找不到我要找的Mac,我只能找到iOS。
那么,你对如何实现这一点有什么想法吗?我想做的是:当耳机拔出时,我想通过编程暂停iTunes(类似iOS的功能)。

谢谢大家!

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

耳机和扬声器都是同一音频输出设备(内置型)上的数据源。根据是否插入耳机,两者之一将位于音频设备上

要获取通知,请侦听内置输出设备上活动数据源的更改

1.获取内置的输出设备 为了保持简短,我们将使用默认的输出设备。在大多数情况下,这是内置的输出设备。在现实应用程序中,您需要循环所有可用设备以查找它,因为默认设备可以设置为不同的音频设备(例如soundflower或airplay)

2.读取其当前数据源 设备上的当前数据源由类型为
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.观察数据源的更改 确定数据源类型 当数据源id为
UInt32
时,可以使用值转换器查询音频对象的属性。例如,要将源名称作为字符串获取,请使用
kAudioDevicePropertyDataSourceNameForIDCFString
。这将导致字符串“内部扬声器”或“耳机”。但是,这可能因用户区域设置而异

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

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

但是,我找不到为这些值定义的任何常量,因此这是一种未记录的解决方案。

我正在寻找类似的解决方案,并在app store中找到了。它工作得很好

我也在编写自己的一些脚本,并编写测试耳机是否已插入:

#/bin/bash
if system|U profiler SPAudioDataType | grep——静音耳机;然后
插入回音
其他的
回音未插入
fi

我也看到了这个问题。这是iOS版的,不是OSXMy版的。。。当我第一次阅读时,我没有注意到他们提到的iOS。你是在寻找一个真正的耳机(插入式),还是你只是想知道什么时候“某物”被插入(内部扬声器=关闭)。@DigiMonk这个问题就是mori57所说的(他已经删除了评论)。如果你仔细看,这是针对iOS而不是OSX的。但是,我想做的是:当耳机被拔出时,我会通过编程停止iTunes。@adib它看起来是为mac设计的,但答案是为iOSomg设计的,你是救命恩人!它工作得很好!非常感谢你!我只有两个问题:1。我在10.8上测试它,效果很好。它在10.7上能正常工作吗?2.它对应用商店友好吗?我正在寻找一个基于网络的解决方案。浏览器可以连接到CoreAudio框架吗?与iOS API相比,这感觉非常低级。如果有“更快捷”的解决方案,那将是最受欢迎的。@RZKY-Nope
CoreAudio
是一个低级的iOS系统框架,在Safari中运行的JavaScript无法访问。我不知道有任何web API可以检测系统音频输出的类型。(Mozila曾在FireFox
AudioChannel
API中使用过此功能,但从未流行;请参阅)
AudioObjectAddPropertyListenerBlock(_defaultDevice, &sourceAddr, dispatch_get_current_queue(), ^(UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses) {
    // move to step 2. to read the updated value
});
if (dataSourceId == 'ispk') {
    // Recognized as internal speakers
} else if (dataSourceId == 'hdpn') {
    // Recognized as headphones
}