ऑडियो डिवाइस के लिए एक साथ कई रूट तय करना

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

Android 12 और उसके बाद के वर्शन में, ये पाबंदियां हटा दी जाएंगी Google Chat का इस्तेमाल करने पर, ग्रुप को ऑडियो ब्रॉडकास्ट करने, मल्टीकास्ट करने जैसे बनाने या एक साथ कई यूएसबी साउंड कार्ड चुनने का विकल्प होता है. एक साथ कई यूएसबी डिवाइसों पर रूट करने की सुविधा काम नहीं करती.

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

इस पेज में बताया गया है कि कई ऑडियो डिवाइस और अपनी सुविधा के लागू होने की पुष्टि का तरीका इस सुविधा के बारे में बात करते हैं.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • setPreferredDeviceForStrategy

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

  • removePreferredDeviceForStrategy

    इससे उन पसंदीदा ऑडियो डिवाइसों को हटा दिया जाता है जिन्हें पहले सेट किया गया था setPreferredDeviceForStrategy या setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

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

  • setPreferredDevicesForStrategy

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

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

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

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

डेटा टाइप

ऑडियो 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 में होते हैं.

उपलब्ध ऑडियो मैनेजर परीक्षणों की सूची नीचे दी गई है:

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy और AudioManagerTest#testPreferredDeviceForCapturePreset

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

GTS परीक्षण

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

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