Как обнаружить что-то в разъеме для наушников на Mac?

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

Спасибо


person David    schedule 05.05.2011    source источник
comment
Вы не можете запросить у Mac конфигурацию динамиков?   -  person RedX    schedule 05.05.2011


Ответы (3)


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

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

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

http://developer.apple.com/library/ios/#ДОКУМЕНТАЦИЯ/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
        }

    }
}
person TurqMage    schedule 09.05.2011
comment
Спасибо, это именно то, что мне было нужно. - person David; 11.05.2011
comment
API AudioSession полностью устарел в iOS 7.0. - person Tom Fishman; 27.03.2014

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

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

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

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

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

person Williham Totland    schedule 05.05.2011

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

person Master C    schedule 05.05.2011