ליישם רדיו

דף זה מסביר כיצד ליישם רדיו ברמת החומרה והתוכנה.

רכיבי מערכת

ערימת הרדיו השידור כוללת את הרכיבים הבאים.

ארכיטקטורת רדיו שידור
איור 1. ארכיטקטורת רדיו שידור

אפליקציית הפניה לרדיו

לפרטים על אופן הטמעת בקרת רדיו, ראה יישום בקרת רדיו .

אפליקציית רדיו לדוגמא של Java ( packages/apps/Car/Radio ) משמשת כיישום ייחוס. כאשר שירות האפליקציה מתחיל, הוא מבקש ממנהל הרדיו לפתוח מקלט רדיו. לאחר מכן, האפליקציה יכולה לשלוח בקשות אל מקלט הרדיו, כגון כוונון לתחנת רדיו ספציפית, תדר, או לחפש את תחנת הרדיו הזמינה הבאה. האפליקציה מקבלת עדכונים ממנהל הרדיו ומקלט הרדיו ברדיו, כגון מידע על תוכניות נוכחיות, רשימות תוכניות רדיו, תצורות ופרמטרים המוגדרים על ידי הספק. אפליקציית ה-Reference Radio תומכת רק ברדיו AM ו-FM. יצרני OEM יכולים לשנות או להחליף את אפליקציית הרדיו לפי הצורך.

מנהל רדיו

כאשר האפליקציה מבקשת מ-Radio Manager לפתוח מקלט, מנהל הרדיו ( frameworks/base/core/java/android/hardware/radio/RadioManager.java ) מבקש משירות הרדיו השידור לפתוח סשן של טיונר ולאחר מכן עוטף את ההפעלה ב- Radio Tuner ( frameworks/base/core/java/android/hardware/radio/RadioTuner.java ), המוחזר לאפליקציה. מקלט הרדיו מגדיר ממשקי API (כגון כוונון, צעד וביטול) שניתן לקרוא להם מאפליקציות רדיו ולשלוח בקשות לשירות רדיו שידור. שיטות התקשרות חוזרת ( RadioTuner.Callback ) המוגדרות ב- Radio Tuner שולחות עדכונים לגבי הרדיו HAL המשודר, כגון מידע תוכניות עדכני, רשימות תוכניות ופרמטרים המוגדרים על ידי הספק, משירות הרדיו השידור לאפליקציות.

שירות רדיו שידור

שירות רדיו השידור ( frameworks/base/services/core/java/com/android/server/broadcastradio ) הוא שירות הלקוחות של Broadcast Radio HAL. שירות רדיו השידור מתאם מספר מנהלי רדיו עם HALs של רדיו שידור. שירות רדיו השידור תומך בשפת הגדרת ממשק HAL (HIDL) ושפת הגדרות ממשק אנדרואיד (AIDL) שידורי רדיו HAL. שירות רדיו השידור מקשר ל-AIDL HAL כאשר קיים שירות AIDL HAL כלשהו; אחרת, השירות מקשר ל-HIDL HAL. שירות הרדיו השידור יוצר מודול רדיו עבור כל מופע HAL זמין (כגון AM, FM ו-DAB).

כל מנהל רדיו יכול לבקש משירות הרדיו השידור ליצור הפעלת טיונר במודול הרדיו המתאים, בהתבסס על סוג הרדיו. כל הפעלת טיונר יכולה לקרוא לשיטות, כגון כוונון, צעד וביטול (מוגדרים בממשקי HAL) כדי לבצע פעולות על מופע הרדיו השידור המתאים. כאשר הפעלת טיונר אחת מקבלת התקשרות חוזרת ממופע HAL על עדכון HAL, כגון מידע תוכנית נוכחי, רשימת תוכניות, דגלי תצורה ופרמטרים של ספקים, התקשרויות חוזרות לגבי העדכון נשלחות לכל מקלטי הרדיו המקושרים לאותו מודול רדיו.

שידור רדיו HAL

למידע נוסף על ממשקי HIDL ו-AIDL של רדיו שידור וההבדלים בין השניים, ראה ממשק רדיו שידור HAL .

שכבת הפשטה של ​​חומרת רדיו שידור

הסעיפים הבאים מתארים כיצד לעבוד עם שכבת הפשטת החומרה (HAL) כדי ליישם רדיו שידור.

ממשק רדיו שידור HAL

רדיו השידור HAL מספק מבני נתונים וממשקים ברמת החומרה ליישום רדיו שידור, כגון רדיו AM/FM ו-DAB.

ממשקי HIDL 2.0 ו-AIDL

רדיו השידור HAL משתמש בממשקים המתוארים בסעיפים הבאים.

מאזין הודעה

IAnnouncementListener הוא ממשק ההתקשרות לאחור עבור מאזין ההכרזה, אותו ניתן לרשום ברדיו השידור HAL לקבלת הודעות. לממשק יש את השיטות הבאות:

IAnnouncementListener
תיאור: מתקשרים בכל פעם שרשימת ההודעות השתנתה.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
איידל oneway void onListUpdated(in Announcement[] announcements)
סגור ידית

ICloseHandle היא ידית הסגירה הגנרית להסרת התקשרות חוזרת שאינה זקוקה לממשק פעיל.

ICloseHandle
תיאור: סגור את הידית.
HIDL 2.0 close()
איידל void close()

ממשק התקשרות חוזרת

ITunerCallback הוא ממשק ההתקשרות חזרה שנקרא על ידי רדיו השידור HAL כדי לשלוח עדכונים לשירות הלקוחות של HAL.

ITunerCallback
תיאור: נקרא על ידי ה-HAL כאשר פעולת כוונון (כוונון, חיפוש (ב-AIDL) או סריקה (ב-HIDL) והצעד מצליח) נכשלת באופן אסינכרוני.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
איידל void onCurrentProgramInfoChanged(in ProgramInfo info)
תיאור: נקרא כאשר המכוון, החיפוש (ב-AIDL) או סריקה (ב-HIDL), או הצעד מצליח.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
איידל void onTuneFailed(in Result result, in ProgramSelector selector)
תיאור: נקרא כאשר המכוון, החיפוש (ב-AIDL) או סריקה (ב-HIDL), או הצעד מצליח.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
איידל void onCurrentProgramInfoChanged(in ProgramInfo info)
תיאור: נקרא כאשר רשימת התוכניות מתעדכנת; יש להגביל את הגודל של כל נתח ל-500kiB.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
איידל oneway onProgramListUpdated(ProgramListChunk chunk)
תיאור: נקרא כאשר האנטנה מחוברת או מנותקת.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
איידל void onCurrentProgramInfoChanged(in ProgramInfo info)
תיאור: נקרא כאשר ערכי הפרמטרים הספציפיים לספק מתעדכנים באופן פנימי ב-HAL (אין להפעיל אותם לאחר קריאה setParameters על ידי לקוח HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
איידל void onParametersUpdated(in VendorKeyValue[] parameters)
תיאור: חדש ב-AIDL. נקרא כאשר דגל התצורה מתעדכן באופן פנימי ב-HAL (אין להפעיל אותו לאחר קריאת setConfigFlag על ידי לקוח HAL).
HIDL 2.0 לא ישים.
איידל void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

ממשק רדיו שידור ראשי HAL

IBroadcastRadio הוא הממשק העיקרי של רדיו השידור HAL. ב-HIDL 2.0 HAL, השתמש בממשק ITunerSession לטיונר כדי לקרוא לפעולות. עם זאת, לכל היותר מקלט אחד פעיל בו-זמנית (בתנאי שלכל מופע רדיו HAL משודר יש רק שבב טיונר אחד). ITunerSession הוסר מממשקי ה-AIDL והממשקים שלו הועברו ל- IBroadcastRadio .

IbroadcastRadio
תיאור: קבל את התיאור של מודול ויכולותיו.
HIDL 2.0 getProperties() generates (Properties properties)
איידל Properties getProperties()
תיאור: שואב את התצורה הנוכחית או האפשרית של אזור AM/FM.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
איידל AmFmRegionConfig getAmFmRegionConfig(bool full)
תיאור: שואב את תצורת אזור ה-DAB הנוכחית.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
איידל DabTableEntry[] getDabRegionConfig()
תיאור: מקבל תמונה ממטמון מודול הרדיו. ב-AIDL, גודל התמונה חייב להיות פחות מ-1MB עקב מגבלה קשה על מאגר העסקאות של הקלסר.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
איידל byte[] getImage(in int id)
תיאור: רושם את מאזין ההכרזה.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
איידל ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
תיאור:
  • HIDL HAL: כאשר נפתחת הפעלה חדשה של טיונר, יש לסיים את ההפעלה הישנה.
  • AIDL HAL: מכיוון שאין הפעלת טיונר זמינה, יש להגדיר רק את הקריאה חזרה של הטיונר. אם הוא קיים, ההתקשרות חזרה הישנה צריכה להיות מבוטלת.
HIDL 2.0 openSession(ITunerCallback callback) יוצר (Result result, ITunerSession session)
איידל void setTunerCallback(in ITunerCallback callback)
תיאור:
  • HIDL HAL: סגירת הפעלת טיונר אינה חייבת להיכשל ויש להנפיק אותה פעם אחת בלבד.
  • AIDL HAL: אין טיונר ורק צריך לבטל את הקריאה חזרה של הטיונר.
HIDL 2.0 close()
איידל unsetTunerCallback()
תיאור: מכוון לתוכנית מוגדרת.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
איידל void tune(in ProgramSelector program)
תיאור: מחפש את התוכנית התקינה הבאה בשידור . כדי למנוע בלבול ב-AIDL, scan שונה ל- seek .
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
איידל void seek(in boolean directionUp, in boolean skipSubChannel)
תיאור: שלבים לערוץ הסמוך, שאולי לא תפוס על ידי תוכנית כלשהי.
HIDL 2.0 step(bool directionUp) generates (Result result)
איידל void step(in boolean directionUp)
תיאור: מבטל פעולות ניגון ממתין, סריקה (ב-HIDL) או חיפוש (ב-AIDL), או צעדים.
HIDL 2.0 cancel()
איידל void cancel()
תיאור: מחיל מסנן על רשימת התוכניות ומתחיל לשלוח עדכוני רשימת תוכניות על פני התקשרות חוזרת onProgramListUpdated .
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
איידל void startProgramListUpdates(in ProgramFilter filter)
תיאור: מפסיק לשלוח עדכוני רשימת תוכניות.
HIDL 2.0 stopProgramListUpdates()
איידל void stopProgramListUpdates()
תיאור: שואב את ההגדרה הנוכחית של דגל תצורה נתון.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
איידל boolean isConfigFlagSet(in ConfigFlag flag)
תיאור: מגדיר את דגל התצורה הנתון.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
איידל void setConfigFlag(in ConfigFlag flag, boolean value)
תיאור: מגדיר ערכי פרמטר ספציפיים לספק.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

מייצר ,

(vec<VendorKeyValue> results)
איידל VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
תיאור: מאחזר ערכי פרמטר ספציפיים לספק.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
איידל VendorKeyValue[] getParameters(in String[] keys)

הבהרות ממשק

התנהגות אסינכרונית

מכיוון שכל פעולת כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL) ושלב) עשויה להיות גוזלת זמן ואין לחסום את השרשור למשך זמן רב, הפעולה צריכה לתזמן פעולות גוזלות זמן להתרחש מאוחר יותר ולהחזיר במהירות סטטוס או תוצאה. בפירוט, כל פעולה צריכה:

  • בטל את כל פעולות הכוונון הממתינות.
  • בדוק אם ניתן לעבד את הפעולה בהתבסס על כניסות השיטה והסטטוס של הטיונר.
  • תזמן את משימת הכוונון ולאחר מכן החזר את Result (ב-HIDL) או status (ב-AIDL) באופן מיידי. אם Result או status OK , יש לקרוא ל-Callback tuneFailed או currentProgramInfoChanged כאשר משימת הכוונון נכשלה (לדוגמה, עקב פסק זמן) או הושלמה.

באופן דומה, startProgramListUpdates גם מתזמן את המשימה שגוזלת זמן של עדכון רשימת התוכניות להתבצע מאוחר יותר ולהחזיר במהירות סטטוס או תוצאה. השיטה תחילה מבטלת בקשות עדכון ממתינות ולאחר מכן מתזמנת את משימת העדכון ומחזירה במהירות את התוצאה.

מצב Race

עקב ההתנהגות הא-סינכרונית של פעולות כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL), ושלב), קיים מצב מירוץ בין ביטול הפעולה לבין פעולות הכוונון. אם cancel נקרא לאחר שה-HAL משלים פעולת כוונון ולפני השלמת ההתקשרות, ניתן להתעלם מהביטול וההתקשרות חזרה אמורה להסתיים ולהתקבל על ידי לקוח HAL.

באופן דומה, אם מתקשרים stopProgramListUpdates לאחר שה-HAL משלים עדכון של רשימת תוכניות ולפני שההתקשרות חוזרת onCurrentProgramInfoChanged מסתיימת, ניתן להתעלם stopProgramListUpdates ולהסתיים ההתקשרות חזרה.

מגבלת גודל נתונים

מכיוון שקיימת מגבלה קשה על מאגר עסקאות הקלסר, מגבלת הנתונים עבור שיטות ממשק מסוימות המעבירות נתונים בגודל פוטנציאלי גדול מובהרת ב-AIDL HAL.

  • getImage דורש שהתמונה תוחזר פחות מ-1 MB.
  • onProgramListUpdate דורש שכל chunk יהיה פחות מ-500kiB. יש לפצל רשימות תוכניות גדולות יותר על ידי יישום HAL למספר נתחים ולשלוח באמצעות מספר התקשרויות חוזרות.

שינויים במבני נתונים של AIDL HAL

בנוסף לשינויים בממשקים, שינויים אלו הוחלו על מבני הנתונים המוגדרים ברדיו השידור AIDL HAL, המנצל את ה-AIDL.

  • Enum Constant מוסר ב-AIDL ומוגדר כ-const int ב- IBroadcastRadio . בינתיים, השם ANTENNA_DISCONNECTED_TIMEOUT_MS שונה ל- ANTENNA_STATE_CHANGE_TIMEOUT_MS . נוספה קבועה חדשה TUNER_TIMEOUT_MS . יש להשלים את כל פעולות הכיוון, החיפוש והשלבים תוך זמן זה.
  • Enum RDS ו- Deemphasis מוסרים ב-AIDL ומוגדרים כ-const int ב- AmFmRegionConfig . בהתאם, הן fmDeemphasis והן fmRds ב- ProgramInfo מוכרזים כ-int, תוצאת חישוב ביט של הדגלים המתאימים. בינתיים, שמם D50 ו- D75 שונה ל- DEEMPHASIS_D50 ו- DEEMPHASIS_D75 , בהתאמה.
  • Enum ProgramInfoFlags מוסרים ב-AIDL ומוגדרים כ-const int ב- ProgramInfo עם קידומת FLAG_ שנוספה. בהתאם, infoFlags ב- ProgramInfo מוכרז כ-int, תוצאת חישוב של דגלים. TUNED שונה גם ל- FLAG_TUNABLE , כדי לתאר טוב יותר את ההגדרה שלה שניתן לכוון את התחנה.
  • ב- AmFmBandRange , השם scanSpacing שונה ל- seekSpacing , מכיוון ששם scan שונה ל- seek ב-AIDL.
  • מכיוון שמושג האיחוד מוצג ב-AIDL, אין עוד שימוש MetadataKey וב- Metadata המוגדרים ב-HIDL HAL. Metadata של איגוד AIDL מוגדרים ב- AIDL HAL. כל ערך enum בעבר ב- MetadataKey הוא כעת שדה ב- Metadata עם סוג מחרוזת או int, בהתאם להגדרות שלהם.

יישום בקרת רדיו

הטמעת בקרת רדיו מבוססת על MediaSession ו- MediaBrowse , המאפשרות לאפליקציות מדיה ולעוזר קולי לשלוט ברדיו. למידע נוסף, ראה בניית אפליקציות מדיה למכוניות ב-Developer.android.com.

מימוש עץ עיון במדיה מסופק בספריית התמיכה ב-car-broadcastradio packages/apps/Car/libs . ספרייה זו מכילה גם הרחבות של ProgramSelector להמרה אל וממנה 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 , המציג רשימה של מקורות מדיה שניתן לעבור אליהם. אם יש צורך בממשק משתמש שונה מזה שסופק, תוכל ליצור ווידג'ט מותאם אישית כדי להפעיל את 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 חושף פריט מדיה שניתן לכוונן על פני שלושה סוגים של ספריות ברמה העליונה:

  • ( אופציונלי ) תוכניות (תחנות). מצב זה משמש בדרך כלל על ידי מכשירי רדיו כפולים כדי לציין את כל תחנות הרדיו הזמינות הניתנות לכיוונון במיקום המשתמש.
  • מועדפים. תוכניות רדיו נוספו לרשימת המועדפים, חלקן עשויות להיות לא זמינות (מחוץ לטווח קליטה).
  • ערוצי להקה. כל הערוצים האפשריים פיזית באזור הנוכחי (87.9, 88.1, 88.3, ​​88.5, 88.7, 88.9, 89.1 וכן הלאה). לכל להקה יש ספרייה נפרדת ברמה העליונה.
מבנה עץ MediaBrowserService
איור 2. מבנה העץ של MediaBrowserService

כל אלמנט בכל אחת מהתיקיות הללו (AM/FM/Programs) הוא MediaItem עם URI שניתן להשתמש בו עם MediaSession כדי לכוונן. כל תיקיה ברמה העליונה (AM/FM/Programs) היא פריט מדיה עם זיהוי מדיה שניתן להשתמש בו עם MediaSession כדי להפעיל השמעה, והוא נתון לשיקול דעתו של ה-OEM. לדוגמה, "הפעל FM", "הפעל AM" ו-"הפעל רדיו" הן כולן שאילתות רדיו לא ספציפיות המשתמשות במזהה מדיה כדי לשלוח לאפליקציית הרדיו של OEM. אפליקציית הרדיו תחליט מה להשמיע מהבקשה הגנרית ומה-mediaId.

MediaSession

בהינתן שאין מושג של השהיית זרם שידור, הפעולות הפעל, השהה ועצירה לא תמיד חלות על רדיו. ברדיו, פעולת העצירה משויכת להשתקת הזרם בעוד שההפעלה משויכת להסרת ההשתקה.

מקלטי רדיו מסוימים (או אפליקציות) מספקים את היכולת לדמות הפסקת זרם שידור על ידי שמירת תוכן במטמון ואז השמעתו מאוחר יותר. במקרים כאלה, השתמש onPause .

הפעלה מפעולות mediaId ו-URI נועדה לכוונן לתחנה שנשלפת מממשק MediaBrowser. ה-mediaId הוא מחרוזת שרירותית שמסופקת על ידי אפליקציית הרדיו כדי להטיל ערך ייחודי (כך שמזהה נתון מצביע על פריט אחד בלבד) ויציב (לכן לפריט נתון יש אותו מזהה לאורך כל הפגישה) שבאמצעותו ניתן לזהות תחנה נתונה . ה-URI יהיה בעל סכימה מוגדרת היטב. בקיצור, צורה מבוססת URI של ProgramSelector. זה אמנם שומר על תכונת הייחוד, אבל היא לא חייבת להיות יציבה, למרות שהיא יכולה להשתנות כאשר התחנה עוברת לתדר אחר.

לפי התכנון, לא נעשה שימוש onPlayFromSearch . באחריות הלקוח (האפליקציה הנלווית) לבחור תוצאת חיפוש מעץ MediaBrowser. העברת האחריות לאפליקציית הרדיו תגביר את המורכבות, ידרוש חוזים רשמיים לגבי האופן שבו שאילתות מחרוזות צריכות להופיע, ויגרום לחוויית משתמש לא אחידה בפלטפורמות חומרה שונות.

הערה: אפליקציית הרדיו אינה מכילה מידע נוסף שיועיל לחיפוש שם תחנה שלא נחשף ללקוח דרך ממשק MediaBrowser.

דילוג לתחנה הבאה או הקודמת תלוי בהקשר הנוכחי:

  • כאשר אפליקציה מכוונת לתחנה מרשימת המועדפים, האפליקציה יכולה לעבור לתחנה הבאה מרשימת המועדפים.
  • האזנה לתחנה מרשימת התוכניות עשויה לגרום לכוונון לתחנה הזמינה הבאה, ממוינת לפי מספר הערוץ.
  • האזנה לערוץ שרירותי עלולה לגרום לכוונון לערוץ הפיזי הבא, גם כאשר אין אות שידור.

אפליקציית הרדיו מטפלת בפעולות אלו.

טיפול בשגיאות

פעולות TransportControls (הפעל, עצור והבא) אינן מספקות משוב אם הפעולה מצליחה או לא. הדרך היחידה לציין שגיאה היא להגדיר את מצב MediaSession ל- STATE_ERROR עם הודעת שגיאה.

אפליקציית הרדיו חייבת לטפל בפעולות הללו ולבצע אותן או להגדיר מצב שגיאה. אם ביצוע פקודת ההפעלה אינו מיידי, יש לשנות את מצב ההשמעה ל- STATE_CONNECTING (במקרה של כוונון ישיר) או STATE_SKIPPING_TO_PREVIOUS או NEXT בזמן שהפקודה מבוצעת.

על הלקוח לצפות ב- PlaybackState ולוודא שההפעלה שינתה את התוכנית הנוכחית למה שהתבקש או הוכנס למצב השגיאה. STATE_CONNECTING לא יעלה על 30 שניות. עם זאת, כוונון ישיר לתדר AM/FM נתון אמור לבצע הרבה יותר מהר.

הוסף והסר מועדפים

ל-MediaSession יש תמיכה בדירוג, שבה ניתן להשתמש כדי לשלוט במועדפים. onSetRating שנקרא עם דירוג מסוג RATING_HEART מוסיף או מסיר את התחנה המכווננת כעת אל או מרשימת המועדפים.

בניגוד להגדרות מדור קודם, מודל זה מניח רשימת מועדפים לא מסודרת ובלתי מוגבלת, כאשר כל מועדף שמור הוקצה למשבצת מספרית (בדרך כלל, 1 עד 6). כתוצאה מכך, מערכות מבוססות מראש לא יהיו תואמות לפעולת onSetRating .

המגבלה של ה-API של MediaSession היא שניתן להוסיף או להסיר רק את התחנה המכווננת אליה. לדוגמה, תחילה יש לבחור פריטים לפני שניתן להסירם. זוהי רק מגבלה של לקוח MediaBrowser, כגון אפליקציה נלווית. אפליקציית הרדיו אינה מוגבלת באופן דומה. חלק זה הוא אופציונלי כאשר אפליקציה לא תומכת במועדפים.

MediaBrowser

כדי לבטא אילו תדרים או שמות ערוצים פיזיים (כאשר כוונון לערוץ שרירותי מתאים לטכנולוגיית רדיו נתונה) תקפים לאזור נתון, כל הערוצים (התדרים) התקפים רשומים עבור כל פס. באזור ארה"ב, זה מסתכם ב-101 ערוצי FM בטווח של 87.8 עד 108.0 מגה-הרץ (בשימוש במרווח של 0.2 מגה-הרץ) ו-117 ערוצי AM בטווח של 530 עד 1700 קילו-הרץ (באמצעות מרווח של 10 קילו-הרץ). מכיוון שרדיו HD משתמש באותו שטח ערוץ, הוא אינו מוצג בנפרד.

רשימת תוכניות הרדיו הזמינות כרגע היא שטוחה בכך שהיא אינה מאפשרת תוכניות תצוגה כגון קיבוץ לפי אנסמבל שידור אודיו ישיר (DAB).

ייתכן שלא ניתן יהיה לכוונן ערכים ברשימת המועדפים. למשל אם תוכנית נתונה מחוץ לטווח. אפליקציית הרדיו עשויה לזהות או לא לזהות אם ניתן לכוון את הערך מראש. אם כן, ייתכן שהוא לא יסמן את הערך כאפשר לשחק.

כדי לזהות תיקיות ברמה העליונה, מוחל אותו מנגנון המשמש את Bluetooth. כלומר, חבילת Extras של אובייקט MediaDescription מכילה שדה ספציפי למקלט בדיוק כפי ש-Bluetooth עושה עם 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 ).
    • מזהים ספציפיים לרדיו (RDS PI, DAB SId). MediaDescription.getMediaUri מנותח ל-ProgrammeSelector.

    בדרך כלל, אין צורך להביא תדר FM עבור ערך בתוכנית הנוכחית או ברשימת המועדפים (כיוון שהלקוח צריך לפעול על מזהי מדיה). עם זאת, אם יתעורר צורך כזה (לדוגמה, למטרות תצוגה), הוא קיים ב-URI וניתן לנתח אותו אל ProgramSelector . עם זאת, לא מומלץ להשתמש ב-URI לבחירת פריטים בהפעלה הנוכחית. לפרטים, ראה ProgramSelector .

    כדי להימנע מבעיות הקשורות לביצועים או לקלסר, שירות MediaBrowser חייב לתמוך בעימוד:

    הערה: כברירת מחדל, העימוד מיושם כברירת מחדל בגרסה onLoadChildren() ללא טיפול באפשרויות.

    לערכים קשורים מכל סוגי הרשימות (ערוצים גולמיים, תוכניות שנמצאו ומועדפים) עשויים להיות מזהי מדיה שונים (זה תלוי באפליקציית הרדיו; בספריית התמיכה יהיו שונים). URIs (בצורת ProgramSelector) נבדלים בין ערוצים גולמיים ותכניות שנמצאו ברוב המקרים (למעט FM ללא RDS), אך הם לרוב זהים בין תוכניות שנמצאו למועדפים (למעט, למשל, כאשר AF עודכן).

    שימוש במזהי מדיה שונים עבור ערכים מסוגים שונים של רשימות מאפשר לבצע פעולות שונות לגביהם. אתה יכול לעבור בין רשימת המועדפים או רשימת כל התוכניות ב- onSkipToNext , בהתאם לתיקיה של MediaItem שנבחר לאחרונה (ראה MediaSession ).

    פעולות מנגינות מיוחדות

    רשימת התוכניות מאפשרת למשתמשים לכוון לתחנה ספציפית, אך אינה מאפשרת למשתמשים לבצע בקשות כלליות כגון "כוונן ל-FM", מה שעלול לגרום לכוונון לתחנה שהאזינו לאחרונה ברצועת ה-FM.

    כדי לתמוך בפעולות כאלה, בחלק מהספריות ברמה העליונה יש את הדגל FLAG_PLAYABLE (יחד עם FLAG_BROWSABLE עבור תיקיות).

    פעולה מנגינת ל כיצד להנפיק
    נגן רדיו כל ערוץ רדיו startService(ACTION_PLAY_BROADCASTRADIO)

    אוֹ

    playFromMediaId(MediaBrowser. getRoot() )
    נגן FM כל ערוץ FM הפעל מה- mediaId של להקת FM.

    הקביעה לאיזו תוכנית לכוון תלויה באפליקציה. זה בדרך כלל הערוץ המכוון ביותר מהרשימה הנתונה. לפרטים על ACTION_PLAY_BROADCASTRADIO , ראה כוונות משחק כלליות .

    גילוי וחיבור שירות

    PackageManager יכול למצוא ישירות את עץ הרדיו המשרת MediaBrowserService. כדי לעשות זאת, התקשר ל- resolveService עם הכוונה ACTION_PLAY_BROADCASTRADIO (ראה כוונות משחק כלליות ) ודגל MATCH_SYSTEM_ONLY . כדי למצוא את כל השירותים המשרתים רדיו (ייתכן שיש יותר מאחד; לדוגמה, הפרד AM/FM ולוויין), השתמש queryIntentServices .

    השירות שנפתר מטפל גם בכוונת הקישור android.media.browse.MediaBrowserService . זה מאומת עם GTS.

    כדי להתחבר ל-MediaBrowserService שנבחר, צור מופע MediaBrowser עבור רכיב שירות נתון connect . לאחר יצירת החיבור, ניתן לקבל טיפול ל-MediaSession באמצעות getSessionToken .

    אפליקציית הרדיו יכולה להגביל את חבילות הלקוח המורשות להתחבר ביישום onGetRoot של השירות שלהם. האפליקציה אמורה לאפשר לאפליקציות מערכת להתחבר ללא רשימת היתרים. לפרטים על רשימת היתרים, ראה קבל את החבילה והחתימה של אפליקציית Assistant .

    אם האפליקציה הספציפית למקור (לדוגמה, אפליקציית רדיו) מותקנת במכשיר ללא תמיכת מקור כזו, היא עדיין תפרסם את עצמה כמטפלת בכוונת ACTION_PLAY_BROADCASTRADIO , אך עץ ה-MediaBrowser שלו לא יכיל תגיות ספציפיות לרדיו. לפיכך, לקוח שמוכן לבדוק אם מקור נתון זמין במכשיר, חייב:

    1. גלה את שירות הרדיו (התקשר resolveService עבור ACTION_PLAY_BROADCASTRADIO ).
    2. צור MediaBrowser ולאחר מכן התחבר אליו.
    3. קבע את הנוכחות של MediaItem עם EXTRA_BCRADIO_FOLDER_TYPE נוסף.

    הערה: ברוב המקרים, הלקוח חייב לסרוק את כל עצי MediaBrowser הזמינים כדי לזהות את כל המקורות הזמינים עבור התקן נתון.

    שמות להקות

    רשימת הלהקות מיוצגת על ידי קבוצה של ספריות ברמה העליונה עם תג מסוג תיקייה מוגדר ל- BCRADIO_FOLDER_TYPE_BAND . הכותרות של MediaItem שלהם הן מחרוזות מקומיות המייצגות שמות להקה. ברוב המקרים זה יהיה זהה לתרגום לאנגלית, אבל הלקוח לא יכול לסמוך על ההנחה הזו.

    כדי לספק מנגנון יציב לחיפוש להקות מסוימות, נוסף תג נוסף עבור תיקיות להקה, EXTRA_BCRADIO_BAND_NAME_EN . זהו שם לא מקומי של הלהקה ויכול לקחת רק אחד מהערכים המוגדרים מראש הבאים:

    • AM
    • FM
    • DAB

    אם הלהקה אינה ברשימה זו, אין להגדיר את תג שם הלהקה. עם זאת, אם הלהקה נמצאת ברשימה, היא חייבת להגדיר תג. רדיו HD אינו מונה רצועות נפרדות מכיוון שהוא משתמש באותו מדיום בסיס כמו AM/FM.

    כוונות משחק כלליות

    כל אפליקציה המיועדת להשמעת מקור נתון (כמו רדיו או תקליטור) חייבת להתמודד עם כוונת הפעלה כללית כדי להתחיל לנגן תוכן כלשהו, ​​אולי ממצב לא פעיל (לדוגמה, לאחר האתחול). זה תלוי באפליקציה איך לבחור תוכן להשמעה, אבל זה בדרך כלל תוכנית הרדיו שהושמעה לאחרונה או רצועת התקליטורים. ישנה כוונה נפרדת המוגדרת לכל מקור שמע:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD : CD-DA או CD-Text
    • android.car.intent.action.PLAY_DATADISC : דיסק נתונים אופטי כמו CD/DVD, אך לא CD-DA (ייתכן שהוא תקליטור במצב מעורב)
    • 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.

    גילוי שירות הוא למעשה הבעיה החשובה יותר שנפתרה עם כוונות אלו. הליך גילוי השירות קל וחד משמעי בדרך זו (ראה גילוי וחיבור שירות ).

    כדי להקל על כמה יישומי לקוח, ישנה דרך חלופית להנפיק פקודת הפעלה כזו (שיש ליישם אותה גם על ידי אפליקציית הרדיו): הנפקת playFromMediaId עם ה-rootId של צומת השורש (המשמש כ-mediaId). בעוד שצומת השורש לא אמור להיות ניתן להשמעה, ה-rootId שלו הוא מחרוזת שרירותית שניתן להפוך אותה לצריכה כ-mediaId. עם זאת, לקוחות אינם נדרשים להבין ניואנס זה.

    בורר תוכניות

    בעוד ש- mediaId מספיק כדי לבחור ערוץ מ- MediaBrowserService , הוא הופך להיות קשור להפעלה ולא עקבי בין ספקים. במקרים מסוימים הלקוח עשוי להזדקק למצביע מוחלט (כגון תדירות מוחלטת) כדי לשמור עליו בין הפעלות למכשירים.

    בעידן שידורי הרדיו הדיגיטליים, תדר חשוף אינו מספיק כדי לכוון לתחנה ספציפית. לכן, השתמש ProgramSelector כדי לכוונן לערוץ אנלוגי או דיגיטלי. ProgramSelector מורכב משני חלקים:

    • מזהה ראשי. מזהה ייחודי ויציב לתחנת רדיו נתונה שאינו משתנה אך עשוי שלא להספיק כדי לכוונן לתחנה זו. לדוגמה, קוד RDS PI, שעשוי להיות מתורגם לסימן הקריאה בארה"ב.
    • מזהים משניים. מזהים נוספים שימושיים לכיוונון לתחנה זו (לדוגמה, תדר), אולי כולל מזהים מטכנולוגיות רדיו אחרות. לדוגמה, לתחנת DAB עשויה להיות שידור אנלוגי.

    כדי לאפשר ProgramSelector להשתלב בפתרון המבוסס על MediaBrowser - או MediaSession , הגדר סכימת URI שתעשה אותה בסידרה. הסכימה מוגדרת כך:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>
    

    בדוגמה זו, החלק המזהים המשני (אחרי סימן השאלה ( ? )) הוא אופציונלי וניתן להסירו כדי לספק מזהה יציב לשימוש כ- mediaId . לדוגמה:

    • 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

    חלק הסמכות (AKA host) של program מספק מקום להרחבת סכימה בעתיד. מחרוזות סוג המזהה מצוינות במדויק כשמותיהן בהגדרת HAL 2.x של IdentifierType ופורמט הערך הוא מספר עשרוני או הקסדצימלי (עם קידומת 0x ).

    כל המזהים הספציפיים לספק מיוצגים על ידי הקידומת VENDOR_ . לדוגמה, VENDOR_0 עבור VENDOR_START ו- VENDOR_1 עבור VENDOR_START פלוס 1. URIs כאלה הם ספציפיים לחומרת הרדיו שבה הם נוצרו ולא ניתן להעביר אותם בין מכשירים שיוצרו על ידי יצרני OEM שונים.

    יש להקצות URIs אלה לכל פריט מדיה תחת תיקיות הרדיו ברמה העליונה. בנוסף, MediaSession חייבת לתמוך גם playFromMediaId וגם playFromUri . עם זאת, ה-URI מיועד בעיקר לחילוץ מטא נתונים רדיו (כגון תדר FM) ואחסון מתמשך. אין ערובה שה-URI יהיה זמין עבור כל פריטי המדיה (לדוגמה, כאשר סוג המזהה הראשי עדיין לא נתמך על ידי המסגרת). מצד שני, Media ID תמיד עובד. לא מומלץ ללקוחות להשתמש ב-URI כדי לבחור פריטים מההפעלה הנוכחית של MediaBrowser. במקום זאת, השתמש playFromMediaId . עם זאת, זה לא אופציונלי עבור אפליקציית ההגשה ו-URI חסרים שמורים למקרים מוצדקים היטב.

    העיצוב הראשוני השתמש בנקודתיים בודדת במקום ברצף :// לאחר חלק הסכמה. עם זאת, הראשון אינו נתמך על ידי android.net.Uri עבור הפניות URI היררכיות מוחלטות.

    סוגי מקור אחרים

    ניתן לטפל במקורות שמע אחרים באופן דומה. לדוגמה, קלט עזר ונגן תקליטורים אודיו.

    אפליקציה בודדת עשויה לשרת מספר סוגים של מקורות. במקרים כאלה, מומלץ ליצור MediaBrowserService נפרד עבור כל סוג מקור. אפילו במערך עם מספר מקורות / MediaBrowserServices, מומלץ מאוד לקיים MediaSession בודד בתוך אפליקציה אחת.

    תקליטור שמע

    דומה ל- Audio CD בכך שהאפליקציה שמשרתת דיסקים כאלה תחשוף את MediaBrowser עם ערך יחיד שניתן לדפדף בו (או יותר, אם למערכת יש מחליף CD), שבתורו יכיל את כל הרצועות של תקליטור נתון. אם למערכת אין את הידע על הרצועות בכל תקליטור (לדוגמה, כאשר כל הדיסקים מוכנסים למחסנית בבת אחת והיא לא קוראת את כולם), אז MediaItem עבור כל הדיסק יהיה רק PLAYABLE , לא BROWSABLE בתוספת PLAYABLE . אם אין דיסק בחריץ נתון, הפריט לא יהיה PLAYABLE ולא BROWSABLE (אבל כל משבצת חייבת להיות קיימת תמיד בעץ).

    מבנה עץ תקליטורי אודיו
    איור 3. מבנה עץ תקליטורי אודיו

    ערכים אלה יסומנו באופן דומה לזה של תיקיות רדיו שידור; הם יכילו שדות נוספים המוגדרים בממשק ה-API של MediaDescription:

    • EXTRA_CD_TRACK : עבור כל MediaItem בתקליטור שמע, מספר רצועה מבוססת 1.
    • EXTRA_CD_DISK : מספר דיסק מבוסס 1.

    עבור מערכת התומכת בתקליטור ודיסק תואם, ל-MediaItem ברמה העליונה תהיה כותרת של הדיסק. באופן דומה, ל-MediaItems עבור רצועות תהיה כותרת של הרצועה.

    קלט עזר

    האפליקציה המשרתת קלט עזר חושפת עץ MediaBrowser עם כניסה בודדת (או יותר, כאשר קיימות מספר יציאות) המייצגת את ה-AUX ביציאה. MediaSession המתאים לוקח את ה-mediaId שלו ועובר למקור זה לאחר קבלת בקשת playFromMediaId .

    מבנה עץ AUX
    איור 4. מבנה עץ AUX

    לכל ערך AUX MediaItem יהיה שדה נוסף EXTRA_AUX_PORT_NAME המוגדר בשם הלא-ממוקם של היציאה ללא הביטוי "AUX". לדוגמה, "AUX 1" היה מוגדר ל-"1", "AUX front" ל-"front" ו-"AUX" למחרוזת ריקה. באזורים שאינם אנגלית, תג השם יישאר באותו מחרוזת אנגלית. לא סביר כמו EXTRA_BCRADIO_BAND_NAME_EN , הערכים מוגדרים OEM ולא מוגבלים לרשימה מוגדרת מראש.

    אם החומרה יכולה לאתר מכשירים המחוברים ליציאת AUX, החומרה צריכה לסמן את ה- MediaItem כניתן PLAYABLE , רק אם הקלט מחובר. עדיין יש למנות את החומרה (אך לא PLAYABLE ) אם שום דבר לא היה מחובר ליציאה זו. אם לחומרה אין יכולת כזו, על המדיה תמיד להיות מוגדרת 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"

    הלקוח צריך לבדוק את המדיה המדיה ברמה העליונה עבור אלמנטים עם EXTRA_CD_DISK או EXTRA_AUX_PORT_NAME שדה שדה נוסף.

    דוגמאות מפורטות

    הדוגמאות הבאות מתייחסות למבנה העץ MediaBrowser עבור סוגי מקור שהם חלק מתכנון זה.

    שידור רדיו MediaBrowserserservice (Handles 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 (ניתן לשחק) - FM ללא rdsuri: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 בבוקר (ניתן לשחק) URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC ONE (ניתן לשחק) URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • מועדפים (ניתן לגלישה, ניתנת לשחק) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (ניתן לשחק) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC שני (לא ניתן לשחק) URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (ניתן לגלישה, ניתן לשחק): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 בבוקר (ניתן לשחק) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 בבוקר (ניתן לשחק) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 בבוקר (ניתן לשחק) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • 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
    • Dab (ניתן לשחק): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio 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
    • תקליטור המוזיקה שלי (ניתן לגלישה, ניתן להפעלה) EXTRA_CD_DISK=3
      • הכל לבד (ניתן לשחק) EXTRA_CD_TRACK=1
      • רייז, רייז (ניתן לשחק) EXTRA_CD_TRACK=2
    • חריץ ריק 4 (לא ניתן לשחק) EXTRA_CD_DISK=4

    Aux mediabrowserservice (מטפל ACTION_PLAY_AUX ):

    • AUX Front (ניתן לשחק) EXTRA_AUX_PORT_NAME="front"
    • AUX אחורי (ניתן לשחק) EXTRA_AUX_PORT_NAME="rear"