इस पेज पर, सिंक्रोनस कनेक्शन-ओरिएंटेड (एससीओ) कनेक्शन मैनेज करने के लिए, ऑडियो फ़्रेमवर्क और ऑडियो HAL (एएचएएल) को चालू करने का तरीका बताया गया है. इस प्रोसेस को ऑडियो मैनेज्ड एससीओ (एएमएसको) कहा जाता है.
Android 17 और इसके बाद के वर्शन में, Android ऑडियो फ़्रेमवर्क, एससीओ राउटिंग को मैनेज करने के लिए, एससीओ मैनेजमेंट सुविधा का इस्तेमाल करता है. पहले, इसे ब्लूटूथ (बीटी) फ़्रेमवर्क मैनेज करता था. इस माइग्रेशन से, एससीओ कनेक्शन की स्थिति, बीटी फ़्रेमवर्क के मालिकाना हक वाली स्थिति से बदलकर, ऑडियो स्ट्रीमिंग गतिविधि के डाउनस्ट्रीम नतीजे में आ जाती है.
ऑडियो फ़्रेमवर्क में ऑडियो राउटिंग के मालिकाना हक को केंद्रीकृत करके, यह सुविधा एससीओ के लिए ऑडियो हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) के लागू करने के तरीके को, अन्य बीटी प्रोफ़ाइल के साथ अलाइन करती है. जैसे, ऐडवांस्ड ऑडियो डिस्ट्रिब्यूशन प्रोफ़ाइल (ए2डीपी) और एलई ऑडियो. इस रिफ़ैक्टर से, टेलीकॉम और बीटी स्टैक के बीच इंटरैक्शन आसान हो जाता है. इससे, ऑडियो राउटिंग का ज़्यादा मज़बूत और केंद्रीकृत आर्किटेक्चर मिलता है.
आर्किटेक्चर की खास जानकारी
एएमएसको आर्किटेक्चर, Android ऑडियो फ़्रेमवर्क में एससीओ कनेक्शन मैनेजमेंट को केंद्रीकृत करता है. यह राउटिंग के फ़ैसले, ऑडियो स्ट्रीमिंग गतिविधि के आधार पर लेता है. यह आर्किटेक्चर, पिछले मॉडल से अलग है. पिछले मॉडल में, बीटी स्टैक कनेक्शन मैनेज करता था. इस आर्किटेक्चर में, हर कॉम्पोनेंट की भूमिकाएं इस तरह हैं:
एएचएएल, एससीओ सेशन को सिर्फ़ इन शर्तों के पूरा होने पर शुरू और निलंबित करता है:
- किसी ऐक्टिव स्ट्रीम को एससीओ डिवाइस से जोड़ा गया हो.
- ऑडियो मोड सेट हो और एससीओ डिवाइस से कोई स्ट्रीम जुड़ी हो.
ये खास शर्तें पूरी होने पर, ऑडियो फ़्रेमवर्क, ए2डीपी डिवाइस को एक साथ कई स्ट्रीम से कनेक्ट होने से रोकता है. ऑडियो फ़्रेमवर्क, एससीओ की स्थिति में होने वाले बदलावों या ए2डीपी के निलंबित होने की जानकारी, एएचएएल को नहीं भेजता है.
ऑडियो फ़्रेमवर्क, एससीओ मैनेजमेंट को मैनेज करता है. इसलिए, बीटी स्टैक अब ऑडियो को कनेक्ट या डिसकनेक्ट करने के लिए कॉल नहीं करता है. एससीओ के पहले से डिसकनेक्ट होने या गड़बड़ी होने पर, बीटी स्टैक, ऑडियो फ़्रेमवर्क को AudioManager#onHfpAudioDisconnected के ज़रिए इसकी जानकारी देता है.
प्लान
एससीओ मैनेजमेंट रिफ़ैक्टर को लागू करने से पहले, इस सेक्शन में दी गई जानकारी का इस्तेमाल करके, यहां बताई गई ज़रूरी शर्तें और आर्किटेक्चर की ज़रूरी शर्तें पूरी करें.
पिछले वर्शन के गेम खेलने की सुविधा
फ़्रेमवर्क को ऐसे डिवाइसों के साथ काम करने की सुविधा देने के लिए, जिन्हें अपने एएचएएल या बीटी एएचएएल को अपडेट किए बिना ओएस अपडेट मिल सकते हैं, सिस्टम प्रॉपर्टी का इस्तेमाल करके यह बताया जा सकता है कि नया एससीओ मैनेजमेंट चालू होना चाहिए. अगर सिस्टम प्रॉपर्टी बंद है या एचएएल का वर्शन पुराना है, तो लेगसी पाथ को छह साल तक बनाए रखा जाता है.
एचएफ़पी सेशन सेट अप करना
एएचएएल को, प्लेबैक शुरू या निलंबित करने के लिए, नए हैंड्स-फ़्री प्रोफ़ाइल (एचएफ़पी) सेशन टाइप का इस्तेमाल करना होगा. यह अन्य बीटी सेशन टाइप की तरह ही काम करता है. स्ट्रीम की स्थिति को अलग-अलग IBluetoothAudioProviders का इस्तेमाल करके मैनेज किया जाता है. इन्हें उपलब्ध पाथवे के आधार पर, Factory क्लास से गिना और बनाया जाता है.
बीटी स्टैक, हार्डवेयर ऑफ़लोड पाथ का इस्तेमाल तब करता है, जब ऐसा करना मुमकिन हो. कोडेक के लिए बातचीत के दौरान, इस क्रम में प्राथमिकता दी जाती है: एलसी3 हार्डवेयर को एलसी3 सॉफ़्टवेयर से ज़्यादा प्राथमिकता दी जाती है. इसके बाद, एमएसबीसी हार्डवेयर, फिर एमएसबीसी सॉफ़्टवेयर, और आखिर में सीवीएसडी हार्डवेयर को सीवीएसडी सॉफ़्टवेयर से ज़्यादा प्राथमिकता दी जाती है.
यहां दिए गए सीक्वेंस डायग्राम में, स्ट्रीम की स्थिति सेट अप करने के लिए, एएचएएल और बीटी स्टैक के बीच होने वाले इंटरैक्शन के बारे में बताया गया है.
हार्डवेयर ऑफ़लोड की प्रोसेस
पहली इमेज में दिखाया गया है कि एससीओ ऑडियो के लिए, डायरेक्ट हार्डवेयर डेटा पाथ सेट अप करने के लिए, एएचएएल और बीटी स्टैक कैसे कोऑर्डिनेट करते हैं:
पहली इमेज. हार्डवेयर ऑफ़लोड की प्रोसेस.
सॉफ़्टवेयर डेटा पाथ की प्रोसेस
दूसरी इमेज में, ऑडियो डेटा को मैनेज करने की प्रोसेस दिखाई गई है. इसके लिए, सिस्टम सॉफ़्टवेयर प्रोसेसिंग की ज़रूरत होती है:
दूसरी इमेज. सॉफ़्टवेयर डेटा पाथ की प्रोसेस.
कोडेक की बातचीत की प्रोसेस
जब ऑडियो गेटवे (एजी) को नया बीटी उपलब्ध कोडेक (एटी+बीएसी) कमांड मिलता है, तो एजी, कोडेक की बातचीत की प्रोसेस को रीस्टार्ट करता है. तीसरी इमेज में, कोडेक की बातचीत की प्रोसेस दिखाई गई है:
तीसरी इमेज. कोडेक की बातचीत की प्रोसेस.
HeadsetStateMachine पर असर
Java लेयर हेडसेट स्टेट मशीन (जिसे HeadsetStateMachine क्लास से दिखाया जाता है) में ज़्यादा बदलाव नहीं किए गए हैं. हालांकि, AUDIO_CONNECTED स्थिति में बदलाव किया गया है. यह स्थिति, नेटिव स्टैक इवेंट से तय होती है.
Java लेयर में, सिस्टम अब
connectAudioNative या disconnectAudioNative शुरू नहीं करता है. इसके बजाय, सिस्टम, नेटिव स्टैक से ऑडियो कनेक्शन की स्थिति में होने वाले बदलावों का जवाब देता है. IBluetoothAudioProvider या IBluetoothAudioPort पर, एएचएएल के कमांड से ये बदलाव ट्रिगर होते हैं.
लागू करना
एससीओ मैनेजमेंट रिफ़ैक्टर को इंटिग्रेट करने के लिए, बीटी स्टैक और ऑडियो फ़्रेमवर्क के बीच कम्यूनिकेशन को अपडेट करें.
इस सुविधा को लागू करने के लिए, यह तरीका अपनाएं:
एचएफ़पी डिवाइस कनेक्शन के दौरान, एससीओ को शुरू करने और बंद करने की प्रोसेस को सही तरीके से मैनेज करने और ऐक्टिव डिवाइस में होने वाले बदलावों को मैनेज करने के लिए, ऑडियो फ़्रेमवर्क को ऐक्टिव बीटी में होने वाले बदलावों के बारे में सूचना दें. ऑडियो फ़्रेमवर्क को यह जानकारी देने के लिए,
AudioManager.handleBluetoothActiveDeviceChanged(HfpInfo)का इस्तेमाल करें.
चौथी इमेज. एचएफ़पी डिवाइस कनेक्ट करना.
ऑडियो डिवाइस की स्थिति बताने के लिए, ऑडियो फ़्रेमवर्क, लेगसी ब्रॉडकास्ट के बजाय,
AudioManagerAudioDeviceCallback#onAudioDevicesAddedकॉलबैक का इस्तेमाल करता है.एससीओ कनेक्शन शुरू करने के लिए,
setCommunicationDevice(AudioDeviceInfodevice)का इस्तेमाल करके, एएचएएल स्ट्रीम कंट्रोल लागू करें. यह कंट्रोल का मुख्य पॉइंट है.अगर
HfpTransport::StartRequest,BluetoothAudioCtrlAck::PENDINGदिखाता है, तो एएचएएल को अनुरोध फिर से करना होगा, क्योंकि एचएफ़पी स्टेट मशीन सेट अप नहीं की गई है.
इस्तेमाल के उदाहरण
यहां दिए गए सेक्शन में, आम तौर पर इस्तेमाल होने वाले अहम यूज़र जर्नी (सीयूजे) के बारे में बताया गया है.
टेलीकॉम कॉल फ़्लो
एससीओ मैनेजमेंट रिफ़ैक्टर, phoneStateChanged को ब्लॉकिंग फ़ंक्शन में बदलता है. इस बदलाव की वजह से, टेलीकॉम को BluetoothInCallService.onCallAdded तरीके में, phoneStateChanged के पूरा होने का इंतज़ार करना पड़ता है. इसके बाद ही, वह एससीओ बनाने के लिए, ऑडियो फ़्रेमवर्क एपीआई को कॉल करता है.

पांचवीं इमेज. टेलीकॉम के ज़रिए कॉल का जवाब देना या कॉल करना.
वीओआईपी कॉल फ़्लो
ऑडियो फ़्रेमवर्क, BluetoothHeadset.startScoUsingVirtualVoiceCall तरीके को कॉल करके प्रोसेस शुरू करता है. बीटी स्टैक, ऑडियो फ़्रेमवर्क को नतीजा देने के बाद, फ़्रेमवर्क, एएचएएल को startStream लागू करने का निर्देश देता है. इस फ़्लो को यहां दिखाया गया है:

छठी इमेज. वीओआईपी के ज़रिए कॉल का जवाब देना या कॉल करना.
आवाज़ पहचानने की सुविधा
हैंड्स-फ़्री (एचएफ़) और एजी, दोनों से शुरू की गई आवाज़ पहचानने की सुविधा के लिए, बीटी स्टैक को ऑडियो फ़्रेमवर्क से, AudioManager.setCommunicationDevice का इस्तेमाल करके एससीओ खोलने का अनुरोध करना होगा. इसे यहां दिखाया गया है:

सातवीं इमेज. आवाज़ पहचानने की सुविधा के लिए, एससीओ शुरू करना.
ऑडियो कनेक्शन
आवाज़ पहचानने की सुविधा के दौरान, बीटी स्टैक, ऑडियो फ़्रेमवर्क से
AudioManager.setCommunicationDevice(AudioDeviceInfo) का इस्तेमाल करके एससीओ कनेक्शन का अनुरोध करता है. अगर कोई कॉल ऐक्टिव है, तो बीटी स्टैक, टेलीकॉम स्टैक से BluetoothInCallService#requestBluetoothAudio का अनुरोध करता है.
इस प्रोसेस को यहां दिखाया गया है:

आठवीं इमेज. ऑडियो कनेक्शन.
पुष्टि करना और टेस्ट करना
डिवाइस बनाने वाली कंपनियों को यह पुष्टि करने के लिए कि सुविधा को सही तरीके से इंटिग्रेट किया गया है और यह क्वालिटी स्टैंडर्ड के मुताबिक है, ये टेस्ट करने होंगे:
- CTS Verifier: कॉल के दौरान, ऑडियो राउटिंग की इंटरैक्टिव जांच के लिए, CTS Verifier का इस्तेमाल करें.
- Vendor Test Suite (VTS): VTS का इस्तेमाल करके, एएचएएल और बीटी एएचएएल के इंटरैक्शन की पुष्टि करें.
ज़रूरी शर्तें
इस सुविधा के लिए, ये ज़रूरी शर्तें लागू होती हैं:
- एएचएएल: इसे लागू करने के लिए, ऐसे एएचएएल की ज़रूरत होती है जो रिफ़ैक्टर किए गए एससीओ मैनेजमेंट पाथ के साथ काम कर सके.