無線電控制功能的實作方式以 MediaSession
和 MediaBrowse
為基礎,可讓媒體和語音助理應用程式控制無線電。詳情請參閱 developer.android.com 上的「打造車用媒體應用程式」一文。
packages/apps/Car/libs
中的 car-broadcastradio-support 程式庫提供媒體瀏覽樹狀結構實作項目。這個程式庫也包含 ProgramSelector 的擴充功能,可用於將 URI 轉換為其他格式,或將其他格式轉換為 URI。建議無線電實作使用這個程式庫建構相關的瀏覽樹狀結構。
媒體來源切換器
為了在媒體中顯示的電台和其他應用程式之間提供無縫轉換,car-media-common 程式庫包含應整合至電台應用程式的類別。MediaAppSelectorWidget
可納入電台應用程式的 XML (在參考媒體和電台應用程式中使用的圖示和下拉式選單):
<com.android.car.media.common.MediaAppSelectorWidget android:id="@+id/app_switch_container" android:layout_width="@dimen/app_switch_widget_width" android:layout_height="wrap_content" android:background="@drawable/app_item_background" android:gravity="center" />
這個小工具會啟動 AppSelectionFragment
,顯示可切換的媒體來源清單。如果您想要使用提供的 UI 以外的介面,可以在應顯示切換器時啟動 AppSelectionFragment
,建立自訂小工具。
AppSelectionFragment newFragment = AppSelectionFragment.create(widget, packageName, fullScreen); newFragment.show(mActivity.getSupportFragmentManager(), null);
在 packages/apps/Car/Radio
中,參考電台應用程式實作方式提供實作範例。
詳細控制項規格
MediaSession
(透過 MediaSession.Callback
) 介面為目前播放的廣播節目提供控制機制:
onPlay
,onStop
。開啟或關閉電台播放的靜音功能。onPause
. 時間延遲暫停 (如有支援)。onPlayFromMediaId
:播放頂層資料夾中的任何內容。例如「播放 FM 電台」或「播放電台」。onPlayFromUri
:播放特定頻率。例如「播放 88.5 FM」。onSkipToNext
,onSkipToPrevious
。切換至下一個或上一個電台。onSetRating
:新增或移除「我的收藏」中的項目。
MediaBrowser 會透過三種頂層目錄公開可調整的 MediaItem:
- (選填) 節目 (電台)。雙調諧器收音機通常會使用這個模式,指出使用者所在位置的所有可調諧電台。
- 收藏:已新增至收藏項目清單的電台節目,其中部分節目可能無法收聽 (不在收訊範圍內)。
- 頻道頻帶:目前區域中所有可能的管道 (87.9、88.1、88.3、88.5、88.7、88.9、89.1 等)。每個頻帶都有一個獨立的頂層目錄。
每個資料夾 (AM/FM/節目) 中的每個元素都是 MediaItem,其中包含可與 MediaSession 搭配使用的 URI,用於調整頻道。每個頂層資料夾 (AM/FM/Programs) 都是 MediaItem,其中的 mediaId 可與 MediaSession 搭配使用,用於觸發播放作業,這取決於原始設備製造商 (OEM) 的判斷。舉例來說,「播放 FM」、「播放 AM」和「播放電台」都是非特定電台查詢,會使用 mediaId 傳送至 OEM 電台應用程式。電台應用程式會根據一般要求和 mediaId 決定要播放哪些內容。
MediaSession
由於廣播串流沒有暫停的概念,因此播放、暫停和停止動作不一定適用於廣播。在廣播電台中,Stop 動作會將串流設為靜音,而 Play 會將靜音設為關閉。
部分收音機 (或應用程式) 可透過快取內容並稍後播放,模擬廣播串流暫停的情況。在這種情況下,請使用 onPause
。
透過 mediaId 和 URI 動作播放,目的是將電台調諧至從 MediaBrowser 介面擷取的電台。mediaId 是廣播電台應用程式提供的任意字串,用於強制設定用來識別特定電台的值,該值必須是獨特的 (也就是說,特定 ID 只會指向一個項目) 且穩定的 (也就是說,特定項目在整個工作階段中都會使用相同的 ID)。URI 會採用明確定義的結構定義。簡而言之,這是 ProgramSelector 的 URI 格式。雖然這可保留唯一性屬性,但不一定會保持穩定,因為當電台轉移至其他頻率時,這項屬性可能會變更。
onPlayFromSearch
是設計用途,由用戶端 (隨附應用程式) 負責從 MediaBrowser 樹狀結構中選取搜尋結果。將這項責任轉移至無線電應用程式會增加複雜度,需要針對字串查詢的顯示方式訂定正式合約,並導致不同硬體平台的使用者體驗不一致。
注意:收音機應用程式不包含其他資訊,因此無法透過 MediaBrowser 介面搜尋未向用戶端公開的電台名稱。
跳到下一個或上一個車站取決於目前的情況:
- 當應用程式從「我的最愛」清單調到某個電台時,應用程式可以從「我的最愛」清單移動到下一個電台。
- 從「節目」清單中收聽電台時,系統可能會根據頻道號碼排序,切換至下一個可用的電台。
- 聆聽任意頻道可能會導致系統切換至下一個實體頻道,即使沒有廣播訊號也一樣。
廣播應用程式會處理這些動作。
處理錯誤
TransportControls
動作 (播放、停止和下一首) 不會提供動作是否成功的回饋。如要指出錯誤,唯一的方法是將 MediaSession 狀態設為 STATE_ERROR
,並附上錯誤訊息。
收音機應用程式必須處理這些動作,並執行或設定錯誤狀態。如果執行 Play 指令不是立即執行,則播放狀態應變更為
STATE_CONNECTING
(在直接調諧的情況下),或在執行指令時變更為
STATE_SKIPPING_TO_PREVIOUS
或
NEXT
。
用戶端應監控
PlaybackState
,並驗證工作階段是否將目前的程式變更為要求的內容,或進入錯誤狀態。STATE_CONNECTING
不得超過 30 秒。不過,直接調到特定的調頻/調幅頻率應該會更快。
新增及移除收藏項目
MediaSession 支援分級功能,可用於控制「我的最愛」。onSetRating
以 RATING_HEART
類型的評分呼叫,可將目前收聽的電台新增或移除至收藏清單。
與舊版預設值相反,這個模型假設未排序且無邊界的精選清單,每個已儲存的收藏內容都會分配至數字插槽 (通常為 1 到 6)。因此,以預設值為基礎的系統將無法與 onSetRating
作業相容。
MediaSession API 的限制是,只能新增或移除目前已調諧的電台。舉例來說,您必須先選取項目,才能移除該項目。這只是 MediaBrowser 用戶端 (例如隨附應用程式) 的限制。收音機應用程式並未受到類似限制。如果應用程式不支援「我的最愛」,則這個部分為選用項目。
MediaBrowser
為了表示哪些頻率或實際頻道名稱 (當調整為任意頻道時,是否適合特定無線電技術) 適用於特定區域,每個頻帶都會列出所有有效頻道 (頻率)。在美國地區,這相當於 87.8 到 108.0 MHz 範圍內的 101 個 FM 頻道 (使用 0.2 MHz 間距),以及 530 到 1700 kHz 範圍內的 117 個 AM 頻道 (使用 10 kHz 間距)。由於 HD 調頻使用相同的頻道空間,因此不會個別顯示。
目前可用的電台節目清單是平面式,因此無法使用依據直接音訊廣播 (DAB) 集合群組的顯示方式。
常用清單中的項目可能無法調整。舉例來說,如果某個指定的節目超出範圍,收音機應用程式可能會或可能不會偵測到是否可以事先調到該項目。否則,系統可能不會將該項目標示為可播放。
為了識別頂層資料夾,系統會採用與藍牙相同的機制。也就是說,
MediaDescription
物件的 Extras 組合包含了與調諧器相關的欄位,就像藍牙與
EXTRA_BT_FOLDER_TYPE
一樣。在廣播電台的情況下,這會導致在公開 API 中定義下列新欄位:
EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE"
。下列任一值:BCRADIO_FOLDER_TYPE_PROGRAMS = 1
。目前可用的方案。BCRADIO_FOLDER_TYPE_FAVORITES = 2
. 我的最愛。BCRADIO_FOLDER_TYPE_BAND = 3
:指定頻帶的所有實體頻道。
由於所有相關資料都符合現有的
MediaBrowser.MediaItem
配置,因此您不需要定義任何特定電台的自訂中繼資料欄位:- 節目名稱 (RDS PS、DAB 服務名稱)。
MediaDescription.getTitle
。 - FM 頻率。 URI (請參閱 ProgramSelector) 或
MediaDescription.getTitle
(如果項目位於BROADCASTRADIO_FOLDER_TYPE_BAND
資料夾中)。 - 無線電專屬 ID (RDS PI、DAB SId)。
MediaDescription.getMediaUri
已剖析為 ProgramSelector。
一般來說,您不需要為目前節目或「我的最愛」清單中的項目擷取 FM 頻率 (因為用戶端應以媒體 ID 運作)。不過,如果需要這類資訊 (例如為了顯示目的),則會出現在 URI 中,並可剖析為
ProgramSelector
。不過,我們不建議使用 URI 選取目前工作階段中的項目。詳情請參閱ProgramSelector
。為避免效能或 Binder 相關問題,MediaBrowser 服務必須支援分頁:
注意:根據預設,系統會在
onLoadChildren()
變化版本中實作分頁功能,但不會處理選項。所有類型清單 (原始頻道、已找到的節目和收藏內容) 中的相關項目可能會有不同的 mediaId (這取決於電台應用程式;支援程式庫會使用不同的 mediaId)。在大多數情況下,原始頻道和節目的 URI (以 ProgramSelector 表單表示) 不同 (沒有 RDS 的 FM 除外),但在節目和收藏內容之間的 URI 通常相同 (例如 AF 更新時除外)。
針對不同類型的清單項目使用不同的 mediaId,可讓您針對這些項目採取不同的動作。您可以依據最近選取的
MediaItem
資料夾,在onSkipToNext
上遍歷「收藏」清單或「所有節目」清單 (請參閱 MediaSession)。特殊音調操作
使用者可以透過節目清單收聽特定電台,但無法提出「Tune to FM」等一般要求,因為這可能會導致系統在 FM 頻道上收聽最近收聽過的電台。
為支援這類動作,部分頂層目錄會設定
FLAG_PLAYABLE
標記 (以及資料夾的FLAG_BROWSABLE
)。動作 轉到 發布方式 播放電台 任何電台頻道 startService(ACTION_PLAY_BROADCASTRADIO)
或
playFromMediaId(MediaBrowser.getRoot())
播放 FM 廣播 任何 FM 頻道 播放 FM 頻帶的 mediaId
。應用程式會決定要收看哪個節目,通常是從指定清單中最近收看的頻道。如要進一步瞭解
ACTION_PLAY_BROADCASTRADIO
,請參閱「一般播放意圖」。探索和服務連線
PackageManager
可以直接找到提供廣播電台樹狀結構的 MediaBrowserService。如要這麼做,請使用ACTION_PLAY_BROADCASTRADIO
意圖 (請參閱「一般播放意圖」) 和MATCH_SYSTEM_ONLY
標記呼叫resolveService
。如要找出所有提供廣播電台服務的服務 (可能不只一個,例如 AM/FM 和衛星廣播電台),請使用queryIntentServices
。已解析的服務也會處理
android.media.browse.MediaBrowserService
繫結意圖。這項資訊已透過 GTS 驗證。如要連線至所選的 MediaBrowserService,請為特定服務元件和
connect
建立MediaBrowser
例項。建立連線後,您可以透過getSessionToken
取得 MediaSession 的句柄。Radio 應用程式可限制在
onGetRoot
服務實作中允許連線的用戶端套件。應用程式應允許系統應用程式連線,而無須加入許可清單。如要進一步瞭解許可清單,請參閱「接受 Google 助理應用程式套件和簽章」。如果在未支援此來源的裝置上安裝來源專屬應用程式 (例如收音機應用程式),該應用程式仍會宣稱自己處理
ACTION_PLAY_BROADCASTRADIO
意圖,但其 MediaBrowser 樹狀結構不會包含收音機專屬標記。因此,如果客戶想檢查裝置上是否有特定來源,則必須:- 探索電台服務 (呼叫
resolveService
即可取得ACTION_PLAY_BROADCASTRADIO
)。 - 建立
MediaBrowser
,然後連線至該項目。 - 使用
EXTRA_BCRADIO_FOLDER_TYPE
extra 判斷是否存在MediaItem
。
注意: 在多數情況下,用戶端必須掃描所有可用的 MediaBrowser 樹狀結構,才能偵測特定裝置的所有可用來源。
頻帶名稱
樂團清單由一組頂層目錄代表,其中資料夾類型標記設為
BCRADIO_FOLDER_TYPE_BAND
。其MediaItem
的標題是代表樂團名稱的本地化字串。在多數情況下,這會與英文翻譯相同,但用戶端無法依據這項假設。為提供穩定的機制來查詢特定頻帶,我們為頻帶資料夾新增了額外標記
EXTRA_BCRADIO_BAND_NAME_EN
。這是頻帶的非本地化名稱,只能使用下列預先定義值之一:AM
FM
DAB
如果樂團不在這個清單中,就不要設定樂團名稱標記。不過,如果頻道在清單中,則必須設有標記。高畫質調頻廣播使用與調幅調頻相同的基礎媒體,因此不會列舉個別頻帶。
一般播放意圖
每個專門播放特定來源 (例如廣播電台或 CD) 的應用程式,都必須處理一般 play 意圖,才能從非活動狀態 (例如開機後) 開始播放某些內容。應用程式會自行決定如何選取要播放的內容,但通常會播放最近播放的廣播電台節目或 CD 音軌。每個音訊來源都有個別的意圖定義:
android.car.intent.action.PLAY_BROADCASTRADIO
android.car.intent.action.PLAY_AUDIOCD
:CD-DA 或 CD-Textandroid.car.intent.action.PLAY_DATADISC
:光學資料光碟,例如 CD/DVD,但不是 CD-DA (可能是混合模式 CD)android.car.intent.action.PLAY_AUX
:未指定 AUX 埠android.car.intent.action.PLAY_BLUETOOTH
android.car.intent.action.PLAY_USB
:未指定 USB 裝置android.car.intent.action.PLAY_LOCAL
:本機媒體儲存空間 (內建快閃記憶體)
我們選擇使用意圖來執行一般播放指令,因為意圖可以同時解決兩個問題:一般播放指令本身和服務探索。有了這類意圖,您就能在不開啟 MediaBrowser 工作階段的情況下,執行這類簡單動作。
服務探索其實是透過這些意圖解決的重要問題。這樣一來,服務探索程序就會變得簡單明確 (請參閱「探索和服務連線」)。
為了讓部分用戶端的實作更容易,我們提供了另一種方式來發出這類播放指令 (也必須由廣播應用程式實作):使用根節點的 rootId 發出
playFromMediaId
(用作 mediaId)。雖然根節點無法播放,但其 rootId 是任意字串,可做為 mediaId 使用。不過,用戶端不必瞭解這項細微差異。ProgramSelector
雖然
mediaId
足以從MediaBrowserService
中選取管道,但會與工作階段繫結,且不同提供者之間的一致性不一致。在某些情況下,用戶端可能需要絕對指標 (例如絕對頻率),才能在工作階段和裝置之間維持指標。在數位廣播電台時代,單憑頻率無法收聽特定電台。因此,請使用
ProgramSelector
將頻道調諧至類比或數位頻道。ProgramSelector
由兩個部分組成:- 主要 ID。特定電台的專屬 ID,不會變更,但可能無法調到該電台。例如 RDS PI 代碼,可翻譯為美國的呼號。
- 次要 ID:其他可用於調諧至該電台的 ID (例如頻率),可能包括其他無線電技術的 ID。舉例來說,DAB 電台可能會備有類比廣播。
如要讓
ProgramSelector
符合MediaBrowser
或MediaSession
為基礎的解決方案,請定義 URI 結構定義來序列化。結構定義如下:broadcastradio://program/<primary ID type>/<primary ID>? <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>
在這個範例中,次要 ID 部分 (問號 (
?
) 後方) 為選用項目,可移除,以提供可用於mediaId
的穩定 ID。例如:broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
broadcastradio://program/AMFM_FREQUENCY/102100
broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234
program
的權威部分 (又稱為主機) 可讓日後的配置文件擴充功能有更多空間。在 HAL 2.x 的IdentifierType
定義中,識別碼類型字串會精確指定為其名稱,而值格式則為十進位或十六進位 (含0x
前置字元) 數字。所有供應商專屬 ID 都會以
VENDOR_
前置字串表示。例如,VENDOR_0
代表VENDOR_START
,VENDOR_1
代表VENDOR_START
加 1。這類 URI 僅適用於產生這些 URI 的無線電硬體,無法在不同原始設備製造商 (OEM) 製造的裝置之間轉移。這些 URI 必須指派給頂層廣播資料夾下的每個 MediaItem。此外,MediaSession 必須同時支援
playFromMediaId
和playFromUri
。不過,URI 主要用於擷取無線電中繼資料 (例如 FM 頻率) 和持續性儲存空間。我們無法保證 URI 可供所有媒體項目使用 (例如,當架構尚未支援主要 ID 類型時)。另一方面,Media ID 一律有效。我們不建議使用者使用 URI 從目前的 MediaBrowser 工作階段選取項目。請改用playFromMediaId
。不過,這並非服務應用程式可選擇的做法,且缺少的 URI 僅適用於有充分理由的情況。初始設計使用單一冒號,而非在配置部分後方使用
://
序列。不過,android.net.Uri
不支援絕對階層 URI 參照的情況。其他來源類型
其他音訊來源的處理方式也類似。例如輔助輸入和音訊 CD 播放器。
單一應用程式可能會提供多種來源。在這種情況下,建議您為每種來源類型建立個別的 MediaBrowserService。即使在有多個服務來源/MediaBrowserService 的設定中,我們也強烈建議在單一應用程式中使用單一 MediaSession。
音訊 CD
與音訊 CD 相似,提供此類磁碟的應用程式會透過 MediaBrowser 提供單一可瀏覽的項目 (如果系統有 CD 變換器,則可提供多個項目),而該項目會包含特定 CD 的所有曲目。如果系統不知道每張 CD 上的曲目 (例如,當所有磁碟一次插入卡匣時,系統不會讀取所有磁碟),則整張磁碟的 MediaItem 就會是
PLAYABLE
,而非BROWSABLE
加PLAYABLE
。如果特定插槽中沒有磁碟,該項目就不會是PLAYABLE
或BROWSABLE
(但每個插槽都必須位於樹狀結構中)。這些項目的標記方式與廣播電台資料夾類似,會包含 MediaDescription API 中定義的額外欄位:
EXTRA_CD_TRACK
:音訊 CD 上的每個MediaItem
,以 1 為基底的曲目編號。EXTRA_CD_DISK
:以 1 為基底的磁碟編號。
對於啟用 CD-Text 的系統和相容的磁碟,頂層 MediaItem 會包含磁碟的標題。同樣地,曲目的 MediaItems 會包含曲目名稱。
輔助輸入
提供輔助輸入的應用程式會公開 MediaBrowser 樹狀結構,其中包含一個項目 (或多個項目,如果存在多個通訊埠),代表 AUX 輸入通訊埠。相應的 MediaSession 會在取得
playFromMediaId
要求後,取得媒體 ID 並切換至該來源。每個 AUX MediaItem 項目都會有額外的欄位
EXTRA_AUX_PORT_NAME
,其值為未經本地化的端口名稱,不含「AUX」字詞。舉例來說,「AUX 1」會設為「1」、「AUX front」會設為「front」,而「AUX」會設為空字串。在非英文語言代碼中,名稱標記會維持相同的英文字串。與EXTRA_BCRADIO_BAND_NAME_EN
不同,這些值是由 OEM 定義,並未受限於預先定義的清單。如果硬體可以偵測到連接至 AUX 連接埠的裝置,則只有在輸入連線時,硬體才應將 MediaItem 標示為
PLAYABLE
。如果沒有任何裝置連接到這個通訊埠,硬體仍應列舉 (但不是PLAYABLE
)。如果硬體沒有這類功能,則 MediaItem 一律必須設為PLAYABLE
。額外欄位
定義下列欄位:
EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
EXTRA_CD_DISK = "android.media.extra.CD_DISK"
EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"
用戶端需要檢查頂層 MediaItems,針對具有
EXTRA_CD_DISK
或EXTRA_AUX_PORT_NAME
額外欄位集的元素。詳細範例
以下範例說明此設計中所用來源類型的 MediaBrowser 樹狀結構。
廣播電台 MediaBrowserService (處理
ACTION_PLAY_BROADCASTRADIO
):- 電台 (可瀏覽)
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
- BBC One (可播放) URI:
broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
- ABC 88.1 (可播放) URI:
broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
- ABC 88.1 HD1 (可播放) URI:
broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
- ABC 88.1 HD2 (可播放) URI:
broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
- 90.5 FM (可播放) - 沒有 RDSURI 的 FM:
broadcastradio://program/AMFM_FREQUENCY/90500
- 620 AM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/620
- BBC One (可播放) URI:
broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
- BBC One (可播放) URI:
- 我的最愛 (可瀏覽、可播放)
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
- BBC One (可播放) URI:
broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
- BBC Two (無法播放)URI:
broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
- BBC One (可播放) URI:
- AM (可瀏覽、可播放):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
- 530 AM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/530
- 540 AM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/540
- 550 AM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/550
- 530 AM (可播放) URI:
- FM (可瀏覽、可播放):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
- 87.7 FM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/87700
- 87.9 FM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/87900
- 88.1 FM (可播放) URI:
broadcastradio://program/AMFM_FREQUENCY/88100
- 87.7 FM (可播放) URI:
- DAB (可播放):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"
音訊 CD MediaBrowserService (處理
ACTION_PLAY_AUDIOCD
):- 光碟 1 (可播放)
EXTRA_CD_DISK=1
- 光碟 2 (可瀏覽、可播放)
EXTRA_CD_DISK=2
- 曲目 1 (可播放)
EXTRA_CD_TRACK=1
- 曲目 2 (可播放)
EXTRA_CD_TRACK=2
- 曲目 1 (可播放)
- 我的音樂 CD (可瀏覽、可播放)
EXTRA_CD_DISK=3
- All By Myself (可播放)
EXTRA_CD_TRACK=1
- Reise, Reise (playable)
EXTRA_CD_TRACK=2
- All By Myself (可播放)
- 空白的空格 4 (無法播放)
EXTRA_CD_DISK=4
AUX MediaBrowserService (處理
ACTION_PLAY_AUX
):- AUX 前端 (可播放)
EXTRA_AUX_PORT_NAME="front"
- AUX 後 (可播放)
EXTRA_AUX_PORT_NAME="rear"