2011-05-05 15 views
6

क्या यह पता लगाने का कोई तरीका है कि c या objective-c का उपयोग कर मैक के हेडफ़ोन जैक में कुछ प्लग किया गया है या नहीं?मैक पर हेडफ़ोन जैक में कुछ कैसे पता लगाया जाए?

धन्यवाद

+0

आप वक्ता विन्यास के लिए मैक क्वेरी नहीं कर सकते हैं? – RedX

+0

तो आप यह कैसे करेंगे? – David

उत्तर

7

आप अभी भी में गोता करने के इच्छुक हों और इस गहरे जादू के साथ गड़बड़ मैं एक साथ कोड मैं यहां पाया फार्म कुछ का निर्माण करने में सक्षम था:

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 
     } 

    } 
} 
+0

धन्यवाद, यह वही है जो मुझे चाहिए था। – David

+4

यह केवल आईओएस है। – junglecat

+0

आईओएस 7.0 में ऑडियो सत्र एपीआई पूरी तरह से बहिष्कृत कर दिया गया है –

5

यह "उन चीजों" में से एक है: चीजें आप कभी नहीं, कभी करते हैं या जानने की जरूरत चाहिए। सामान्य विचार यह है कि आप ध्वनि चलाने के लिए प्रदान किए गए एपीआई का उपयोग करते हैं, और ध्वनि उपप्रणाली बाकी की देखभाल करती है।

यदि आपको एक विशिष्ट कॉन्फ़िगरेशन की आवश्यकता है, तो आप उपयोगकर्ता को अपने सिस्टम को एक विशिष्ट तरीके से कॉन्फ़िगर करने के लिए संवाद बॉक्स के माध्यम से पूछ सकते हैं, लेकिन यह इसके बारे में है।

संपादित करें: इस का कारण यह सामान्य और ध्वनि प्रोग्रामिंग में कि चालक प्रोग्रामिंग में विशेष गहरे जादू का गठन किया, और असफल आमतौर पर किसी भी कारण से मशीन के हार्डवेयर लड़ाई के लिए शानदार कोशिश करता है कि किसी भी आवेदन है, लेकिन अक्सर काफी आसानी से ।

जब तक आप मशीनों के ज्ञात, बंद सेट के लिए एंटरप्राइज़ ऐप्स विकसित नहीं कर रहे हैं, मशीन मशीन के बारे में कभी भी धारणाएं न करें: इससे पहले कि आप इसे जानते हों, आईमैक का अगला मॉडल एनालॉग जैक के बिना आता है, जैसा कि बिल्कुल भी है।

और यहां तक ​​कि यदि एनालॉग जैक मौजूद और खाली है, तो ध्वनि को माध्यमिक साउंड कार्ड, या तो ऑन-बोर्ड, पीसीआई या यूएसबी के माध्यम से निर्देशित किया जा सकता है। बिल्ली, अगर मेमोरी परोसा जाता है, तो यहां तक ​​कि फायरवायर ध्वनि कार्ड भी बाहर निकलते हैं।

-3

यह एक छिपी हुई कार्य है जो आपके एम्बेडेड चिप पर मौजूद है (या नहीं)। यदि निर्माण एक एपीआई जारी करता है तो आप इसे नियंत्रित कर सकते हैं, अन्यथा आप नहीं कर सकते हैं।

संबंधित मुद्दे