브로드캐스트 라디오 HAL

다음 섹션에서는 하드웨어 추상화 계층 (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)
설명: 프로그램 목록이 업데이트되면 호출됩니다. 각 청크의 크기는 500KiB로 제한해야 합니다.
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 인터페이스를 사용하여 작업을 호출합니다. 하지만 한 번에 최대 하나의 튜너가 활성 상태가 됩니다 (각 방송 라디오 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에서 이미지 크기는 1MB 미만이어야 합니다.
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: 튜너 세션 종료는 성공해야 하며 한 번만 실행해야 합니다.
  • 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), 단계)은 시간이 오래 걸릴 수 있고 스레드는 오랫동안 차단되어서는 안 되므로 작업에서는 시간이 오래 걸리는 작업을 나중에 발생하도록 예약하고 상태나 결과를 빠르게 반환해야 합니다. 구체적으로 각 작업은 다음과 같아야 합니다.

  • 대기 중인 모든 튜닝 작업을 취소합니다.
  • 메서드 입력과 튜너의 상태에 따라 작업을 처리할 수 있는지 확인합니다.
  • 미세 조정 작업을 예약하고 Result (HIDL) 또는 status (AIDL)를 즉시 반환합니다. Result 또는 statusOK이면 미세 조정 작업이 실패하거나 (예: 시간 제한으로 인해) 완료될 때 튜너 콜백 tuneFailed 또는 currentProgramInfoChanged를 호출해야 합니다.

마찬가지로 startProgramListUpdates는 프로그램 목록을 업데이트하는 시간이 오래 걸리는 작업을 나중에 발생하도록 하고 상태나 결과를 신속하게 반환하도록 예약합니다. 이 메서드는 먼저 대기 중인 업데이트 요청을 취소한 후 업데이트 작업을 예약하고 결과를 빠르게 반환합니다.

경합 상태

튜닝 작업 (예: 미세 조정, 검색 (HIDL)이나 탐색(AIDL), 단계)의 비동기 동작으로 인해 작업 취소와 튜닝 작업 사이에 경합 상태가 발생합니다. HAL이 튜닝 작업을 완료한 후 그리고 콜백이 완료되기 전에 cancel을 호출하면 취소를 무시할 수 있고 콜백을 완료하여 HAL 클라이언트에서 수신해야 합니다.

마찬가지로 HAL이 프로그램 목록 업데이트를 완료한 후 그리고 onCurrentProgramInfoChanged 콜백이 완료되기 전에 stopProgramListUpdates를 호출하면 stopProgramListUpdates를 무시할 수 있고 콜백을 완료해야 합니다.

데이터 크기 한도

바인더 트랜잭션 버퍼에는 엄격한 한도가 있으므로 잠재적으로 크기가 큰 데이터를 전달하는 일부 인터페이스 메서드의 데이터 한도는 AIDL HAL에 명확하게 설명되어 있습니다.

  • getImage는 반환되는 이미지 크기가 1MB 미만이어야 합니다.
  • onProgramListUpdate는 각 chunk의 크기가 500KiB 미만이어야 합니다. 더 큰 프로그램 목록은 HAL 구현에 의해 여러 청크로 분할되고 여러 콜백을 통해 전송되어야 합니다.

AIDL HAL 데이터 구조 변경사항

인터페이스 변경사항 외에도 이러한 변경사항은 AIDL을 활용하는 방송 라디오 AIDL HAL에 정의된 데이터 구조에 적용되었습니다.

  • Constant enum은 AIDL에서 삭제되고 IBroadcastRadio에서 const int로 정의됩니다. 한편 ANTENNA_DISCONNECTED_TIMEOUT_MSANTENNA_STATE_CHANGE_TIMEOUT_MS로 이름이 변경됩니다. 새 const int TUNER_TIMEOUT_MS가 추가되었습니다. 모든 미세 조정, 탐색, 단계 작업은 이 시간 내에 완료되어야 합니다.
  • enum RDSDeemphasis가 AIDL에서 삭제되고 AmFmRegionConfig에서 const int로 정의됩니다. 이에 따라 ProgramInfofmDeemphasisfmRds가 모두 각 플래그의 비트 계산 결과인 int로 선언됩니다. 한편 D50D75는 각각 DEEMPHASIS_D50DEEMPHASIS_D75로 이름이 변경됩니다.
  • enum ProgramInfoFlags가 AIDL에서 삭제되고 ProgramInfo에서 const int로 정의되며 접두사 FLAG_가 추가됩니다. 이에 따라 ProgramInfoinfoFlags는 플래그의 비트 계산 결과인 int로 선언됩니다. 또한 TUNEDFLAG_TUNABLE로 이름이 변경되어 채널에 맞출 수 있다는 정의를 더 잘 설명합니다.
  • AmFmBandRange에서 scanSpacingseekSpacing으로 이름이 변경됩니다. scan이 AIDL에서 seek로 이름이 변경되었기 때문입니다.
  • union 개념이 AIDL에 도입되었으므로 HIDL HAL에 정의된 MetadataKeyMetadata가 더 이상 사용되지 않습니다. AIDL union Metadata는 AIDL HAL에 정의되어 있습니다. 이전에 MetadataKey에 있던 각 enum 값은 이제 해당 정의에 따라 문자열 또는 int 유형이 있는 Metadata의 필드입니다.

DAB 라디오 지원

이 섹션에서는 DAB 라디오 지원에 대해 설명합니다.

식별자

AIDL Broadcast Radio HAL에서 DAB 및 DMB 라디오의 기본 식별자 유형은 DAB_SID_EXT입니다. DAB_SID_EXT는 DAB 및 DMB 라디오의 SID를 모두 나타낼 수 있도록 32비트 서비스 식별자 (SID)를 사용합니다.

기본 식별자 외에도 DAB_ENSEMBLEDAB_FREQUENCY_KHZ와 같은 보조 식별자가 지원됩니다. 이는 여러 DAB 채널이 DAB_SID_EXT를 공유하면서 DAB_ENSEMBLE 또는 DAB_FREQUENCY_KHZ 값이 다를 수 있으므로 중요합니다. 정확한 프로그램 목록 업데이트를 위해 DAB_SID_EXT가 동일한 방송국은 ITunerCallback#onProgramListUpdated를 사용하여 함께 업데이트됩니다. 그런 다음 이 업데이트는 브로드캐스트 라디오 서비스 및 라디오 관리자로 라우팅되고 최종적으로 android.hardware.radio.ProgramList를 통해 라디오 앱으로 전달됩니다.

Metadata

다음 표는 AIDL Broadcast Radio HAL에서 DAB에 대해 지원되는 메타데이터를 보여줍니다.

메타데이터 필드 설명
dabEnsembleName (축약형: dabEnsembleNameShort) DAB 방송국의 앙상블 이름
dabServiceName (dabServiceNameShort의 약어) DAB 채널의 서비스 이름
dabComponentName (dabComponentNameShort의 약어) DAB 채널의 구성요소 이름

HD 라디오 지원

이 섹션에서는 HD 라디오 지원에 관해 설명합니다.

식별자

HD_STATION_ID_EXT는 HD 라디오 채널의 기본 식별자로 사용됩니다. 방송국 식별을 더욱 개선하기 위해 HD_STATION_NAMEHD_STATION_LOCATION와 같은 보조 식별자도 제공됩니다. 위치 정보를 제공하는 HD_STATION_LOCATION가 Android 15에서 도입되었습니다.

디지털 라디오 사용 설정 또는 사용 중지

Android 15부터 ConfigFlag를 조정하여 디지털 라디오 (예: HD 라디오)를 사용 설정하거나 중지할 수 있습니다. FM 라디오의 이 설정을 제어하려면 FORCE_ANALOG_FM 플래그를 사용하고 AM 라디오의 경우 FORCE_ANALOG_AM 플래그를 사용하세요. 플래그를 false로 설정하면 HD 라디오가 사용 설정되고 true로 설정하면 아날로그 AM/FM 라디오가 강제 적용됩니다.

HD 채널 사용 가능

Android 15부터 HD 라디오 채널에 현재 사용 가능한 HD 채널은 ProgramInfo.metadata에서 8비트 비트 마스크 Metadata#hdSubChannelsAvailable로 표현할 수 있습니다. 예를 들어 왼쪽의 비트 1 값은 이 HD 채널에서 HD2 하위 채널을 사용할 수 있는지 여부를 나타냅니다.

신호 획득 상태

Android 15 이상 버전에서는 라디오 앱이 사용자에게 HD 라디오 채널의 신호 획득 상태를 표시할 수 있습니다. 강한 HD 신호를 획득하는 데 몇 분 정도 걸릴 수 있으므로 이 기능이 유용합니다.

이 정보를 제공하기 위해 시스템은 ProgramInfo.infoFlags를 사용하여 상태를 추적하고 ITunerCallback#onCurrentProgramInfoChanged.를 통해 라디오 앱을 업데이트합니다.

다음은 ProgramInfo.infoFlags 내에서 상태가 표시되는 방식입니다.

  • 비트 6: HD 라디오 신호가 획득되었는지 여부를 나타냅니다.
  • 비트 7: 충전소 정보 서비스 (SIS) 데이터를 사용할 수 있는지 여부를 표시합니다. SIS는 방송국 및 재생 중인 콘텐츠에 관한 추가 정보를 제공합니다.
  • 비트 8: HD 디지털 오디오를 사용할 수 있는지 여부를 나타냅니다.

Metadata

다음 표에는 Android 15 이상 버전에서 지원되는 HD 라디오 메타데이터가 나와 있습니다.

메타데이터 필드 설명
commentShortDescription 댓글에 관한 짧은 컨텍스트 설명
commentActualText 댓글 텍스트
commercial 라디오 광고
ufids 콘텐츠와 연결된 고유 파일 식별자 (UFID)
hdStationNameShort HD 라디오 채널의 약칭 또는 범용 약칭
hdStationNameLong HD 라디오 채널의 긴 이름, 슬로건 또는 채널의 메시지입니다.