HIDL Audio HAL

Android 13 और इससे पहले के वर्शन में, ऑडियो एचएएल इंटरफ़ेस को एचआईडीएल एचएएल फ़ाइलों (.hal एक्सटेंशन के साथ) में एचआईडीएल का इस्तेमाल करके तय किया जाता है. साथ ही, कॉन्फ़िगरेशन फ़ाइलों के लिए एक्सएसडी स्कीमा का इस्तेमाल किया जाता है. इन्हें यहां दिखाया गया है.

audio_hal

पहली इमेज. ऑडियो एचएएल इंटरफ़ेस.

कॉन्फ़िगरेशन फ़ाइलें

ऑडियो नीति और ऑडियो इफ़ेक्ट की XML कॉन्फ़िगरेशन फ़ाइलों को, ऑडियो एचआईडीएल एचएएल इंटरफ़ेस का हिस्सा माना जाता है. इन फ़ाइलों को अपने स्कीमा के मुताबिक होना चाहिए. साथ ही, VTS टेस्ट से यह पुष्टि की जाती है कि ये स्कीमा के मुताबिक हैं या नहीं.

ऑडियो HIDL HAL को लागू करने के लिए, आपको एक ऑडियो नीति कॉन्फ़िगरेशन फ़ाइल बनानी होगी. इसमें ऑडियो टोपोलॉजी के बारे में जानकारी दी गई हो. फ़्रेमवर्क को ऑडियो HAL की क्षमताओं का इस्तेमाल करने के लिए, उन्हें audio_policy_configuration.xml फ़ाइल में एलान करना होगा.

Audio HIDL HAL API

इस सेक्शन में, HIDL के लिए Core, Effects, और Common HAL API के बारे में बताया गया है.

कोर HAL

एचआईडीएल का इस्तेमाल करने वाले मुख्य एचएएल के कुछ मुख्य इंटरफ़ेस यहां दिए गए हैं:

  • IDeviceFactory.hal एपीआई का एंट्री पॉइंट है.
  • IDevice.hal और IPrimaryDevice.hal में setMasterVolume या openInputStream जैसे तरीके शामिल होते हैं.
  • स्ट्रीम एकतरफ़ा होती हैं. इनका इस्तेमाल AudioFlinger, HAL को ऑडियो भेजने या उससे ऑडियो पाने के लिए करता है. इसके लिए, IStream.hal, IStreamOut.hal, और IStreamIn.hal का इस्तेमाल किया जाता है.

यहां दी गई टेबल में, काम के कोर एचएएल एचआईडीएल कॉम्पोनेंट की जगह की जानकारी दी गई है:

कोर एचएएल कॉम्पोनेंट जगह की जानकारी
एपीआई का सबसे नया वर्शन /hardware/interfaces/audio/6.0
Core HAL API के नए वर्शन के हिसाब से टाइप /hardware/interfaces/audio/6.0/types.hal
ऑडियो नीति के कॉन्फ़िगरेशन फ़ाइल का XSD स्कीमा /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

Core HAL API (/hardware/interfaces/audio/core/all-versions/default/) का डिफ़ॉल्ट तौर पर लागू किया गया वर्शन, लेगसी शेयर की गई लाइब्रेरी का इस्तेमाल करके, प्री-Treble HAL के लागू किए गए वर्शन के चारों ओर रैपर होता है. डिफ़ॉल्ट तौर पर लागू किए गए ऑडियो एचएएल को, ऐसे ऑडियो एचएएल के नए वर्शन लागू करते समय भी रेफ़रंस के तौर पर इस्तेमाल किया जा सकता है जो सीधे तौर पर कर्नल ड्राइवर के साथ इंटरैक्ट करते हैं.

इफ़ेक्ट एचएएल

यहां दी गई टेबल में, एचआईडीएल का इस्तेमाल करके, Effects HAL के काम के कॉम्पोनेंट की जगह की जानकारी दी गई है:

इफ़ेक्ट एचएएल कॉम्पोनेंट जगह की जानकारी
एपीआई का सबसे नया वर्शन /hardware/interfaces/audio/effect/6.0/
इफ़ेक्ट कॉन्फ़िगरेशन फ़ाइल का XSD स्कीमा /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

ज़्यादा जानकारी के लिए, /hardware/interfaces/audio/effect/all-versions/default/ पर Effects HAL API को लागू करने का सैंपल और ऑडियो इफ़ेक्ट सेक्शन देखें.

कॉमन एचएएल

एचआईडीएल का इस्तेमाल करने वाले Common HAL API में यह शामिल है:

  • Core और Effect API के साथ शेयर की गई परिभाषाएं (/hardware/interfaces/audio/common/6.0/types.hal).
  • इन्हें लागू करने, क्लाइंट, और टेस्ट के लिए, HIDL API के साथ कोडिंग करने में मदद करने के लिए इस्तेमाल की जाने वाली यूटिलिटी (/hardware/interfaces/audio/common/all-versions).

Audio HAL V7 से जुड़े अपडेट

इस सेक्शन में, Android 12 में Audio HAL के वर्शन 7 में हुए अहम बदलावों के बारे में बताया गया है. Audio HAL V7 ये काम करता है:

  • यह फ़्रेमवर्क और HAL के इस्तेमाल किए गए डेटा मॉडल को एक साथ जोड़ता है.
  • इससे, HIDL डेटा टाइप (enum) और ऑडियो नीति कॉन्फ़िगरेशन के लिए इस्तेमाल किए गए एक्सएमएल स्कीमा के बीच डुप्लीकेट होने की समस्या कम हो जाती है.

खास तौर पर, Audio HAL V7 में इन क्षेत्रों में बदलाव किए गए हैं:

इन बदलावों के बारे में, उनसे जुड़े सेक्शन में ज़्यादा जानकारी दी गई है.

इन्यूमरेशन

ऑडियो एचएएल V7 से, ऑडियो नीति कॉन्फ़िगरेशन फ़ाइल में इस्तेमाल किए गए गिने गए टाइप सिर्फ़ XSD स्कीमा में तय किए जाते हैं, न कि HIDL में.

Audio HAL V6 में, types.hal में मौजूद enum टाइप (जैसे कि AudioFormat) की वैल्यू को ऑडियो नीति कॉन्फ़िगरेशन फ़ाइल के XSD स्कीमा में भी तय किया जाता है. इससे डुप्लीकेट वैल्यू बन जाती हैं. V7 में इस समस्या से बचने के लिए, enum टाइप को string में बदल दिया गया है. साथ ही, सभी संभावित इन्यूमरेशन वैल्यू को XSD स्कीमा में लिस्ट किया गया है.

दूसरी इमेज में, V7 में AudioFormat enum टाइप में हुए कुछ बदलावों की तुलना की गई है:

audioformat-change

दूसरी इमेज. AudioFormat enum में किए गए कुछ बदलावों की तुलना.

string में बदले गए इनम टाइप की सूची यहां दी गई है:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: वेंडर एक्सटेंसिबल
  • AudioFormat: Vendor extensible
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

स्ट्रिंग enum वैल्यू पास करें

स्ट्रिंग वैल्यू का इस्तेमाल, HAL इंटरफ़ेस बाउंड्री में गिनती की वैल्यू के तौर पर जानकारी ट्रांसफ़र करने के लिए किया जाता है. फ़्रेमवर्क और HAL रैपर, दोनों ही कारोबार के लॉजिक को लागू करने के लिए पूर्णांक वाली enum वैल्यू का इस्तेमाल करते हैं. साथ ही, तीसरी इमेज में दिखाए गए कन्वर्ज़न के तरीके का इस्तेमाल करते हैं:

audio-passing-values

तीसरी इमेज. स्ट्रिंग ईनम वैल्यू पास करना.

उदाहरण के लिए, फ़्रेमवर्क से वेंडर को ऑडियो फ़ॉर्मैट टाइप की वैल्यू पास करने के लिए:

  1. AudioFormat की enum वैल्यू को libaudiohal में स्ट्रिंग वैल्यू में बदल दिया जाता है और इसे HAL को पास कर दिया जाता है.
  2. HAL की तरफ़, डिफ़ॉल्ट रैपर स्ट्रिंग को enum वैल्यू में बदलता है. यह वैल्यू, लेगसी HAL को पास की जाती है.

एक्सएमएल स्कीमा में हुए बदलाव

एक्सएमएल स्कीमा डेफ़िनिशन (एक्सएसडी) में, इनम वैल्यू की पूरी सूची होने से, वीटीएस को ऑडियो नीति कॉन्फ़िगरेशन की एक्सएमएल फ़ाइल की पुष्टि करने में मदद मिलती है. हमने एचएएल V7 के साथ इस्तेमाल की जाने वाली ऑडियो नीति की कॉन्फ़िगरेशन फ़ाइल में बदलाव किए हैं, ताकि यह XSD के मुताबिक हो.

V7 में, एट्रिब्यूट (जैसे कि सैंपलिंग रेट, चैनल मास्क, और फ़्लैग) में वैल्यू की सूचियों को अलग करने के लिए, स्टैंडर्ड (स्पेस) वर्ण का इस्तेमाल किया जाता है. V6 और इससे पहले के वर्शन में, , (कॉमा) और | (वर्टिकल बार) सिंबल का इस्तेमाल किया जाता था. नीचे दिए गए उदाहरण में दिखाया गया है कि channelMasks के लिए वैल्यू की सूची को अलग करने के लिए स्पेस का इस्तेमाल किया गया है:

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

सिंबल में बदलाव करने के लिए, update_audio_policy_config.sh नाम की ऑटोमैटिक कन्वर्ज़न स्क्रिप्ट का इस्तेमाल करें. Pixel 5 (Redfin) डिवाइस के लिए, V6 ऑडियो नीति की कॉन्फ़िगरेशन फ़ाइल को V7 वर्शन में बदलने के लिए, यह कमांड देखें:

hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0

डेटा टाइप

हमने V7 में कुछ डेटा स्ट्रक्चर को फिर से तय किया है, ताकि डुप्लीकेट डेफ़िनिशन को कम किया जा सके. डेटा आइटम के बार-बार इस्तेमाल किए गए टपल को, फिर से इस्तेमाल किए जा सकने वाले स्ट्रक्चर में ग्रुप किया जाता है. ये डेटा स्ट्रक्चर, HIDL की नई सुविधाओं का इस्तेमाल करते हैं. जैसे, सेफ़ यूनियन.

उदाहरण के लिए, V6 और इससे पहले के वर्शन में, HIDL इंटरफ़ेस और टाइप में अक्सर <format, sampling rate, channel mask> का इस्तेमाल किया जाता है. इस समस्या को दूर करने के लिए, V7 में AudioConfigBaseडेटा टाइप और अन्य डेटा टाइप को इस तरह से तय किया गया है:

  • AudioConfigBase := <format, sampling rate, channel mask>

  • AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>

    AudioConfig, AudioOffloadInfo, AudioPortConfig इसका इस्तेमाल करते हैं

  • AudioProfile := <format, {sampling rates}, {channel masks}>

    AudioPort/PortConfig में मौजूद अलग-अलग कलेक्शन की जगह लेता है

  • AudioPortExtendedInfo := device | mix | session

    AudioPort/PortConfig में यूनियनों की जगह लेता है

वेंडर टैग

डिवाइस टाइप और फ़ॉर्मैट के अलावा, वेंडर ऑडियो ट्रैक के मेटाडेटा के लिए कस्टम टैग जोड़ सकते हैं.

वेंडर, ट्रैक मेटाडेटा को चलाने और रिकॉर्ड करने के लिए, अपने टैग पास कर सकते हैं. इनका इस्तेमाल, ऐप्लिकेशन से एचएएल तक ऑडियो I/O स्ट्रीम में एट्रिब्यूट जोड़ने के लिए किया जाता है.

प्लेबैक ट्रैक के मेटाडेटा के लिए वेंडर टैग जोड़े जाते हैं. इन्हें यहां दिए गए उदाहरण में देखा जा सकता है:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

RecordTrackMetadata स्ट्रक्चर को इसी तरह लागू किया जाता है. इसके लिए, रिकॉर्डिंग ट्रैक के मेटाडेटा के लिए खास टैग जोड़े जाते हैं.

वेंडर एक्सटेंशन के नेमस्पेस की जानकारी

एचएएल V7 से, वेंडर एक्सटेंशन के लिए एक अतिरिक्त {vendor} प्रीफ़िक्स की ज़रूरत होती है. हालांकि, V6 में इसकी ज़रूरत नहीं होती. {vendor} प्रीफ़िक्स के मान्य होने के लिए, इसमें अक्षर और अंक मिलाकर तीन या इससे ज़्यादा वर्ण होने चाहिए.

V7 में इस फ़ॉर्मैट का इस्तेमाल करें:

VX_{vendor}_{letters/numbers}

यहां V7 वेंडर एक्सटेंशन के कुछ मान्य उदाहरण दिए गए हैं:

  • VX_GOOGLE_VR
  • VX_QCI_AMBIENT_MIC

वर्शन की जानकारी

नीचे दी गई टेबल में, Android के हर वर्शन के लिए HAL वर्शन नंबर दिया गया है:

Android वर्शन HIDL HAL वर्शन
Android 13 7.1
Android 12 7.0
Android 11 6.0
Android 10 5.0
Android 9 4.0
Android 8 2.0