14

ヘッドホンがヘッドホン ジャックに差し込まれたり外されたりしたときに通知を受け取りたいです。
これをstackoverflowで検索しましたが、Macで探しているものが見つからないようです。iOSでしか見つかりません。
それで、これを実行する方法について何かアイデアはありますか?私がこれでやりたいことは、ヘッドフォンが差し込まれているときに、プログラムで iTunes を一時停止したい (iOS のような機能) ことです。
ありがとうございました!

4

2 に答える 2

28

フレームワークを使用して変更を観察できますCoreAudio

ヘッドホンとスピーカーの両方が、同じオーディオ出力デバイス (組み込みタイプ) 上のデータ ソースです。ヘッドフォンが接続されているかどうかに基づいて、両方のいずれかがオーディオ デバイスになります。

通知を受け取るには、組み込みの出力デバイスでアクティブなデータソースの変更をリッスンします。

1. 内蔵出力デバイスを入手する

簡潔にするために、デフォルトの出力デバイスを使用します。ほとんどの場合、これは組み込みの出力デバイスです。実際のアプリケーションでは、使用可能なすべてのデバイスをループして検索する必要があります。これは、既定のデバイスが別のオーディオ デバイス (soundflower や airplay など) に設定されている可能性があるためです。

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

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

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

2. 現在のデータ ソースを読み取る

デバイス上の現在のデータソースは、 type の ID によって識別されますUInt32

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. データ ソースへの変更を観察する

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

データ ソースの種類を決定する

UInt32値トランスフォーマーを使用してオーディオ オブジェクトのプロパティをクエリできるため、データ ソース ID を取得できます。たとえば、ソース名を文字列として取得するには、 を使用しますkAudioDevicePropertyDataSourceNameForIDCFString。これにより、文字列 "Internal Speaker" または "Headphones" が生成されます。ただし、これはユーザーのロケールによって異なる場合があります。

簡単な方法は、データ ソース ID を直接比較することです。

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

ただし、これらの値に対して定義された定数が見つからなかったため、これは文書化されていません。

于 2013-01-23T22:49:14.960 に答える