ऑडियो डिवाइसों के बीच ऑडियो रूट करने की सुविधा की मदद से, एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम किया जा सकता है. इस सुविधा का इस्तेमाल करके, खास अधिकार वाले ऐप्लिकेशन, सिस्टम एपीआई के ज़रिए किसी रणनीति के लिए, अपनी पसंद के कई डिवाइस चुन सकते हैं. इस सुविधा के ज़रिए उपलब्ध कराए गए सार्वजनिक एपीआई का इस्तेमाल करके, ऐप्लिकेशन ऑडियो डिवाइसों की क्षमताओं के बारे में ज़्यादा सटीक तरीके से जान सकते हैं. Android 11 और इससे पहले के वर्शन में, ऑडियो फ़्रेमवर्क एक ही तरह के कई ऑडियो डिवाइसों के साथ काम नहीं करता. जैसे, एक साथ कनेक्ट किए गए दो ब्लूटूथ A2DP हेडसेट. ऑडियो को रूट करने के लिए डिफ़ॉल्ट नियमों के तहत, उपयोगकर्ताओं को इस्तेमाल के किसी खास उदाहरण के लिए, एक ही तरह के कई डिवाइस चुनने की अनुमति नहीं होती.
Android 12 से, इन सीमाओं को हटा दिया गया है, ताकि ऑडियो ब्रॉडकास्ट करने, बीएलई ऑडियो हेडफ़ोन के ग्रुप को मल्टीकास्ट करने या एक साथ कई यूएसबी साउंड कार्ड चुनने जैसे नए इस्तेमाल के उदाहरणों को अनुमति दी जा सके. एक साथ कई यूएसबी डिवाइसों पर रूट करने की सुविधा काम नहीं करती.
Android 14 से, यूएसबी फ़्रेमवर्क एक साथ कई यूएसबी डिवाइसों पर ऑडियो रूट करने की सुविधा देता है. हालांकि, इसके लिए ज़रूरी है कि यूएसबी डिवाइस अलग-अलग तरह के ऑडियो डिवाइस हों. साथ ही, एक साथ कई यूएसबी डिवाइसों को कनेक्ट करने के लिए, कर्नल और वेंडर का सपोर्ट उपलब्ध हो.
इस पेज पर, एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा लागू करने का तरीका बताया गया है. साथ ही, इस सुविधा को लागू करने की पुष्टि करने का तरीका भी बताया गया है.
एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने की सुविधा
Android 12 में, इस सुविधा के साथ काम करने वाले एपीआई के दो सेट हैं:
- सिस्टम एपीआई, किसी रणनीति के लिए कई पसंदीदा डिवाइसों को मैनेज करते हैं.
- एचआईडीएल इंटरफ़ेस, ऑडियो एचएएल के हिस्से के तौर पर वेंडर ने लागू किया है. यह डिवाइस की क्षमताओं के बारे में बताता है.
यहां दिए गए सेक्शन में, इन एपीआई के बारे में ज़्यादा जानकारी दी गई है.
किसी रणनीति के लिए, एक से ज़्यादा पसंदीदा डिवाइसों को मैनेज करना
Audio Policy Manager, सिस्टम एपीआई उपलब्ध कराता है. इससे एक साथ कई ऑडियो डिवाइसों पर ऑडियो स्ट्रीम करने में मदद मिलती है. ये सिस्टम एपीआई, किसी रणनीति के लिए एक से ज़्यादा पसंदीदा डिवाइसों को सेट करने, पाने, और हटाने की सुविधा देते हैं. Android 12 से पहले, यह सुविधा सिर्फ़ एक डिवाइस के लिए उपलब्ध थी.
ऑडियो नीति मैनेजर, चालू मीडिया डिवाइसों के कॉन्सेप्ट को पेश करता है. इससे उन डिवाइसों के बारे में पता चलता है जिन पर मीडिया चलाने की सबसे ज़्यादा संभावना होती है. जब कोई अलग किया जा सकने वाला डिवाइस कनेक्ट होता है, तो इस डिवाइस पर रूट की जा सकने वाली ऑडियो एचएएल आउटपुट स्ट्रीम को खोला जाना चाहिए और काम करने वाली एट्रिब्यूट के लिए इसकी जांच की जानी चाहिए.
आउटपुट स्ट्रीम खोलने के लिए, ऑडियो डिवाइस की जानकारी देना ज़रूरी है. चालू मीडिया डिवाइस वह डिवाइस होता है जिसका इस्तेमाल इस संदर्भ में आउटपुट स्ट्रीम खोलने के लिए किया जाता है.
कनेक्ट किए गए या डिसकनेक्ट किए गए डिवाइसों के आधार पर, मीडिया चलाने के लिए चुने गए डिवाइस में बदलाव हो सकता है. Audio Policy Manager, मीडिया चलाने के लिए डिवाइस चुनने के लिए, नियमों की इस सीरीज़ का इस्तेमाल करता है:
- अगर मीडिया के लिए सभी पसंदीदा डिवाइस उपलब्ध हैं, तो उन्हें चालू डिवाइसों के तौर पर चुना जाता है.
- अगर ऐसा नहीं होता है, तो आखिरी बार कनेक्ट किए गए हटाने योग्य डिवाइस को चुना जाता है.
- अगर कोई हटाने लायक डिवाइस कनेक्ट नहीं है, तो आउटपुट डिवाइस चुनने के लिए, ऑडियो से जुड़ी नीति के डिफ़ॉल्ट नियमों को लागू किया जाता है. इससे चालू डिवाइसों को चुना जा सकता है.
आउटपुट स्ट्रीम को फिर से खोलने और चालू डिवाइसों पर रूट करने के लिए, इन शर्तों को पूरा करना होगा, ताकि प्लेबैक के लिए सबसे अच्छा कॉन्फ़िगरेशन चुना जा सके:
- आउटपुट स्ट्रीम, चालू डिवाइसों के साथ काम करनी चाहिए.
- आउटपुट स्ट्रीम में डाइनैमिक प्रोफ़ाइलें काम करनी चाहिए.
- आउटपुट स्ट्रीम को फ़िलहाल चालू डिवाइसों पर रूट नहीं किया जाना चाहिए.
डिवाइस के नए विकल्प को लागू करने के लिए, Audio Policy Manager, डिवाइस के कनेक्ट होने पर आउटपुट स्ट्रीम को बंद करता है और फिर से खोलता है. ऐसा तब होता है, जब आउटपुट स्ट्रीम का इस्तेमाल नहीं किया जा रहा हो. इसके अलावा, वह आउटपुट स्ट्रीम को तब तक के लिए बंद कर देता है, जब तक उसे स्टैंडबाय मोड में नहीं रखा जाता.
ऑडियो पॉलिसी मैनेजर, सिस्टम एपीआई की यह सूची उपलब्ध कराता है. इन्हें AudioManager.java
में बताया गया है:
setPreferredDeviceForStrategy
यह किसी रणनीति के लिए, ऑडियो को रूट करने के लिए पसंदीदा डिवाइस सेट करता है. ध्यान दें कि पसंदीदा डिवाइस सेट करते समय, हो सकता है कि डिवाइस उपलब्ध न हो. हालांकि, उपलब्ध होने पर इसका इस्तेमाल किया जाता है.
removePreferredDeviceForStrategy
इससे,
setPreferredDeviceForStrategy
याsetPreferredDevicesForStrategy
की मदद से पहले सेट किए गए पसंदीदा ऑडियो डिवाइस हट जाते हैं.getPreferredDeviceForStrategy
यह फ़ंक्शन, ऑडियो रणनीति के लिए पहले से सेट किए गए पसंदीदा डिवाइस की जानकारी देता है. इसे
setPreferredDeviceForStrategy
याsetPreferredDevicesForStrategy
की मदद से सेट किया गया था.setPreferredDevicesForStrategy
यह पैरामीटर, किसी रणनीति के लिए पसंदीदा डिवाइसों को सेट करता है.
getPreferredDevicesForStrategy
यह फ़ंक्शन, ऑडियो रणनीति के लिए पसंदीदा डिवाइसों की जानकारी देता है. ये डिवाइस,
setPreferredDeviceForStrategy
याsetPreferredDevicesForStrategy
की मदद से पहले सेट किए गए थे.OnPreferredDevicesForStrategyChangedListener
यह कुकी, पसंदीदा ऑडियो डिवाइसों में होने वाले बदलावों की सूचना देने के लिए इंटरफ़ेस तय करती है. ये डिवाइस, किसी ऑडियो रणनीति के लिए सेट किए जाते हैं.
addOnPreferredDevicesForStrategyChangedListener
यह फ़ंक्शन, रणनीति के हिसाब से पसंदीदा ऑडियो डिवाइस में होने वाले बदलावों की सूचना पाने के लिए, एक लिसनर जोड़ता है.
removeOnPreferredDevicesForStrategyChangedListener
यह फ़ंक्शन, रणनीति के हिसाब से चुने गए ऑडियो डिवाइस में किए गए बदलावों के लिए, पहले से जोड़े गए लिसनर को हटाता है.
डिवाइस की क्षमताओं की रिपोर्ट करना
ऑडियो HAL को लागू करने के लिए, वेंडर ऐसे एपीआई लागू करते हैं जो डिवाइस की क्षमताओं की रिपोर्टिंग में मदद करते हैं. इस सेक्शन में, डिवाइस की क्षमताओं की रिपोर्ट करने के लिए इस्तेमाल किए गए डेटा टाइप और तरीकों के बारे में बताया गया है. साथ ही, इसमें कई डिवाइसों के साथ काम करने के लिए, ऑडियो एचआईडीएल एचएएल V7 में किए गए कुछ बदलावों के बारे में बताया गया है.
डेटा टाइप
ऑडियो एचआईडीएल एचएएल 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
स्ट्रक्चर के साथ तय किया जाता है. इससे डिवाइस की क्षमताओं के बारे में पता चलता है.
ऑडियो एचएएल के तरीके
Audio Policy Manager, डिवाइस की क्षमताओं के बारे में क्वेरी करने के लिए इन तरीकों का इस्तेमाल करता है:
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);
अगर लेगसी get_audio_port
एपीआई का वर्शन 3.2 से कम है और HIDL HAL का वर्शन 7 या इससे ज़्यादा है, तो लेगसी एपीआई से मिले डेटा को नए AudioPort
फ़ॉर्मैट में डालना होगा. इस मामले में, get_audio_port
से रिपोर्ट किए गए सभी सैंपल रेट और चैनल मास्क को, दिखाए गए सभी फ़ॉर्मैट के लिए काम करने वाला माना जाता है. इससे, get_audio_port
की वैल्यू को AudioPort
के नए स्ट्रक्चर पर आसानी से मैप किया जा सकता है.
एपीआई लागू करने के उदाहरण
इस सेक्शन में, कई टेस्ट सुइट के बारे में बताया गया है. इनमें ऐसे तरीके शामिल हैं जो पिछले सेक्शन में बताए गए एपीआई का इस्तेमाल करते हैं. इन एपीआई को लागू करने और इस्तेमाल करने के कुछ उदाहरणों के लिए, इन तरीकों को देखें.
setPreferredDevicesForStrategy
, getPreferredDevicesForStrategy
, removePreferredDeviceForStrategy
, और OnPreferredDevicesForStrategyChangedListener
सिस्टम एपीआई के इस्तेमाल का एक उदाहरण, PreferredDeviceRoutingTest
तरीके में दिया गया है. यह तरीका, GTS में मौजूद है.
AudioDeviceInfo
में इस्तेमाल किए जा रहे नए स्ट्रक्चर का उदाहरण देखने के लिए, CTS में मौजूद AudioManagerTest#testGetDevices
तरीका देखें.
get_audio_port_v7
को लागू करने का उदाहरण, audio_hal.c
में दिया गया है. इसमें बताया गया है कि एक से ज़्यादा डिवाइसों के लिए, सुविधाओं के बारे में कैसे क्वेरी की जाती है.
Validation
इस सेक्शन में, ऑडियो मैनेजर के CTS और GTS (Google Mobile Services Test Suite) की पुष्टि करने के बारे में जानकारी दी गई है.
सीटीएस टेस्ट
CTS टेस्ट, android.media.cts.AudioManagerTest
में मौजूद हैं.
Audio Manager में उपलब्ध टेस्ट की सूची यहां दी गई है:
AudioManagerTest#testGetDevices
इससे ऑडियो डिवाइस की सटीक क्षमताओं की पुष्टि होती है. यह पुष्टि करता है कि
AudioDeviceInfo
स्ट्रक्चर में दिखाई गई ऑडियो प्रोफ़ाइलें, फ़्लैट किए गए पुराने ऐरे फ़ॉर्मैट के कॉन्टेंट को बनाए रखती हैं. हालांकि, ये नएAudioProfile
फ़ॉर्मैट में होती हैं.AudioManagerTest#testPreferredDevicesForStrategy
औरAudioManagerTest#testPreferredDeviceForCapturePreset
पुष्टि करें कि रणनीति और कैप्चर प्रीसेट से जुड़े एपीआई टेस्ट, चुने गए डिवाइसों पर सही तरीके से पूरे हो गए हों.
GTS टेस्ट
GTS टेस्ट, com.google.android.gts.audioservice.AudioServiceHostTest
में मौजूद हैं.
यह पुष्टि करने के लिए कि रणनीति और कैप्चर प्रीसेट के लिए, पसंदीदा डिवाइसों के एपीआई सही तरीके से काम करते हैं या नहीं, AudioServiceHostTest#testPreferredDeviceRouting
और AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset
टेस्ट चलाएं.