ブロードキャスト ラジオ HAL

次のセクションでは、ブロードキャスト ラジオを実装するために、Hardware Abstraction Layer(HAL)をどのように扱うかについて説明します。

ブロードキャスト ラジオ HAL インターフェース

ブロードキャスト ラジオ HAL は、ハードウェア レベルでデータ構造とインターフェースを提供し、AM / FM ラジオや DAB ラジオなどのブロードキャスト ラジオを実装します。

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
説明: 選局オペレーション(AIDL での選局、シーク、または HIDL でのスキャンおよびステップ成功時)が非同期で失敗したときに、HAL によって呼び出されます。
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 KiB に制限する必要があります。
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 内で更新されたときに呼び出されます(HAL クライアントで setParameters を呼び出した後は呼び出しません)。
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
説明: AIDL の新機能です。設定フラグが HAL 内で更新されたときに呼び出されます(HAL クライアントによって setConfigFlag を呼び出した後に呼び出すことはできません)。
HIDL 2.0 該当はありません。
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio は、ブロードキャスト ラジオ HAL のプライマリ インターフェースです。HIDL 2.0 HAL で、チューナーへの ITunerSession インターフェースを使用してオペレーションを呼び出します。ただし、一度に有効にできるチューナーは 1 つだけです(各ブロードキャスト ラジオ HAL インスタンスにチューナー チップが 1 つしかない場合)。 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 MB 未満である必要があります。
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 HAL: 新しいチューナー セッションを開始したときに、古いセッションを終了する必要があります。
  • AIDL HAL: 利用できるチューナー セッションがないため、チューナー コールバックのみを設定する必要があります。 セッションがある場合は、古いコールバックの設定を解除する必要があります。
HIDL 2.0 openSession(ITunerCallback callback)(Result result, ITunerSession session) を生成します。
AIDL void setTunerCallback(in ITunerCallback callback)
説明:
  • HIDL HAL: チューナー セッションの終了は失敗してはならず、1 回のみ行う必要があります。
  • AIDL HAL: チューナーはなく、チューナー コールバックの設定のみを解除する必要があります。
HIDL 2.0 close()
AIDL unsetTunerCallback()
説明: 指定された番組に選局します。
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
説明: 電波を通して、次の有効な番組を検索します。AIDL での混乱を避けるため、scanseek に名称変更されています。
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 コールバックを介して番組リストの更新情報の送信を開始します。
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 でのシーク、ステップ)は時間がかかる可能性があり、スレッドが長時間ブロックされないようにするため、時間のかかるオペレーションを後で実行してステータスや結果をすばやく返すように、スケジュールされます。具体的には、各オペレーションで以下を行う必要があります。

  • 保留中のすべての選局オペレーションをキャンセルします。
  • メソッド入力とチューナーのステータスに基づいてオペレーションが処理できるかどうかをチェックします。
  • 選局タスクをスケジュールしたら、すぐに HIDL での Result、または AIDL での status を返します。 Result または statusOK の場合、タイムアウトなどが理由で選局タスクが失敗または完了したときには、チューナー コールバック tuneFailed または currentProgramInfoChanged を呼び出す必要があります。

同様に startProgramListUpdates は、番組リストの更新という時間のかかるタスクを後で実行して、ステータスまたは結果をすばやく返すようにスケジュールします。このメソッドでは、まず保留中の更新リクエストをキャンセルしてから、更新タスクをスケジュールし、結果をすばやく返します。

競合状態

選局オペレーション(選局、HIDL でのスキャン、AIDL でのシーク、ステップ)の非同期動作のため、オペレーションのキャンセルと選局オペレーションの間に競合状態が生じます。HAL が選局オペレーションを完了してコールバックが完了する前に cancel が呼び出された場合、キャンセルを無視して、コールバックが完了して HAL クライアントによって受信されるようにする必要があります。

同様に、HAL が番組リストの更新を完了し、onCurrentProgramInfoChanged コールバックが完了する前に stopProgramListUpdates が呼び出された場合、stopProgramListUpdates を無視し、コールバックが完了されるようにする必要があります。

データサイズの上限

バインダ トランザクション バッファにはハードリミットがあるため、AIDL HAL では、インターフェース メソッドで渡されるデータサイズが大きい場合について、明確なデータ制限が定められています。

  • getImage では、返される画像が 1 MB 未満である必要があります。
  • onProgramListUpdate では、各 chunk が 500 KiB 未満である必要があります。 これよりも大きい番組リストは、HAL 実装によって複数のチャンクに分割され、複数のコールバックを介して送信されなければなりません。

AIDL HAL データ構造の変更

AIDL を利用するブロードキャスト ラジオ AIDL HAL で定義されたデータ構造には、インターフェースの変更に加え、次の変更が適用されています。

  • Constant 列挙型が AIDL では削除され、IBroadcastRadio で定数 int として定義されました。同時に、ANTENNA_DISCONNECTED_TIMEOUT_MS の名前が ANTENNA_STATE_CHANGE_TIMEOUT_MS に変更されました。新しい定数 int TUNER_TIMEOUT_MS が追加されました。選局、シーク、ステップの各オペレーションはすべて、この時間内に完了する必要があります。
  • 列挙型 RDSDeemphasis が AIDL で削除され、AmFmRegionConfig で定数 int として定義されました。それに応じて、ProgramInfofmDeemphasisfmRds はどちらも、それぞれのフラグのビット演算結果である int として宣言されます。同時に、D50D75 の名前がそれぞれ DEEMPHASIS_D50DEEMPHASIS_D75 に変更されました。
  • 列挙型 ProgramInfoFlags が AIDL で削除され、ProgramInfo で int として定義されました。また、接頭辞 FLAG_ が追加されました。これに応じて、ProgramInfoinfoFlags が、フラグのビット演算結果である int として宣言されます。また、TUNED の名前も FLAG_TUNABLE に変更され、その定義、つまりラジオ局を選局できる範囲の説明がわかりやすくなりました。
  • AIDL で scan の名前が seek に変更されたため、AmFmBandRangescanSpacing の名前が seekSpacing に変更されました。
  • union のコンセプトが AIDL で導入されたため、HIDL HAL で定義された MetadataKeyMetadata は使用されなくなりました。AIDL union Metadata は、AIDL HAL で定義されます。以前は MetadataKey であった各列挙値は、定義に応じて、文字列型または int 型の Metadata フィールドになります。