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