توضّح الأقسام التالية كيفية العمل مع طبقة HAL لتطبيق ميزة البث الإذاعي.
واجهة HAL للبث الإذاعي
يوفّر Broadcast radio HAL هياكل البيانات وواجهات على مستوى الأجهزة لتطبيق بث الراديو، مثل AM/FM وDAB radio.
واجهات HIDL 2.0 وAIDL
يستخدم HAL لبث الإذاعة الواجهات الموضّحة في الأقسام التالية.
IAnnouncementListener
IAnnouncementListener
هي واجهة طلب معاودة الاتصال الخاصة بمعالج إعلانات البث، والتي
يمكن تسجيلها في HAL لبث الإذاعة لتلقّي الإعلانات. تتضمّن الواجهة الخطوات التالية:
IAnnouncementListener | ||
---|---|---|
الوصف: يتمّ استدعاء هذه الدالة عند تغيير قائمة الإعلانات. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
لغة تعريف الهوية (AIDL) | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
هو معرّف الإغلاق العام لإزالة طلب استدعاء لا يحتاج إلى
واجهة نشطة.
ICloseHandle | ||
---|---|---|
الوصف: أغلِق المقبض. | ||
HIDL 2.0 | close() |
|
لغة تعريف الهوية (AIDL) | void close() |
ITunerCallback
ITunerCallback
هي واجهة طلب معاودة الاتصال التي يستدعيها HAL لبث الإذاعة بهدف
إرسال آخر المعلومات إلى خدمة HAL للعملاء.
ITunerCallback | ||
---|---|---|
الوصف: يتم استدعاء هذه الوظيفة من خلال HAL عند تعذُّر إجراء عملية ضبط (ضبط أو التقديم أو الإيقاف (في AIDL) أو المسح (في HIDL) ونجاح الخطوة) بشكل غير متزامن. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
لغة تعريف الهوية (AIDL) | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
الوصف: يتمّ استدعاء هذه الوظيفة عند ضبط الإعدادات أو الانتقال إلى محتوى معيّن (في AIDL) أو البحث (في HIDL) أو عند نجاح الخطوة. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
لغة تعريف الهوية (AIDL) | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
الوصف: يتمّ استدعاء هذه الوظيفة عند ضبط الإعدادات أو الانتقال إلى محتوى معيّن (في AIDL) أو البحث (في HIDL) أو عند نجاح الخطوة. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
لغة تعريف الهوية (AIDL) | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
الوصف: يتمّ استدعاء هذه الوظيفة عند تعديل قائمة البرامج، ويجب ألا يتجاوز حجم كلّ قطعة 500 كيلوبايت. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
لغة تعريف الهوية (AIDL) | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
الوصف: يتم استدعاء هذه الدالة عند توصيل الهوائي أو فصله. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
لغة تعريف الهوية (AIDL) | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
الوصف: يتمّ استدعاء هذه الوظيفة عند تعديل قيم المَعلمات الخاصة بالمورّد
بشكلٍ داخلي في HAL (لا تستدعي هذه الوظيفة بعد استدعاء
setParameters بواسطة برنامج HAL). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
لغة تعريف الهوية (AIDL) | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
الوصف: جديد في AIDL يتمّ استدعاؤه عند تعديل علامة الضبط
داخليًا في HAL (يجب عدم
استدعائه بعد استدعاء setConfigFlag بواسطة عميل HAL). |
||
HIDL 2.0 | غير منطبق. | |
لغة تعريف الهوية (AIDL) | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
هي الواجهة الأساسية لواجهة برمجة التطبيقات لبثّ الراديو. في HIDL
2.0 HAL، استخدِم واجهة ITunerSession
مع أداة الضبط لاستدعاء العمليات. ومع ذلك، يكون في الغالب جهاز تحكّم واحد فقط مفعّلاً في المرة الواحدة (شرط أن تحتوي كل مثيل من HAL لبث الإذاعة على شريحة تحكّم واحدة فقط).
تمت إزالة ITunerSession
من واجهات AIDL وتم نقل واجهاتها إلى
IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
الوصف: يمكنك الحصول على وصف الوحدة و قدراتها. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
لغة تعريف الهوية (AIDL) | Properties getProperties() |
|
الوصف: تُستخدَم هذه السمة لتحميل إعدادات منطقة AM/FM الحالية أو المحتملة. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
لغة تعريف الهوية (AIDL) | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
الوصف: تُستخدَم هذه الوظيفة لجلب إعدادات منطقة DAB الحالية. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
لغة تعريف الهوية (AIDL) | DabTableEntry[] getDabRegionConfig() |
|
الوصف: تحصل هذه الوظيفة على صورة من ذاكرة التخزين المؤقت لوحدة الراديو. في AIDL، يجب أن يكون حجم الصورة أقل من 1 ميغابايت بسبب الحدّ الأقصى الثابت لمساحة التخزين المؤقت لمعاملات الربط. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
لغة تعريف الهوية (AIDL) | byte[] getImage(in int id) |
|
الوصف: يُسجِّل هذا الإجراء مستمع الإعلانات. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
لغة تعريف الهوية (AIDL) | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
الوصف:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) تُنشئ
(Result result, ITunerSession session) |
|
لغة تعريف الهوية (AIDL) | void setTunerCallback(in ITunerCallback callback) |
|
الوصف:
|
||
HIDL 2.0 | close() |
|
لغة تعريف الهوية (AIDL) | unsetTunerCallback() |
|
الوصف: لضبط القنوات على برنامج محدّد. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
لغة تعريف الهوية (AIDL) | void tune(in ProgramSelector program) |
|
الوصف: يبحث عن البرنامج التالي الصالح على
البث. لتجنّب حدوث التباس في AIDL،
تمت إعادة تسمية scan إلى seek .
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
لغة تعريف الهوية (AIDL) | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
الوصف: خطوات للوصول إلى القناة المجاورة التي قد لا تكون مشغولة بأي برنامج. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
لغة تعريف الهوية (AIDL) | void step(in boolean directionUp) |
|
الوصف: تلغي هذه الدالة عمليات الضبط أو المسح الضوئي (في HIDL) أو الانتقال إلى النقطة التالية (في AIDL) أو عمليات الخطوة. | ||
HIDL 2.0 | cancel() |
|
لغة تعريف الهوية (AIDL) | void cancel() |
|
الوصف: تُطبِّق هذه الرسالة فلترًا على قائمة البرامج و
تبدأ بإرسال تعديلات قائمة البرامج عبر
onProgramListUpdated callback. |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
لغة تعريف الهوية (AIDL) | void startProgramListUpdates(in ProgramFilter filter) |
|
الوصف: يوقف إرسال تعديلات قائمة البرامج. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
لغة تعريف الهوية (AIDL) | void stopProgramListUpdates() |
|
الوصف: تُستخدَم هذه الدالة لجلب الإعداد الحالي لعلامة ملف إعداد معيّنة. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
لغة تعريف الهوية (AIDL) | boolean isConfigFlagSet(in ConfigFlag flag) |
|
الوصف: تضبط علامة الإعداد المحدّدة. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
لغة تعريف الهوية (AIDL) | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
الوصف: لضبط قيم المَعلمات الخاصة بالمورّد | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
تُنشئ، (vec<VendorKeyValue> results) |
|
لغة تعريف الهوية (AIDL) | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
الوصف: يسترجع قيم المَعلمات الخاصة بالمورّد. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
لغة تعريف الهوية (AIDL) | VendorKeyValue[] getParameters(in String[] keys) |
توضيحات حول الواجهات
السلوك غير المتزامن
بما أنّ كل عملية ضبط (مثل الضبط أو المسح (في HIDL) أو التقديم/الترجيع (في AIDL) والخطوة) قد تتطلب وقتًا طويلاً ويجب عدم حظر سلسلة المهام لفترة طويلة، يجب أن تحدد العملية جدولاً زمنيًا لتنفيذ العمليات التي تستغرق وقتًا طويلاً لاحقًا وعرض حالة أو نتيجة بسرعة. في التفاصيل، يجب أن تؤدي كل عملية إلى ما يلي:
- إلغاء جميع عمليات الضبط المعلّقة
- تحقَّق مما إذا كان يمكن معالجة العملية استنادًا إلى مدخلات الطريقة وحالة المُعدِّل.
- حدِّد موعدًا لمهمة الضبط ثم أعِد القيمة
Result
(في HIDL) أوstatus
(في AIDL) على الفور. إذا كانResult
أوstatus
هوOK
، يجب استدعاء دالة callbacktuneFailed
أوcurrentProgramInfoChanged
لتطبيق الضبط عند تعذُّر إكمال مهمة الضبط (على سبيل المثال، بسبب انتهاء مهلة) أو اكتمالها.
وبالمثل، يحدّد startProgramListUpdates
أيضًا موعدًا لمهمّة تعديل قائمة البرامج التي تستغرق وقتًا طويلاً، وذلك لكي يتم عرض حالة أو نتيجة بسرعة. تلغي الطريقة أولاً طلبات التعديل التي في انتظار المراجعة، ثم تحدّد موعدًا لمهمة التعديل وتُظهر النتيجة
بسرعة.
حالة السباق
بسبب السلوك غير المتزامن لعمليات الضبط (مثل الضبط والفحص (في HIDL) أو التقديم/الترجيع
(في AIDL) والخطوة)، يتوفّر شرط تسابق بين إلغاء العملية وعمليات الضبط. في حال تمّ استدعاء cancel
بعد أن يُكمِل HAL عملية ضبط وقبل اكتمال callback، يمكن تجاهل الإلغاء ومن المفترض أن يكتمل callback ويتلقّاه العميل HAL.
وبالمثل، إذا تمّ استدعاء stopProgramListUpdates
بعد أن يُكمل HAL تعديلًا في قائمة
البرامج وقبل اكتمال عملية استدعاء onCurrentProgramInfoChanged
،
يمكن تجاهل stopProgramListUpdates
ومن المفترض أن تكتمل عملية الاستدعاء.
الحد الأقصى لحجم البيانات
بما أنّ هناك حدًا صارمًا على وحدة تخزين المعاملات في أداة الربط، يتم توضيح حد البيانات لبعض طُرق واجهة التي تنقل بيانات قد تكون كبيرة الحجم في AIDL HAL.
- تتطلّب
getImage
أن يكون حجم الصورة المعروضة أقل من 1 ميغابايت. - تتطلّب
onProgramListUpdate
أن يكون حجم كلchunk
أقل من 500 كيلوبايت. يجب تقسيم قوائم البرامج الأكبر حجمًا من خلال تنفيذ HAL إلى أجزاء متعددة وإرسالها من خلال callbacks متعددة.
التغييرات في هياكل بيانات HAL لواجهة برمجة التطبيقات الذكية (AIDL)
بالإضافة إلى التغييرات في الواجهات، تم تطبيق هذه التغييرات على هياكل البيانات المحدّدة في حزمة HAL لبروتوكول AIDL للبث الإذاعي، والتي تستفيد من حزمة AIDL.
- تمّت إزالة
Constant
enum في AIDL وتمّ تعريفها على أنّها const int فيIBroadcastRadio
. في هذه الأثناء، تمت إعادة تسميةANTENNA_DISCONNECTED_TIMEOUT_MS
إلىANTENNA_STATE_CHANGE_TIMEOUT_MS
. تمت إضافةTUNER_TIMEOUT_MS
ثابت جديد. يجب إكمال جميع عمليات الضبط والتقديم والترجيع خلال هذا الوقت. - تتم إزالة العنصرَين التعريفيين
RDS
وDeemphasis
في AIDL ويتم تعريفهما على أنّهما const int فيAmFmRegionConfig
. وبالمثل، تمّ الإعلان عن كلّ منfmDeemphasis
وfmRds
فيProgramInfo
على أنّهما int، وهي نتيجة حسابية ثنائية للعلامات المعنية. وفي الوقت نفسه، تمت إعادة تسميةD50
وD75
إلىDEEMPHASIS_D50
وDEEMPHASIS_D75
، على التوالي. - تتم إزالة العنصر
ProgramInfoFlags
في AIDL ويتم تعريفه على أنّه const int فيProgramInfo
مع إضافة بادئةFLAG_
. وفقًا لذلك، تمّ الإعلان عنinfoFlags
فيProgramInfo
على أنّه int، وهو نتيجة معالجة ثنائية للأعلام. تمت أيضًا إعادة تسميةTUNED
إلىFLAG_TUNABLE
لوصف التعريف الذي يمكن ضبط المحطة عليه بشكل أفضل. - في
AmFmBandRange
، تمت إعادة تسميةscanSpacing
إلىseekSpacing
، لأنّه تمت إعادة تسميةscan
إلىseek
في لغة تعريف واجهة نظام Android (AIDL). - بما أنّ مفهوم الاتحاد تم تقديمه في AIDL، لم يعُد يتم استخدام
MetadataKey
وMetadata
المحدَّدين في HIDL HAL. يتم تعريف بنية ائتلاف AIDLMetadata
في HAL AIDL. كل قيمة من القيم المحدَّدة مسبقًا فيMetadataKey
أصبحت الآن حقلًا فيMetadata
بنوع سلسلة أو int، استنادًا إلى تعريفاتها.
توافق مع راديو البث الرقمي
يوضّح هذا القسم مدى توافق الجهاز مع راديو DAB.
المعرفات
نوع المعرّف الأساسي لراديو DAB وDMB في واجهة HAL لبثّ الراديو في AIDL هو
DAB_SID_EXT
. يستخدم DAB_SID_EXT
معرّفات الخدمة (SID) بسعة 32 بت حتى يتمكّن من تمثيل
معرّف SID لكل من راديو 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
.
البيانات الوصفية
يوضِّح الجدول التالي البيانات الوصفية المتوافقة الخاصة بتقنية DAB في واجهة HAL لبث الإذاعة في AIDL:
حقل البيانات الوصفية | الوصف |
---|---|
dabEnsembleName (الشكل المختصر: dabEnsembleNameShort ) |
اسم مجموعة محطات DAB |
dabServiceName (اختصار dabServiceNameShort ) |
اسم خدمة محطة DAB |
dabComponentName (اختصار dabComponentNameShort ) |
اسم مكوّن محطة DAB |
إتاحة الراديو الرقمي المختلط
يوضّح هذا القسم مدى توفّر ميزة "الراديو عالي الدقة".
المعرفات
يُستخدَم HD_STATION_ID_EXT
كمعرّف أساسي لمحطات الراديو عالية الدقة. لتحسين عملية تحديد المحطة، يتم أيضًا توفير معرّفات ثانوية مثل HD_STATION_NAME
و
HD_STATION_LOCATION
. HD_STATION_LOCATION
، الذي يقدّم معلومات عن الموقع الجغرافي، تم طرحه في Android 15.
تفعيل الراديو الرقمي أو إيقافه
بدءًا من الإصدار 15 من Android، يمكنك تفعيل الراديو الرقمي (مثل الراديو عالي الدقة) أو إيقافه من خلال تعديل
ConfigFlag
. للتحكّم في هذا الإعداد لراديو FM، استخدِم العلامة
FORCE_ANALOG_FM
، ولراديو AM، استخدِم العلامة FORCE_ANALOG_AM
.
يؤدي ضبط العلامة على false
إلى تفعيل الراديو بدقة عالية، بينما يؤدي ضبطها على
true
إلى فرض استخدام الراديو التناظري AM/FM.
قنوات بدقة عالية متاحة
بدءًا من الإصدار 15 من Android، يمكن تمثيل القنوات العالية الدقة المتاحة حاليًا لمحطة راديو عالية الدقة
باستخدام قناع بتات مكوّن من 8 بتات، Metadata#hdSubChannelsAvailable
،
في ProgramInfo.metadata
. على سبيل المثال، تمثل قيمة النقطة الأولى من اليسار ما إذا كان
القناة الفرعية HD2 متاحة لمحطة HD هذه.
حالة اكتساب الإشارة
في الإصدار 15 من Android والإصدارات الأحدث، يمكن لتطبيقات الراديو أن تعرض للمستخدمين حالة اكتساب إشارة محطات الراديو بدقة عالية. ويُعدّ ذلك مفيدًا لأنّ الحصول على إشارة عالية الدقة قوية قد يستغرق أحيانًا بضع لحظات.
لتقديم هذه المعلومات، يستخدم النظام ProgramInfo.infoFlags
لتتبُّع
حالة التطبيق وتعديله من خلال
ITunerCallback#onCurrentProgramInfoChanged.
.
في ما يلي كيفية تمثيل الحالة في ProgramInfo.infoFlags
:
- النقطة 6: تشير إلى ما إذا تم الحصول على إشارة الراديو عالي الدقة.
- البتّ 7: يعرض ما إذا كانت بيانات خدمة معلومات المحطة (SIS) متاحة. يوفّر نظام SIS معلومات إضافية عن المحطة والمحتوى الذي يتم تشغيله.
- النقطة الثمانية: تشير إلى ما إذا كان الصوت الرقمي عالي الدقة متاحًا.
البيانات الوصفية
يعرض الجدول التالي البيانات الوصفية المتاحة لأجهزة Android 15 والإصدارات الأحدث التي تتضمّن بثّ راديو بدقة عالية.
حقل البيانات الوصفية | الوصف |
---|---|
commentShortDescription |
وصف موجز للسياق الخاص بالتعليق |
commentActualText |
نص التعليق |
commercial |
إعلان تلفزيوني |
ufids |
معرّفات الملفات الفريدة (UFID) المرتبطة بالمحتوى |
hdStationNameShort |
الاسم المختصر للمحطة الإذاعية بدقة عالية أو الاسم المختصر العالمي |
hdStationNameLong |
الاسم الكامل للمحطة الإذاعية بدقة عالية أو شعارها أو رسالة من المحطة |