다음 섹션에서는 하드웨어 추상화 계층 (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 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 콜백을 통해 프로그램 목록 업데이트를 전송하기 시작합니다. |
||
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
이면 미세 조정 작업이 실패하거나 (예: 시간 제한으로 인해) 완료될 때 튜너 콜백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_MS
는ANTENNA_STATE_CHANGE_TIMEOUT_MS
로 이름이 변경됩니다. 새 const intTUNER_TIMEOUT_MS
가 추가되었습니다. 모든 미세 조정, 탐색, 단계 작업은 이 시간 내에 완료되어야 합니다.- enum
RDS
및Deemphasis
가 AIDL에서 삭제되고AmFmRegionConfig
에서 const int로 정의됩니다. 이에 따라ProgramInfo
의fmDeemphasis
및fmRds
가 모두 각 플래그의 비트 계산 결과인 int로 선언됩니다. 한편D50
및D75
는 각각DEEMPHASIS_D50
및DEEMPHASIS_D75
로 이름이 변경됩니다. - enum
ProgramInfoFlags
가 AIDL에서 삭제되고ProgramInfo
에서 const int로 정의되며 접두사FLAG_
가 추가됩니다. 이에 따라ProgramInfo
의infoFlags
는 플래그의 비트 계산 결과인 int로 선언됩니다. 또한TUNED
는FLAG_TUNABLE
로 이름이 변경되어 채널에 맞출 수 있다는 정의를 더 잘 설명합니다. AmFmBandRange
에서scanSpacing
이seekSpacing
으로 이름이 변경됩니다.scan
이 AIDL에서seek
로 이름이 변경되었기 때문입니다.- union 개념이 AIDL에 도입되었으므로 HIDL HAL에 정의된
MetadataKey
및Metadata
가 더 이상 사용되지 않습니다. AIDL unionMetadata
는 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_ENSEMBLE
및 DAB_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_NAME
및 HD_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 라디오 채널의 긴 이름, 슬로건 또는 채널의 메시지입니다. |