Есть ли способ определить, подключено ли что-то к разъему для наушников Mac, используя c
или objective-c
?
Спасибо
Есть ли способ определить, подключено ли что-то к разъему для наушников Mac, используя c
или objective-c
?
Спасибо
Если вы все еще хотите погрузиться в эту глубокую магию, я смог создать что-то вместе с кодом, который я нашел здесь:
Вы хотите зарегистрировать прослушивание AudioProperties и перехватывать любые сообщения о «kAudioSessionProperty_AudioRouteChange». Используя «причину» и «имя», вы можете проанализировать, что произошло. Вы также можете прочитать больше об этом здесь:
// 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
}
}
}
Это одна из «тех вещей»: вещей, которые вам никогда не нужно делать или знать. Общая идея заключается в том, что вы используете API, предоставляемые для воспроизведения звуков, а звуковая подсистема позаботится обо всем остальном.
Если вам нужна определенная конфигурация, вы можете попросить пользователя через диалоговое окно любезно настроить свою систему определенным образом, но это все.
Редактировать: Причина этого в том, что программирование драйверов в целом и программирование звука в частности представляет собой глубокую магию, и любое приложение, которое по какой-либо причине пытается воздействовать на аппаратное обеспечение машины, обычно терпит неудачу. тонко.
Если вы не разрабатываете корпоративные приложения для известного закрытого набора машин, никогда не делайте предположений об аппаратном обеспечении машины: прежде чем вы это узнаете, следующая модель iMac будет поставляться без аналогового разъема, как и вообще.
И даже если аналоговый разъем присутствует и пуст, звук может быть направлен через дополнительную звуковую карту, встроенную, PCI или USB. Черт возьми, есть даже звуковые карты FireWire, если мне не изменяет память.
Это скрытая функция, которая существует (или не существует) на вашем встроенном чипе. Если производитель выпускает API, вы можете его контролировать, иначе — нет.