Как обнаружить что-то в разъеме для наушников на Mac? - PullRequest
6 голосов
/ 05 мая 2011

Есть ли способ определить, подключено ли что-либо к разъему для наушников на Mac, используя c или objective-c?

Спасибо

Ответы [ 3 ]

7 голосов
/ 10 мая 2011

Если вы все еще хотите погрузиться в эту глубокую магию и поиграться с ней, я смог бы создать что-то вместе из кода, который я нашел здесь:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/54013-hardware-volume-change-listener-callback.html

Вы хотите зарегистрировать прослушивание AudioProperties и перехватывать любые сообщения о kAudioSessionProperty_AudioRouteChange. Используя «причину» и «имя», вы можете разобрать, что произошло. Вы также можете прочитать больше об этом здесь:

http://developer.apple.com/library/ios/#DOCUMENTATION/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

// Registers this class as the delegate of the audio session.
[[AVAudioSession sharedInstance] setDelegate: self];

// Use this code instead to allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];

// Registers the audio route change listener callback function
AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self);

Обратный звонок:

void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ) {
    // ensure that this callback was invoked for a route change
    if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;


    {
        // Determines the reason for the route change, to ensure that it is not
        //      because of a category change.
        CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;

        CFNumberRef routeChangeReasonRef = (CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason) );
        SInt32 routeChangeReason;
        CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);

        if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {

            //Handle Headset Unplugged
        } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) {
                    //Handle Headset plugged in
        }

    }
}
5 голосов
/ 05 мая 2011

Это одна из «тех вещей»: вещи, которые вы никогда не должны делать или знать.Общая идея заключается в том, что вы используете API, предоставляемые для воспроизведения звуков, а звуковая подсистема позаботится обо всем остальном.

Если вам нужна конкретная конфигурация, вы можете попросить пользователя через диалоговое окно любезно настроить его системуопределенным образом, но это все.

Редактировать: Причина этого заключается в том, что программирование драйверов в целом и программирование звука в частности представляют собой глубокую магию, и любое приложение, которое пытается споритьаппаратные средства машины по любой причине обычно выходят из строя эффектно, но часто довольно тонко.

Если вы не разрабатываете корпоративные приложения для известного закрытого набора машин, никогда не делайте предположений об аппаратном обеспечении машины: прежде чем вы это узнаете, следующая модель iMac поставляется без аналогового разъема, как, впрочем, и вовсе.

И даже если аналоговое гнездо присутствует и пусто, звук может быть направлен через дополнительную звуковую карту, либо встроенную, PCI или USB.Черт возьми, там даже плавают звуковые карты FireWire, если память не изменяет.

0 голосов
/ 05 мая 2011

Это скрытая функция, которая существует (или не существует) на вашей встроенной микросхеме.Если производитель выпускает API, вы можете управлять им, в противном случае вы не можете.

...