रेडियो एचएएल ब्रॉडकास्ट करें

इन सेक्शन में, ब्रॉडकास्ट रेडियो को लागू करने के लिए, हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) के साथ काम करने का तरीका बताया गया है.

ब्रॉडकास्ट रेडियो HAL इंटरफ़ेस

ब्रॉडकास्ट रेडियो एचएएल, हार्डवेयर लेवल पर डेटा स्ट्रक्चर और इंटरफ़ेस उपलब्ध कराता है, ताकि एएम/एफ़एम और डीएबी रेडियो जैसे ब्रॉडकास्ट रेडियो को लागू किया जा सके.

HIDL 2.0 और AIDL इंटरफ़ेस

ब्रॉडकास्ट रेडियो एचएएल, नीचे दिए गए सेक्शन में बताए गए इंटरफ़ेस का इस्तेमाल करता है.

IAnnouncementListener

IAnnouncementListener, सूचना सुनने वाले के लिए कॉलबैक इंटरफ़ेस है. इसे सूचनाएं पाने के लिए, ब्रॉडकास्ट रेडियो एचएएल पर रजिस्टर किया जा सकता है. इंटरफ़ेस में ये तरीक़े उपलब्ध हैं:

IAnnouncementListener
ब्यौरा: जब भी सूचना की सूची में बदलाव होता है, तब इसे कॉल किया जाता है.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
एआईडीएल oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle, किसी ऐसे कॉलबैक को हटाने के लिए सामान्य क्लोज़ हैंडल है जिसे ऐक्टिव इंटरफ़ेस की ज़रूरत नहीं होती.

ICloseHandle
जानकारी: हैंडल बंद करें.
HIDL 2.0 close()
एआईडीएल void close()

ITunerCallback

ITunerCallback, ब्रॉडकास्ट रेडियो एचएएल के ज़रिए कॉलबैक इंटरफ़ेस को कॉल किया जाता है, ताकि एचएएल क्लाइंट सेवा को अपडेट भेजा जा सके.

ITunerCallback
जानकारी: एचएएल, ट्यूनिंग ऑपरेशन (ट्यून, ढूंढें (एआईडीएल में) या स्कैन (एचआईडीएल में) और चरण पूरा होने पर) के असींक्रोनस तरीके से पूरा न होने पर, इसे कॉल करता है.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
एआईडीएल void onCurrentProgramInfoChanged(in ProgramInfo info)
जानकारी: ट्यून, स्कीन (एआईडीएल में) या स्कैन (एचआईडीएल में) होने पर या चरण पूरा होने पर कॉल किया जाता है.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
एआईडीएल void onTuneFailed(in Result result, in ProgramSelector selector)
जानकारी: ट्यून, स्कीन (एआईडीएल में) या स्कैन (एचआईडीएल में) होने पर या चरण पूरा होने पर कॉल किया जाता है.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
एआईडीएल void onCurrentProgramInfoChanged(in ProgramInfo info)
जानकारी: प्रोग्राम की सूची अपडेट होने पर कॉल किया जाता है; हर चंक का साइज़ 500 कि॰ब॰ तक होना चाहिए.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
एआईडीएल oneway onProgramListUpdated(ProgramListChunk chunk)
ब्यौरा: ऐन्टेना कनेक्ट होने या डिसकनेक्ट होने पर, इसे कॉल किया जाता है.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
एआईडीएल void onCurrentProgramInfoChanged(in ProgramInfo info)
ब्यौरा: जब वेंडर के हिसाब से पैरामीटर की वैल्यू, एचएएल में अंदरूनी तौर पर अपडेट की जाती हैं, तब इसे कॉल किया जाता है. एचएएल क्लाइंट से setParameters को कॉल करने के बाद, इसे कॉल न करें.
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
एआईडीएल void onParametersUpdated(in VendorKeyValue[] parameters)
जानकारी: यह सुविधा, AIDL में नई है. जब कॉन्फ़िगरेशन फ़्लैग को एचएएल में अंदरूनी तौर पर अपडेट किया जाता है, तब इसे कॉल किया जाता है. एचएएल क्लाइंट के setConfigFlag को कॉल करने के बाद, इसे कॉल नहीं किया जाना चाहिए.
HIDL 2.0 लागू नहीं.
एआईडीएल void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio, ब्रॉडकास्ट रेडियो एचएएल का मुख्य इंटरफ़ेस है. HIDL 2.0 HAL में, ट्यूनर के लिए ITunerSession इंटरफ़ेस का इस्तेमाल करके ऑपरेशन कॉल करें. हालांकि, एक बार में ज़्यादा से ज़्यादा एक ट्यूनर चालू होता है. ऐसा तब होता है, जब हर ब्रॉडकास्ट रेडियो एचएएल इंस्टेंस में सिर्फ़ एक ट्यूनर चिप हो. ITunerSession को एआईडीएल इंटरफ़ेस से हटा दिया गया था और इसके इंटरफ़ेस को IBroadcastRadio पर ले जाया गया था.

IBroadcastRadio
जानकारी: किसी मॉड्यूल और उसकी सुविधाओं के बारे में जानकारी पाएं.
HIDL 2.0 getProperties() generates (Properties properties)
एआईडीएल Properties getProperties()
ब्यौरा: AM/FM क्षेत्र के मौजूदा या संभावित कॉन्फ़िगरेशन को फ़ेच करता है.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
एआईडीएल AmFmRegionConfig getAmFmRegionConfig(bool full)
जानकारी: डीएबी क्षेत्र के मौजूदा कॉन्फ़िगरेशन को फ़ेच करता है.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
एआईडीएल DabTableEntry[] getDabRegionConfig()
ब्यौरा: रेडियो मॉड्यूल कैश मेमोरी से इमेज पाता है. AIDL में, इमेज का साइज़ 1 एमबी से कम होना चाहिए. ऐसा इसलिए है, क्योंकि बाइंडर ट्रांज़ैक्शन बफ़र की तय सीमा है.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
एआईडीएल byte[] getImage(in int id)
जानकारी: यह एलान सुनने वाले को रजिस्टर करता है.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
एआईडीएल ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
जानकारी:
  • HIDL HAL: नया ट्यूनर सेशन खोलने पर, पुराने सेशन को बंद कर देना चाहिए.
  • एआईडीएल एचएएल: कोई ट्यूनर सेशन उपलब्ध न होने की वजह से, सिर्फ़ ट्यूनर कॉलबैक सेट करना ज़रूरी है. अगर यह मौजूद है, तो पुराने कॉलबैक को अनसेट किया जाना चाहिए.
HIDL 2.0 openSession(ITunerCallback callback) जनरेट करता है (Result result, ITunerSession session)
एआईडीएल void setTunerCallback(in ITunerCallback callback)
जानकारी:
  • HIDL HAL: ट्यूनर सेशन को बंद करने में कोई गड़बड़ी नहीं होनी चाहिए. साथ ही, इसे सिर्फ़ एक बार जारी किया जाना चाहिए.
  • AIDL HAL: इसमें कोई ट्यूनर नहीं होता और सिर्फ़ ट्यूनर कॉलबैक को अनसेट करना होता है.
HIDL 2.0 close()
एआईडीएल unsetTunerCallback()
ब्यौरा: किसी खास प्रोग्राम को ट्यून करता है.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
एआईडीएल void tune(in ProgramSelector program)
जानकारी: एयर पर चल रहे अगले मान्य प्रोग्राम को खोजता है. AIDL में भ्रम से बचने के लिए, scan का नाम बदलकर seek कर दिया गया है.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
एआईडीएल void seek(in boolean directionUp, in boolean skipSubChannel)
जानकारी: अगले चैनल पर जाने का तरीका. यह चैनल, किसी प्रोग्राम के लिए उपलब्ध नहीं होना चाहिए.
HIDL 2.0 step(bool directionUp) generates (Result result)
एआईडीएल void step(in boolean directionUp)
ब्यौरा: यह ट्यून, स्कैन (HIDL में) या स्कीक (एआईडीएल में) या चरण के ऑपरेशन को रद्द करता है.
HIDL 2.0 cancel()
एआईडीएल void cancel()
ब्यौरा: प्रोग्राम की सूची पर फ़िल्टर लागू करता है और onProgramListUpdated कॉलबैक के ज़रिए प्रोग्राम की सूची के अपडेट भेजना शुरू करता है.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
एआईडीएल void startProgramListUpdates(in ProgramFilter filter)
जानकारी: प्रोग्राम की सूची के अपडेट भेजना बंद कर देता है.
HIDL 2.0 stopProgramListUpdates()
एआईडीएल void stopProgramListUpdates()
ब्यौरा: यह फ़ंक्शन, किसी दिए गए कॉन्फ़िगरेशन फ़्लैग की मौजूदा सेटिंग फ़ेच करता है.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
एआईडीएल boolean isConfigFlagSet(in ConfigFlag flag)
ब्यौरा: यह दिए गए कॉन्फ़िगरेशन फ़्लैग को सेट करता है.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
एआईडीएल void setConfigFlag(in ConfigFlag flag, boolean value)
ब्यौरा: वेंडर के हिसाब से पैरामीटर वैल्यू सेट करता है.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

जनरेट करता है,

(vec<VendorKeyValue> results)
एआईडीएल VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
ब्यौरा: वेंडर के हिसाब से पैरामीटर वैल्यू दिखाता है.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
एआईडीएल VendorKeyValue[] getParameters(in String[] keys)

इंटरफ़ेस के बारे में जानकारी

एसिंक्रोनस व्यवहार

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

  • ट्यूनिंग से जुड़ी सभी कार्रवाइयां रद्द करें.
  • देखें कि तरीके के इनपुट और ट्यूनर के स्टेटस के आधार पर, ऑपरेशन को प्रोसेस किया जा सकता है या नहीं.
  • ट्यूनिंग टास्क शेड्यूल करें और फिर तुरंत Result (HIDL में) या status (एआईडीएल में) दिखाएं. अगर Result या status OK है, तो ट्यून करने का टास्क पूरा होने या पूरा न होने (उदाहरण के लिए, टाइम आउट की वजह से) पर, ट्यूनर कॉलबैक tuneFailed या currentProgramInfoChanged को कॉल किया जाना चाहिए.

इसी तरह, startProgramListUpdates प्रोग्राम की सूची को अपडेट करने के टास्क को भी शेड्यूल करता है, ताकि बाद में यह टास्क पूरा हो सके और स्टेटस या नतीजा तुरंत दिखाया जा सके. इस तरीके में, सबसे पहले अपडेट के उन अनुरोधों को रद्द किया जाता है जो पूरे नहीं हुए हैं. इसके बाद, अपडेट करने का टास्क शेड्यूल किया जाता है और तुरंत नतीजा दिखाया जाता है.

रेस कंडीशन

ट्यूनिंग ऑपरेशन (उदाहरण के लिए, ट्यून, स्कैन (HIDL में) या रीसेक (एआईडीएल में) और चरण) के असाइनॉन्स तरीके की वजह से, ऑपरेशन रद्द करने और ट्यूनिंग ऑपरेशन के बीच रेस कंडीशन मौजूद होती है. अगर cancel को HAL के ट्यूनिंग ऑपरेशन के पूरा होने के बाद और कॉलबैक के पूरा होने से पहले कॉल किया जाता है, तो रद्द करने की कार्रवाई को अनदेखा किया जा सकता है. साथ ही, कॉलबैक पूरा हो जाना चाहिए और HAL क्लाइंट को मिल जाना चाहिए.

इसी तरह, अगर HAL ने प्रोग्राम की सूची का अपडेट पूरा करने के बाद और onCurrentProgramInfoChanged कॉलबैक पूरा होने से पहले stopProgramListUpdates को कॉल किया है, तो stopProgramListUpdates को अनदेखा किया जा सकता है और कॉलबैक पूरा हो जाना चाहिए.

डेटा के साइज़ की सीमा

बाइंडर ट्रांज़ैक्शन बफ़र की तय सीमा होती है. इसलिए, AIDL HAL में कुछ इंटरफ़ेस के तरीकों के लिए डेटा की सीमा के बारे में बताया गया है. ये ऐसे तरीके हैं जिनसे बहुत ज़्यादा डेटा पास किया जा सकता है.

  • getImage के लिए, यह ज़रूरी है कि इमेज का साइज़ 1 एमबी से कम हो.
  • onProgramListUpdate के लिए, हर chunk का साइज़ 500 कि॰ब॰ से कम होना चाहिए. बड़ी प्रोग्राम सूचियों को एचएएल लागू करने के बाद, कई हिस्सों में बांटकर, कई कॉलबैक के ज़रिए भेजा जाना चाहिए.

AIDL HAL डेटा स्ट्रक्चर में हुए बदलाव

इंटरफ़ेस में किए गए बदलावों के अलावा, ये बदलाव ब्रॉडकास्ट रेडियो एआईडीएल एचएएल में तय किए गए डेटा स्ट्रक्चर पर भी लागू किए गए हैं. यह एआईडीएल का फ़ायदा लेता है.

  • Constant enum को AIDL में हटा दिया गया है और इसे IBroadcastRadio में const int के तौर पर परिभाषित किया गया है. इस दौरान, ANTENNA_DISCONNECTED_TIMEOUT_MS का नाम बदलकर ANTENNA_STATE_CHANGE_TIMEOUT_MS कर दिया जाता है. एक नया const int TUNER_TIMEOUT_MS जोड़ा गया है. इस समयसीमा के अंदर, सभी ट्यून, सर्च, और चरण के ऑपरेशन पूरे होने चाहिए.
  • AIDL में, Enum RDS और Deemphasis को हटा दिया गया है और AmFmRegionConfig में, इन्हें const int के तौर पर परिभाषित किया गया है. इसी तरह, ProgramInfo में fmDeemphasis और fmRds, दोनों को int के तौर पर घोषित किया गया है. यह, संबंधित फ़्लैग के बिट कैलकुलेशन का नतीजा है. इस दौरान, D50 और D75 का नाम बदलकर, DEEMPHASIS_D50 और DEEMPHASIS_D75 कर दिया गया है.
  • AIDL में Enum ProgramInfoFlags हटा दिए गए हैं और ProgramInfo में const int के तौर पर परिभाषित किए गए हैं. साथ ही, इनमें FLAG_ प्रीफ़िक्स जोड़ा गया है. इसी तरह, ProgramInfo में infoFlags को int के तौर पर घोषित किया गया है, जो कि फ़्लैग के हिसाब से बिट कैलकुलेशन का नतीजा है. TUNED का नाम भी बदलकर FLAG_TUNABLE कर दिया गया है, ताकि इसकी परिभाषा को बेहतर तरीके से बताया जा सके कि स्टेशन को किस पर ट्यून किया जा सकता है.
  • AmFmBandRange में, scanSpacing का नाम बदलकर seekSpacing कर दिया गया है, क्योंकि एआईडीएल में scan का नाम बदलकर seek कर दिया गया है.
  • AIDL में यूनियन का कॉन्सेप्ट पेश किया गया है. इसलिए, HIDL HAL में बताए गए MetadataKey और Metadata का अब इस्तेमाल नहीं किया जाता. AIDL यूनियन Metadata को AIDL HAL में परिभाषित किया गया है. MetadataKey में पहले मौजूद हर वैल्यू, अब Metadata में एक फ़ील्ड है. इसकी वैल्यू, स्ट्रिंग या int टाइप की हो सकती है. यह वैल्यू, वैल्यू की परिभाषाओं पर निर्भर करती है.

डीएबी रेडियो की सुविधा

इस सेक्शन में, डीएबी रेडियो के साथ काम करने की सुविधा के बारे में बताया गया है.

आइडेंटिफ़ायर

AIDL ब्रॉडकास्ट रेडियो एचएएल में, डीएबी और डीएमबी रेडियो के लिए प्राइमरी आइडेंटिफ़ायर टाइप DAB_SID_EXT है. DAB_SID_EXT, 32-बिट सेवा आइडेंटिफ़ायर (एसआईडी) का इस्तेमाल करता है, ताकि वह DAB और DMB रेडियो, दोनों के एसआईडी को दिखा सके.

मुख्य आइडेंटिफ़ायर के अलावा, DAB_ENSEMBLE और DAB_FREQUENCY_KHZ जैसे सेकंडरी आइडेंटिफ़ायर का भी इस्तेमाल किया जा सकता है. यह ज़रूरी है, क्योंकि एक से ज़्यादा DAB स्टेशन एक ही DAB_SID_EXT को शेयर कर सकते हैं. हालांकि, उनके पास अलग-अलग DAB_ENSEMBLE या DAB_FREQUENCY_KHZ वैल्यू हो सकती हैं. प्रोग्राम की सूची के सटीक अपडेट की पुष्टि करने के लिए, एक ही DAB_SID_EXT वाले स्टेशनों को ITunerCallback#onProgramListUpdated का इस्तेमाल करके एक साथ अपडेट किया जाता है. इसके बाद, यह अपडेट ब्रॉडकास्ट रेडियो सेवा और रेडियो मैनेजर को भेजा जाता है. आखिर में, android.hardware.radio.ProgramList के ज़रिए रेडियो ऐप्लिकेशन को भेजा जाता है.

मेटाडेटा

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

मेटाडेटा फ़ील्ड ब्यौरा
dabEnsembleName (छोटा रूप: dabEnsembleNameShort) डीएबी स्टेशन के एन्सेम्बल का नाम
dabServiceName (dabServiceNameShort से छोटा किया गया) डीएबी स्टेशन की सेवा का नाम
dabComponentName (dabComponentNameShort से छोटा किया गया) डीएबी स्टेशन के कॉम्पोनेंट का नाम

एचडी रेडियो की सुविधा

इस सेक्शन में, एचडी रेडियो की सुविधा के बारे में बताया गया है.

आइडेंटिफ़ायर

HD_STATION_ID_EXT, एचडी रेडियो स्टेशन के लिए प्राइमरी आइडेंटिफ़ायर के तौर पर काम करता है. स्टेशन की पहचान को और बेहतर बनाने के लिए, HD_STATION_NAME और HD_STATION_LOCATION जैसे सेकंडरी आइडेंटिफ़ायर भी दिए जाते हैं. HD_STATION_LOCATION, जो जगह की जानकारी देता है. इसे Android 15 में लॉन्च किया गया था.

डिजिटल रेडियो को चालू या बंद करना

Android 15 से, ConfigFlag में बदलाव करके, डिजिटल रेडियो (जैसे कि एचडी रेडियो) को चालू या बंद किया जा सकता है. एफ़एम रेडियो के लिए इस सेटिंग को कंट्रोल करने के लिए, FORCE_ANALOG_FM फ़्लैग का इस्तेमाल करें. एएम रेडियो के लिए, FORCE_ANALOG_AM फ़्लैग का इस्तेमाल करें. फ़्लैग को false पर सेट करने से एचडी रेडियो चालू हो जाता है. वहीं, इसे true पर सेट करने से एनालॉग एएम/एफ़एम रेडियो चालू हो जाता है.

एचडी चैनल उपलब्ध हैं

Android 15 से, एचडी रेडियो स्टेशन के लिए फ़िलहाल उपलब्ध एचडी चैनलों को ProgramInfo.metadata में 8 बिट के बिट मास्क, Metadata#hdSubChannelsAvailable के ज़रिए दिखाया जा सकता है. उदाहरण के लिए, बाईं ओर मौजूद बिट 1 की वैल्यू से पता चलता है कि HD2 सबचैनल, इस एचडी स्टेशन के लिए उपलब्ध है या नहीं.

सिग्नल हासिल करने की स्थिति

Android 15 और उसके बाद के वर्शन में, रेडियो ऐप्लिकेशन उपयोगकर्ताओं को एचडी रेडियो स्टेशन के सिग्नल हासिल करने की स्थिति दिखा सकते हैं. यह सुविधा इसलिए मददगार है, क्योंकि एचडी क्वालिटी में बेहतर सिग्नल पाने में कभी-कभी कुछ समय लग सकता है.

यह जानकारी देने के लिए, सिस्टम ProgramInfo.infoFlags का इस्तेमाल करके स्थिति को ट्रैक करता है और ITunerCallback#onCurrentProgramInfoChanged. के ज़रिए रेडियो ऐप्लिकेशन को अपडेट करता है

ProgramInfo.infoFlags में स्टेटस को इस तरह दिखाया जाता है:

  • छठा बिट: इससे पता चलता है कि एचडी रेडियो सिग्नल मिला है या नहीं.
  • सातवां बिट: इससे पता चलता है कि स्टेशन इन्फ़ॉर्मेशन सर्विस (एसआईएस) का डेटा उपलब्ध है या नहीं. एसआईएस, स्टेशन और उस पर चल रहे ट्रैक के बारे में ज़्यादा जानकारी देता है.
  • आठवां बिट: इससे पता चलता है कि एचडी डिजिटल ऑडियो उपलब्ध है या नहीं.

मेटाडेटा

इस टेबल में, Android 15 और इसके बाद के वर्शन के लिए, एचडी रेडियो मेटाडेटा के काम करने का तरीका बताया गया है.

मेटाडेटा फ़ील्ड ब्यौरा
commentShortDescription टिप्पणी के बारे में कम शब्दों में जानकारी
commentActualText टिप्पणी का टेक्स्ट
commercial रेडियो पर विज्ञापन
ufids कॉन्टेंट से जुड़े यूनीक फ़ाइल आइडेंटिफ़ायर (यूएफ़आईडी)
hdStationNameShort एचडी रेडियो स्टेशन का छोटा नाम या यूनिवर्सल छोटा नाम
hdStationNameLong एचडी रेडियो स्टेशन का लंबा नाम, स्लोगन या स्टेशन का कोई मैसेज.