इन सेक्शन में, ब्रॉडकास्ट रेडियो को लागू करने के लिए, हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) के साथ काम करने का तरीका बताया गया है.
ब्रॉडकास्ट रेडियो 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 2.0 | openSession(ITunerCallback callback) जनरेट करता है
(Result result, ITunerSession session) |
|
एआईडीएल | void setTunerCallback(in ITunerCallback callback) |
|
जानकारी:
|
||
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 intTUNER_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 |
एचडी रेडियो स्टेशन का लंबा नाम, स्लोगन या स्टेशन का कोई मैसेज. |