ऑडियो डिवाइस को एक साथ रूट करने की सुविधा

ऑडियो डिवाइस को एक साथ कई डिवाइसों से कनेक्ट करने की सुविधा, एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा जोड़ती है. इस सुविधा का इस्तेमाल करके, खास ऐप्लिकेशन, सिस्टम एपीआई की मदद से किसी खास रणनीति के लिए, एक से ज़्यादा डिवाइस चुन सकते हैं. इस सुविधा से मिलने वाले सार्वजनिक एपीआई का इस्तेमाल करके, ऐप्लिकेशन ऑडियो डिवाइसों की क्षमताओं के बारे में ज़्यादा सटीक जानकारी पा सकते हैं. Android के 11 और उससे पहले के वर्शन के लिए, ऑडियो फ़्रेमवर्क को लागू करने की सुविधा, एक ही तरह के कई ऑडियो डिवाइसों के साथ काम करती है. उदाहरण के लिए, एक साथ कनेक्ट किए गए दो ब्लूटूथ A2DP हेडसेट. ऑडियो को डिफ़ॉल्ट रूप से रूट करने के नियमों की वजह से, उपयोगकर्ता किसी खास इस्तेमाल के उदाहरण के लिए, एक ही तरह के एक से ज़्यादा डिवाइस नहीं चुन सकते.

Android 12 से, इन सीमाओं को हटा दिया गया है, ताकि ऑडियो ब्रॉडकास्ट करने, बीएलई ऑडियो हेडफ़ोन के ग्रुप को मल्टीकास्ट करने या एक साथ कई यूएसबी साउंड कार्ड चुनने जैसे नए इस्तेमाल के उदाहरणों की अनुमति दी जा सके. एक ही समय में एक से ज़्यादा यूएसबी डिवाइसों पर रूट नहीं किया जा सकता.

Android 14 से, यूएसबी फ़्रेमवर्क एक से ज़्यादा यूएसबी डिवाइसों से कनेक्ट करने की सुविधा देता है. हालांकि, इसके लिए ज़रूरी है कि यूएसबी डिवाइस अलग-अलग तरह के ऑडियो डिवाइस हों. साथ ही, एक साथ कई यूएसबी डिवाइसों को कनेक्ट करने के लिए, कर्नेल और वेंडर की सहायता उपलब्ध हो.

इस पेज पर, एक से ज़्यादा ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा को लागू करने का तरीका बताया गया है. साथ ही, इस सुविधा को लागू करने की पुष्टि करने का तरीका भी बताया गया है.

एक से ज़्यादा ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा

Android 12 में, इस सुविधा के साथ काम करने वाले एपीआई के दो सेट हैं:

  • सिस्टम एपीआई, किसी रणनीति के लिए एक से ज़्यादा पसंदीदा डिवाइसों को मैनेज करते हैं.
  • एचआईडीएल इंटरफ़ेस, ऑडियो एचएएल के हिस्से के तौर पर वेंडर के लागू किए गए डिवाइस की क्षमताओं की जानकारी देता है.

यहां दिए गए सेक्शन में, इनमें से हर एपीआई के बारे में ज़्यादा जानकारी दी गई है.

किसी रणनीति के लिए, पसंदीदा कई डिवाइसों को मैनेज करना

ऑडियो नीति मैनेजर, सिस्टम एपीआई उपलब्ध कराता है, ताकि एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा बेहतर तरीके से काम कर सके. ये सिस्टम एपीआई, किसी रणनीति के लिए एक से ज़्यादा पसंदीदा डिवाइसों को सेट करने, पाने, और हटाने की सुविधा देते हैं. Android 12 तक, यह सुविधा सिर्फ़ एक डिवाइस के लिए काम करती थी.

ऑडियो नीति मैनेजर, चालू मीडिया डिवाइसों के कॉन्सेप्ट को पेश करता है. इससे उन डिवाइसों के बारे में जानकारी मिलती है जिन्हें मीडिया चलाने के लिए चुना जा सकता है. जब कोई डिटैचेबल डिवाइस कनेक्ट होता है, तो इस डिवाइस पर भेजी जा सकने वाली ऑडियो एचएएल आउटपुट स्ट्रीम को खोलना पड़ सकता है. साथ ही, उन एट्रिब्यूट के लिए जांच करनी पड़ सकती है जो काम करते हैं.

आउटपुट स्ट्रीम खोलते समय, ऑडियो डिवाइस की जानकारी देना ज़रूरी है. ऐक्टिव मीडिया डिवाइस वह डिवाइस होता है जिसका इस्तेमाल, इस संदर्भ में आउटपुट स्ट्रीम खोलने के लिए किया जाता है.

कनेक्ट किए गए या डिसकनेक्ट किए गए डिवाइसों के आधार पर, चालू मीडिया डिवाइस का विकल्प बदल सकता है. ऑडियो नीति मैनेजर, चालू मीडिया डिवाइसों को चुनने के लिए, इन नियमों का इस्तेमाल करता है:

  1. अगर मीडिया के लिए चुने गए सभी डिवाइस उपलब्ध हैं, तो उन्हें सक्रिय डिवाइसों के तौर पर चुना जाता है.
  2. अगर ऐसा नहीं किया जाता है, तो आखिरी बार कनेक्ट किया गया डिवाइस चुना जाता है.
  3. अगर कोई डिवाइस कनेक्ट नहीं है, तो ऑडियो नीति के डिफ़ॉल्ट नियमों के मुताबिक, आउटपुट डिवाइस चुनने के लिए, चालू डिवाइसों को चुना जाता है.

किसी आउटपुट स्ट्रीम को फिर से खोलने और चालू डिवाइसों पर भेजने के लिए, यह ज़रूरी है कि वह इन शर्तों को पूरा करती हो, ताकि प्लेबैक के लिए सबसे अच्छा कॉन्फ़िगरेशन चुना जा सके:

  • आउटपुट स्ट्रीम, चालू डिवाइसों के साथ काम करनी चाहिए.
  • आउटपुट स्ट्रीम में डाइनैमिक प्रोफ़ाइलें काम करनी चाहिए.
  • फ़िलहाल, आउटपुट स्ट्रीम को चालू डिवाइसों पर रूट नहीं किया जाना चाहिए.

डिवाइस के कनेक्ट होने पर, अगर आउटपुट स्ट्रीम बंद है, तो ऑडियो नीति मैनेजर उसे बंद करके फिर से खोलता है. इसके अलावा, अगर आउटपुट स्ट्रीम स्टैंडबाय मोड में है, तो वह उसे स्टैंडबाय मोड से हटाकर फिर से खोलता है. ऐसा, डिवाइस के कनेक्ट होने पर, डिवाइस को चुने जाने के लिए किया जाता है.

ऑडियो पॉलिसी मैनेजर, सिस्टम एपीआई की यह सूची उपलब्ध कराता है(जैसा कि AudioManager.java में बताया गया है):

  • setPreferredDeviceForStrategy

    किसी रणनीति के लिए, ऑडियो रूटिंग के लिए पसंदीदा डिवाइस सेट करता है. ध्यान दें कि डिवाइस को प्राथमिकता देने के लिए सेट करने के समय, हो सकता है कि वह डिवाइस उपलब्ध न हो. हालांकि, उपलब्ध होने पर उसका इस्तेमाल किया जाता है.

  • removePreferredDeviceForStrategy

    इससे, setPreferredDeviceForStrategy या setPreferredDevicesForStrategy की मदद से पहले से सेट किए गए पसंदीदा ऑडियो डिवाइस हट जाते हैं.

  • getPreferredDeviceForStrategy

    setPreferredDeviceForStrategy या setPreferredDevicesForStrategy के साथ पहले से सेट की गई ऑडियो रणनीति के लिए, पसंदीदा डिवाइस दिखाता है.

  • setPreferredDevicesForStrategy

    किसी रणनीति के लिए, पसंदीदा डिवाइसों को सेट करता है.

  • getPreferredDevicesForStrategy

    setPreferredDeviceForStrategy या setPreferredDevicesForStrategy के साथ पहले से सेट की गई ऑडियो रणनीति के लिए, पसंदीदा डिवाइसों की जानकारी दिखाता है.

  • OnPreferredDevicesForStrategyChangedListener

    किसी ऑडियो रणनीति के लिए सेट किए गए, पसंदीदा ऑडियो डिवाइसों में होने वाले बदलावों की सूचना देने के लिए इंटरफ़ेस तय करता है.

  • addOnPreferredDevicesForStrategyChangedListener

    रणनीति के हिसाब से चुने गए ऑडियो डिवाइस में होने वाले बदलावों की सूचना पाने के लिए, एक लिसनर जोड़ता है.

  • removeOnPreferredDevicesForStrategyChangedListener

    रणनीति के हिसाब से चुने गए ऑडियो डिवाइस में किए गए बदलावों के लिए, पहले से जोड़े गए लिसनर को हटाता है.

डिवाइस की क्षमताओं की रिपोर्ट करना

ऑडियो एचएएल लागू करने के लिए, वेंडर ऐसे एपीआई लागू करते हैं जिनसे डिवाइस की क्षमताओं की जानकारी मिलती है. इस सेक्शन में, डिवाइस की क्षमताओं की रिपोर्ट करने के लिए इस्तेमाल किए जाने वाले डेटा टाइप और तरीकों के बारे में बताया गया है. साथ ही, एक से ज़्यादा डिवाइसों के साथ काम करने के लिए, ऑडियो HIDL HAL V7 में किए गए कुछ बदलावों की सूची दी गई है.

डेटा टाइप

ऑडियो HIDL HAL V7 में, डिवाइस की क्षमताओं की जानकारी AudioProfile और AudioTransport स्ट्रक्चर का इस्तेमाल करके दी जाती है. AudioTransport स्ट्रक्चर, AudioProfile के साथ किसी ऑडियो पोर्ट की क्षमता के बारे में बताता है. यह जानकारी, जाने-पहचाने ऑडियो फ़ॉर्मैट के लिए दी जाती है. इसके अलावा, यह जानकारी उन फ़ॉर्मैट के लिए, रॉ हार्डवेयर डिस्क्रिप्टर के साथ दी जाती है जिनके बारे में प्लैटफ़ॉर्म को नहीं पता है. AudioProfile स्ट्रक्चर में ऑडियो फ़ॉर्मैट, प्रोफ़ाइल के साथ काम करने वाले सैंपल रेट, और चैनल मास्क की सूची शामिल होती है. जैसा कि types.hal के इस कोड ब्लॉक में दिखाया गया है:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

ऑडियो HIDL HAL V7 में, AudioPort डेटा टाइप को AudioTransport औरAudioProfile स्ट्रक्चर के साथ तय किया गया है, ताकि डिवाइस की सुविधाओं के बारे में बताया जा सके.

ऑडियो एचएएल के तरीके

डिवाइस की सुविधाओं के बारे में क्वेरी करने के लिए, ऑडियो नीति मैनेजर इन तरीकों का इस्तेमाल करता है:

  • getParameters:वेंडर के हिसाब से पैरामीटर की वैल्यू पाने का सामान्य तरीका. जैसे, इस्तेमाल किए जा सकने वाले ऑडियो फ़ॉर्मैट और उनकी सैंपलिंग रेट.
  • getAudioPort:यह किसी ऑडियो पोर्ट के लिए, काम करने वाले एट्रिब्यूट की सूची दिखाता है. जैसे, सैंपलिंग रेट, फ़ॉर्मैट, चैनल मास्क, और गेन कंट्रोलर.

IDevice.hal का यह कोड, getAudioPort तरीके का इंटरफ़ेस दिखाता है:

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

लेगसी एपीआई में हुए बदलाव

एक से ज़्यादा ऑडियो प्रोफ़ाइलों के साथ काम करने के लिए, लेगसी एपीआई के वर्शन 3.2 में audio_port_v7 नाम का नया स्ट्रक्चर जोड़ा गया है. ज़्यादा जानकारी के लिए, सोर्स कोड देखें.

audio_port_v7 को जोड़ने की वजह से, लेगसी एपीआई के वर्शन 3.2 में get_audio_port_v7 नाम का एक नया एपीआई जोड़ा गया है. इसका मकसद, audio_port_v7 स्ट्रक्चर का इस्तेमाल करके डिवाइसों की क्षमताओं के बारे में क्वेरी करना है.

audio.h के नीचे दिए गए कोड से, get_audio_port_v7 एपीआई की परिभाषा के बारे में पता चलता है:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

अगर लेगसी एपीआई का वर्शन 3.2 से पहले का है और HIDL HAL का वर्शन 7 या उसके बाद का है, तो लेगसी get_audio_port एपीआई का डेटा, नए AudioPort फ़ॉर्मैट में डालना होगा. इस मामले में, get_audio_port से रिपोर्ट किए गए सभी सैंपल रेट और चैनल मास्क, दिखाए गए सभी फ़ॉर्मैट के साथ काम करते हैं. इससे, get_audio_port वैल्यू को नए AudioPort स्ट्रक्चर पर आसानी से मैप किया जा सकता है.

एपीआई को लागू करने का उदाहरण

इस सेक्शन में कई टेस्ट सुइट के बारे में बताया गया है. इनमें ऐसे तरीके शामिल हैं जिनमें पिछले सेक्शन में बताए गए एपीआई का इस्तेमाल किया जाता है. इन एपीआई को लागू करने और इस्तेमाल करने के कुछ उदाहरणों के लिए, इन तरीकों को देखें.

setPreferredDevicesForStrategy, getPreferredDevicesForStrategy, removePreferredDeviceForStrategy, और OnPreferredDevicesForStrategyChangedListener सिस्टम एपीआई के इस्तेमाल का उदाहरण, PreferredDeviceRoutingTest तरीके में दिया गया है. यह तरीका GTS में मौजूद है.

AudioDeviceInfo में इस्तेमाल किए जा रहे नए स्ट्रक्चर का उदाहरण देखने के लिए, AudioManagerTest#testGetDevices का तरीका देखें. यह तरीका, सीटीएस में मौजूद है.

get_audio_port_v7 को लागू करने का उदाहरण, audio_hal.c में दिया गया है. इसमें यह दिखाया गया है कि एक से ज़्यादा डिवाइसों के लिए, सुविधाओं के बारे में क्वेरी कैसे की जाती है.

पुष्टि करें

इस सेक्शन में, ऑडियो मैनेजर की CTS और GTS (Google Mobile Services Test Suite) की पुष्टि के बारे में जानकारी दी गई है.

सीटीएस टेस्ट

सीटीएस टेस्ट android.media.cts.AudioManagerTest में मौजूद हैं.

Audio Manager के लिए उपलब्ध टेस्ट की सूची यहां दी गई है:

  • AudioManagerTest#testGetDevices

    ऑडियो डिवाइस की सटीक क्षमताओं की पुष्टि करता है. यह पुष्टि भी करता है कि AudioDeviceInfo स्ट्रक्चर में, ऑडियो प्रोफ़ाइलों में पुराने, फ़्लैट किए गए कलेक्शन फ़ॉर्मैट का कॉन्टेंट मौजूद है. हालांकि, ये प्रोफ़ाइलें नए AudioProfile फ़ॉर्मैट में हैं.

  • AudioManagerTest#testPreferredDevicesForStrategy और AudioManagerTest#testPreferredDeviceForCapturePreset

    पुष्टि करें कि रणनीति के लिए चुने गए डिवाइसों और कैप्चर से जुड़े प्रीसेट एपीआई टेस्ट सही तरीके से पूरे हो गए हैं.

जीटीएस टेस्ट

GTS टेस्ट com.google.android.gts.audioservice.AudioServiceHostTest में मौजूद हैं.

रणनीति के लिए पसंदीदा डिवाइसों के एपीआई और कैप्चर प्रीसेट के सही तरीके से काम करने की पुष्टि करने के लिए, AudioServiceHostTest#testPreferredDeviceRouting और AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset टेस्ट चलाएं.