2011-09-08 18 views
7

मैं यह पता लगाने की कोशिश कर रहा हूं कि आईफोन/आईपैड/आईपॉड पर कोई भी ऑडियो डिवाइस कनेक्ट है या नहीं। मैं ऑडियो रूट कॉल और रूट चेंज कॉलबैक के बारे में सब कुछ जानता हूं लेकिन ये मुझे जो कुछ जुड़ा हुआ है, उसके बारे में कुछ नहीं बताता है। वे केवल रिपोर्ट करते हैं कि ऑडियो वर्तमान में रूटिंग कर रहा है। उदाहरण के लिए, अगर हेडफ़ोन और/या ब्लूटूथ अभी भी जुड़े हुए हैं, तो ऑडियो को स्पीकर के माध्यम से रूट किया जाता है। या, उदाहरण के लिए, यदि कोई उपयोगकर्ता ब्लूटूथ का उपयोग करते समय हेडसेट में प्लग करता है तो ब्लूटूथ को डिस्कनेक्ट करने का निर्णय लेता है, मुझे यह जानना होगा कि ब्लूटूथ डिस्कनेक्ट हो गया है, भले ही ऑडियो हेडफ़ोन के माध्यम से चल रहा हो।संलग्न ऑडियो डिवाइस का पता लगाएं आईओएस

+1

मैं अपने अनुप्रयोग में एक ऐसी ही समस्या आ रही है, मेरे ऐप सही ढंग से धारा खेल रहा है लेकिन अगर मैं ऑडियो आउटपुट (अनप्लग हेड फोन्स) बदलने के लिए, यह खेलना बंद .. यू figureout किया कि जब ऑडियो आउटपुट बदल गया है पता लगाने के लिए? –

+2

हां, एक रूट परिवर्तन का पता लगाना एक ऑडियो सत्रप्रॉपर्टी लिस्टनर कॉलबैक के माध्यम से होता है। संपत्ति श्रोता तब AudioSessionAddPropertyListener फ़ंक्शन के माध्यम से पंजीकृत होता है। हालांकि यह वही नहीं है जो मैं ऊपर करने की कोशिश कर रहा था। मेरे ऐप में मुझे यह पता लगाने की ज़रूरत है कि कौन से डिवाइस उपयोगकर्ता को उपलब्ध रूटिंग विकल्पों को सही ढंग से प्रदर्शित करने के लिए जुड़े हुए हैं। – Cliff

उत्तर

0

आप ऑडियोसेशन गुणों से इनपुट स्रोतों और आउटपुटडिस्टिशन की एक सूची प्राप्त कर सकते हैं। इन सत्र गुण की जाँच करें:

kAudioSessionProperty_InputSources 
kAudioSessionProperty_OutputDestinations 

और प्रत्येक का ब्यौरा क्वेरी करने के लिए, आप का उपयोग कर सकते हैं:

kAudioSessionProperty_InputSource 
kAudioSessionProperty_OutputDestination 
+0

ये गुण यूएसबी एक्सेसरीज़ के लिए हैं इसलिए वे मेरी स्थिति में लागू नहीं होते हैं। मैं यह पता लगाने के लिए देख रहा हूं कि ब्लूटूथ या वायर्ड हेडसेट कब संलग्न होता है। – Cliff

+0

ओह, मेरी माफ़ी, मैं अब आपके प्रश्न में अंतर देखता हूं। – MOK9

1

iOS 5 के मामले में आप का उपयोग करना चाहिए:

CFStringRef newRoute; 
size = sizeof(CFStringRef); 
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route"); 
if (newRoute) 
{ 
    CFShow(newRoute); 
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in 
      { 
      colorLevels[0] = .3;     
      colorLevels[5] = .5; 
      } 
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo) 
} 
0

दुर्भाग्य से , आईओएस 11 के रूप में, ऐसा लगता है कि वर्तमान में जुड़े आउटपुट डिवाइस की विश्वसनीयता प्राप्त करने के लिए कोई एपीआई नहीं है - जैसे ही वर्तमान मार्ग बदलता है, आप केवल AVAU के माध्यम से 1 डिवाइस (वर्तमान में रूटेड) देखते हैं dioSession का currentRoute.outputs, भले ही कई डिवाइस अभी भी संलग्न हो जाएं।

हालांकि, निवेश के लिए, और कहा कि HFP प्रोफ़ाइल के साथ ब्लूटूथ डिवाइस, शामिल हैं अगर उचित ऑडियो सत्र मोड प्रयोग किया जाता है (AVAudioSessionModeVoiceChat या AVAudioSessionModeVideoChat उदाहरण के लिए), एक AVAudioSession के availableInputs, और उन के माध्यम से उपलब्ध इनपुट की सूची प्राप्त कर सकते हैं जब इनपुट एक सक्रिय मार्ग नहीं होता है तब भी इनपुट सूचीबद्ध होते हैं - यह बहुत उपयोगी होता है जब उपयोगकर्ता ब्लूटूथ से स्पीकर तक MPVolumeView के माध्यम से मैन्युअल ओवरराइड कर रहा है, उदाहरण के लिए, और चूंकि एचएफपी 2-तरफा आईओ है (दोनों इनपुट हैं और आउटपुट), आप यह तय कर सकते हैं कि आउटपुट एचएफपी ब्लूटूथ इनपुट को देखकर अभी भी उपलब्ध है या नहीं।

BOOL isBtInputAvailable = NO; 
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs]; 
for (AVAudioSessionPortDescription* port in inputs) { 
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) { 
     isBtInputAvailable = YES; 
     break; 
    } 
} 
संबंधित मुद्दे