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

ऑडियो डिवाइस को एक साथ कई डिवाइसों से कनेक्ट करने की सुविधा, एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा जोड़ती है. इस सुविधा का इस्तेमाल करके, खास ऐप्लिकेशन, सिस्टम एपीआई की मदद से किसी खास रणनीति के लिए, एक से ज़्यादा डिवाइस चुन सकते हैं. इस सुविधा से मिलने वाले सार्वजनिक एपीआई का इस्तेमाल करके, ऐप्लिकेशन ऑडियो डिवाइसों की सुविधाओं के बारे में ज़्यादा सटीक जानकारी पा सकते हैं. 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 टेस्ट करें.