پخش رادیو HAL

بخش های زیر نحوه کار با لایه انتزاعی سخت افزاری (HAL) برای اجرای رادیو پخش را شرح می دهد.

رادیو پخش رابط HAL

رادیو پخش HAL ساختارهای داده و رابط‌هایی را در سطح سخت‌افزار برای اجرای رادیو پخش، مانند رادیو AM/FM و DAB فراهم می‌کند.

رابط های HIDL 2.0 و AIDL

رادیو پخش HAL از رابط های توضیح داده شده در بخش های زیر استفاده می کند.

IAnnouncementListener

IAnnouncementListener رابط پاسخ به تماس برای شنونده اعلامیه است که می تواند در رادیو پخش HAL برای دریافت اطلاعیه ها ثبت شود. رابط دارای روش های زیر است:

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 رابط تماس برگشتی است که توسط رادیو پخش HAL برای ارسال به روز رسانی به سرویس سرویس گیرنده HAL فراخوانی می شود.

ITunerCallback
توضیحات: هنگامی که یک عملیات تنظیم (کوک کردن، جستجو (در AIDL) یا اسکن (در HIDL) و مرحله موفقیت آمیز) به طور ناهمزمان با شکست مواجه می شود توسط HAL فراخوانی می شود.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
ایدل void onCurrentProgramInfoChanged(in ProgramInfo info)
توضیحات: هنگامی که تنظیم، جستجو (در AIDL) یا اسکن (در HIDL)، یا گام موفقیت آمیز باشد، تماس گرفته می شود.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
ایدل void onTuneFailed(in Result result, in ProgramSelector selector)
توضیحات: هنگامی که تنظیم، جستجو (در AIDL) یا اسکن (در HIDL)، یا گام موفقیت آمیز باشد، تماس گرفته می شود.
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)
توضیحات: زمانی فراخوانی می شود که مقادیر پارامترهای خاص فروشنده به صورت داخلی در HAL به روز شوند (بعد از فراخوانی setParameters توسط سرویس گیرنده HAL، فراخوانی نکنید).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
ایدل void onParametersUpdated(in VendorKeyValue[] parameters)
توضیحات: جدید در AIDL. هنگامی که پرچم پیکربندی به صورت داخلی در HAL به روز می شود، فراخوانی می شود (نباید پس از فراخوانی setConfigFlag توسط سرویس گیرنده HAL فراخوانی شود).
HIDL 2.0 قابل اجرا نیست.
ایدل void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcast Radio

IBroadcastRadio رابط اصلی برای پخش رادیویی HAL است. در HIDL 2.0 HAL، از رابط ITunerSession به تیونر برای فراخوانی عملیات استفاده کنید. با این حال، حداکثر یک تیونر در یک زمان فعال است (به شرطی که هر نمونه پخش رادیویی HAL فقط یک تراشه تیونر داشته باشد). ITunerSession از رابط های AIDL حذف شد و رابط های آن به IBroadcastRadio منتقل شد.

IBroadcast Radio
توضیحات: توضیحات یک ماژول و قابلیت های آن را دریافت کنید.
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)
توضیحات: پیکربندی فعلی منطقه DAB را واکشی می کند.
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: هنگامی که یک جلسه تیونر جدید باز می شود، جلسه قبلی باید خاتمه یابد.
  • AIDL 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) یا جستجو (در AIDL) یا مرحله در انتظار را لغو می کند.
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) یا جستجو (در AIDL) و مرحله) ممکن است زمان‌بر باشد و نخ نباید برای مدت طولانی مسدود شود، عملیات باید عملیات زمان‌بر را برنامه‌ریزی کند. بعدا رخ دهد و به سرعت یک وضعیت یا نتیجه را بازگرداند. به طور جزئی، هر عملیات باید:

  • تمام عملیات تنظیم در انتظار را لغو کنید.
  • بررسی کنید که آیا عملیات بر اساس ورودی های روش و وضعیت تیونر قابل پردازش است یا خیر.
  • کار تنظیم را برنامه ریزی کنید و سپس Result (در HIDL) یا status (در AIDL) را بلافاصله برگردانید. اگر Result یا status OK باشد، زمانی که کار تنظیم ناموفق بوده است (مثلاً به دلیل مهلت زمانی) یا تکمیل شده است، تنظیم کننده تماس برگشتی تنظیم کننده tuneFailed یا currentProgramInfoChanged باید فراخوانی شود.

به طور مشابه، startProgramListUpdates همچنین کار زمان بر به روز رسانی لیست برنامه را برنامه ریزی می کند تا بعداً انجام شود و به سرعت یک وضعیت یا نتیجه را بازگرداند. این روش ابتدا درخواست‌های به‌روزرسانی معلق را لغو می‌کند و سپس کار به‌روزرسانی را زمان‌بندی می‌کند و به سرعت نتیجه را برمی‌گرداند.

شرایط مسابقه

به دلیل رفتار ناهمزمان عملیات تنظیم (به عنوان مثال، تنظیم، اسکن (در HIDL) یا جستجو (در AIDL)، و مرحله)، یک شرایط مسابقه بین لغو عملیات و عملیات تنظیم وجود دارد. اگر cancel پس از اتمام HAL یک عملیات تنظیم و قبل از تکمیل تماس فراخوانی شود، می توان لغو را نادیده گرفت و پاسخ تماس باید تکمیل شود و توسط سرویس گیرنده HAL دریافت شود.

به طور مشابه، اگر stopProgramListUpdates پس از تکمیل به‌روزرسانی لیست برنامه توسط HAL و قبل از تکمیل فراخوانی onCurrentProgramInfoChanged فراخوانی شود، stopProgramListUpdates را می‌توان نادیده گرفت و تماس مجدد باید کامل شود.

محدودیت اندازه داده

از آنجایی که محدودیت سختی در بافر تراکنش بایندر وجود دارد، محدودیت داده برای برخی از روش‌های رابط که داده‌هایی با اندازه بالقوه بزرگ را ارسال می‌کنند، در AIDL HAL مشخص می‌شوند.

  • getImage نیاز دارد که تصویر کمتر از 1 مگابایت برگردانده شود.
  • onProgramListUpdate نیاز دارد که هر chunk کمتر از 500 کیلو بایت باشد. لیست های برنامه های بزرگتر باید توسط اجرای HAL به چند تکه تقسیم شده و از طریق تماس های متعدد ارسال شوند.

تغییرات در ساختار داده AIDL HAL

علاوه بر تغییرات در رابط ها، این تغییرات در ساختارهای داده تعریف شده در رادیو پخش AIDL HAL اعمال شده است که از AIDL بهره می برد.

  • Enum Constant در AIDL حذف می شود و به عنوان const int در IBroadcastRadio تعریف می شود. در همین حال، ANTENNA_DISCONNECTED_TIMEOUT_MS به ANTENNA_STATE_CHANGE_TIMEOUT_MS تغییر نام داد. یک Const int جدید TUNER_TIMEOUT_MS اضافه شده است. تمام عملیات تنظیم، جستجو و گام باید در این زمان تکمیل شود.
  • Enum RDS و Deemphasis در AIDL حذف شده و در AmFmRegionConfig به عنوان const int تعریف می شوند. به همین ترتیب، هر دو fmDeemphasis و fmRds در ProgramInfo به‌عنوان int، یک نتیجه محاسباتی بیت پرچم‌های مربوطه اعلام می‌شوند. در همین حال، D50 و D75 به ترتیب به DEEMPHASIS_D50 و DEEMPHASIS_D75 تغییر نام دادند.
  • Enum ProgramInfoFlags در AIDL حذف می شوند و به عنوان const int در ProgramInfo با اضافه شدن پیشوند FLAG_ تعریف می شوند. به همین ترتیب، infoFlags در ProgramInfo به‌عنوان int، یک نتیجه محاسباتی بیت پرچم‌ها اعلام می‌شود. TUNED همچنین به FLAG_TUNABLE تغییر نام داده است تا تعریف آن را که می توان ایستگاه را تنظیم کرد بهتر توصیف کرد.
  • در AmFmBandRange ، scanSpacing به seekSpacing تغییر نام داده است، زیرا scan به seek در AIDL تغییر نام داده است.
  • از آنجایی که مفهوم اتحاد در AIDL معرفی شده است، MetadataKey و Metadata تعریف شده در HIDL HAL دیگر استفاده نمی شوند. یک Metadata اتحادیه AIDL در AIDL HAL تعریف شده است. هر مقدار enum قبلاً در MetadataKey اکنون یک فیلد در Metadata با نوع رشته یا int بسته به تعاریف آنها است.