HDMI-CEC コントロール サービス

High-Definition Multimedia Interface Consumer Electronics Control(HDMI-CEC)標準では、マルチメディア関連の消費者製品が相互に通信と情報交換を行うことができます。HDMI-CEC は、Remote Control Passthrough や System Audio Control など、多くの機能をサポートしていますが、最も多く利用されているのは One Touch Play です。One Touch Play を使用すると、メディアソース デバイスを使用してテレビをオンにしたり、入力ポートを自動的に切り替えたりできます。そのため、Chromecast からブルーレイ プレーヤーに切り替えるときでもテレビのリモコンを探す必要はありません。

Android 12 では、HDMI で接続したディスプレイは、内部ディスプレイと連携して電源が制御されます。HDMI 再生デバイスが起動すると、HDMI-CEC 標準の One Touch Play を介して、接続されているテレビを起動してそのテレビのアクティブなソースになるように試行します。HDMI 再生デバイスがアクティブなソースである間にスリープ状態になると、接続されているテレビをオフにしようと試行します。

通常、HDMI-CEC のサポートは任意です。ただし、ほとんどのメーカーは HDMI-CEC を採用しており、他社のデバイスとも連携して動作します。各メーカーはさまざまな方法で HDMI-CEC 標準を実装しているため、デバイスが常に他のデバイスを認識するとは限らず、サポート対象機能はデバイスによって異なります。このように、実装方法が異なる場合があるため、特定の 2 つの製品が CEC のサポートを謳っていたとしても、それらの製品が完全に互換性を持つことが保証されるわけではありません。

送信側デバイスと受信側デバイスの両方が HDMI-CEC のバージョン 2.0 をサポートしていれば、HDMI デバイス相互の連携は良くなります。

解決策

Android TV 入力フレームワーク(TIF)の導入により、HDMI-CEC は接続されているすべてのデバイスを統合し、互換性の問題を最小限に抑えます。Android に対しては、このような課題を軽減するための HdmiControlService というシステム サービスを作成しました。

Android のエコシステムの一環として HdmiControlService を組み込むことによって、Android で次の機能を実現することを目指しています。

  • すべてのメーカーを対象とする HDMI-CEC の標準実装。これにより、デバイスの互換性欠落に関する問題が減少します。従来、メーカーは HDMI-CEC の独自の実装を開発するか、サードパーティ ソリューションを使用する必要がありました。
  • すでに市販されている多くの HDMI-CEC デバイスに対して十分にテストされたサービス。Android に対して、プロダクトの互換性に関する問題について厳密な調査を行い、テクノロジーに関して経験を重ねたデバイスの実装者から有用なアドバイスを集めました。CEC サービスは、ユーザーがすでに使用しているプロダクトで動作するように、標準と標準に対して加えられた変更のバランスを正常に保つように設計されています。

全体的な設計

HdmiControlService は、TV 入力フレームワーク(TIF)、オーディオ サービス、電源サービスなど、システムの他の部分に接続することで、標準で指定されているさまざまな機能を実装します。

カスタム CEC コントローラからシンプルな HDMI-CEC Hardware Abstraction Layer(HAL)の実装への切り替えを示す次の図をご覧ください。

Android 5.0 の前後における HDMI-CEC の実装方法を示す図

図 1. HDMI コントロール サービスの置換

実装

HDMI コントロール サービスの詳細を示した次の図をご覧ください。

HDMI コントロール サービスの詳細を示す画像

図 2. HDMI コントロール サービスの詳細

適切な Android HDMI-CEC 実装を実現する主な要素は次のとおりです。

  • マネージャー クラス HdmiControlManager は、特権アプリに API を提供します。TV 入力マネージャー サービスやオーディオ サービスなどのシステム サービスは、HDMI コントロール サービスを直接使用できます。
  • HDMI コントロール サービスは、複数タイプの論理デバイスのホストを可能にするように設計されています。
  • HDMI-CEC は Hardware Abstraction Layer(HAL)を介してハードウェアに接続されるため、デバイス間のプロトコルやシグナルのメカニズムの相違への対処が容易になります。デバイス メーカーは、HAL の定義を HAL レイヤの実装に使用できます。

: デバイス メーカーは、device.mkPRODUCT_COPY_FILES に次の行を追加する必要があります。

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml

デバイスが HDMI シンクデバイスまたは HDMI ソースデバイスのどちらであるかに応じて、デバイス メーカーは HdmiControlService が正常に機能するよう device.mkro.hdmi.device_type を設定する必要があります。

オーバー ザ トップ(OTT)デバイスやセットトップ ボックス(STB)デバイスなどの HDMI ソースデバイスの場合は、次のように設定します。

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

パネルテレビなどの HDMI シンクデバイスの場合は、次のように設定します。

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • デバイス メーカー提供の独自の CEC コントローラを HdmiControlService と併用することはできません。無効にするか、削除する必要があります。この処理が必要になる一般的な理由は、メーカー固有のコマンドを処理する必要があることです。メーカー固有のコマンド ハンドラは、拡張や変更によってサービスに組み込まれる必要があります。この処理はデバイス メーカーによって行われるもので、Android によって指定されていません。なお、メーカー固有のコマンドのサービスを変更した場合は、標準コマンドの処理方法に干渉しないようにする必要があります。干渉が生じると、デバイスが Android に対応しなくなります。
  • HDMI-CEC サービスへのアクセスは、保護レベル SignatureOrSystem によって保護されます。システム コンポーネントまたは /system/priv-app に配置されたアプリのみがサービスにアクセスできます。これは、悪意を持ったアプリによるサービスの悪用を防ぐためです。

Android は TV/Display(0)、アクティブなソースとなるための One Touch Play コマンドを発行できる Playback device(4)、システムの音声モードと ARC を処理する Audio System (5) の各タイプをサポートします。他のデバイスタイプ(チューナーとレコーダー)は現在サポートされていません。

HDMI-CEC HAL

HDMI-CEC HAL API を使用すると、HdmiControlService はハードウェア リソースを使用して HDMI-CEC コマンドを送受信し、必要な設定を行います。さらに(オプションとして)、Android システムがスタンバイ モードのときに CEC の制御を引き継ぐ基盤となるプラットフォームのマイクロプロセッサと通信します。

バージョン 機能 HAL ファイル
1.0 HAL データ(アドレス、機能)を設定する。HDMI-CEC コマンドを送信する。HDMI-CEC コマンドとホットプラグ イベントを受信するコールバックを登録する。 IHdmiCec.hal
IHdmiCecCallback.hal
1.1 HDMI-CEC 2.0 タイプを導入する @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

テスト

デバイスの HDMI-CEC 実装は、HDMI-CEC CTS のドキュメントに沿って、CTS テストによりテストおよび検証します。

HDMI-CEC 2.0

Android ソース(再生)デバイスとシンク(TV パネル)デバイスは HDMI-CEC 2.0 をサポートしています。HDMI-CEC 2.0 では、HDMI デバイス間の相互運用性が向上し、Remote Control Passthrough が改善され、さらに幅広い認証テストを実施できます。一般的に、HDMI-CEC 2.0 ではデバイス間の連携における効率性が高まるため、HDMI-CEC トラフィックが少なくなり、連携動作が高速化されます。

デバイスが HDMI-CEC 2.0 をサポートするには、デバイスとユーザーの設定が HDMI-CEC 2.0 を使用するように設定されている必要があります。また、HAL 実装は IHdmiCec#getCecVersion の呼び出しで HDMI-CEC 2.0 のサポートをレポートする必要があります。

CEC の設定

HDMI-CEC の動作は、ビルド時(RRO を使用して OEM が実施)と実行時(HdmiControlManager @SystemApi によって)の両方で設定できます。

HDMI-CEC 設定の例:

設定 オプション
HDMI-CEC を有効にするか無効にするか。 有効
無効
再生デバイスによって送信される HDMI-CEC 電源制御メッセージのスコープ。 テレビのみに送信
テレビとオーディオ システムに送信
ブロードキャスト
なし

各設定について、アプリは現在利用可能なオプションと許可されているオプションを実行時にクエリできます。