אודיו דיגיטלי בחיבור USB

במאמר הזה נסקור את התמיכה של Android באודיו דיגיטלי ב-USB ובפרוטוקולים קשורים שמבוססים על USB.

קהל

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

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

סקירה כללית על USB

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

מושגים בסיסיים ומונחים

USB הוא צינור עם גורם מפעיל יחיד של פעולות העברת נתונים, שנקרא מארח. המארח מתקשר עם ציוד היקפי דרך האוטובוס.

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

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

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

לכל פונקציה היקפית יש ממשק שמגדיר את הפרוטוקול לתקשורת עם הפונקציה הזו.

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

יש שני סוגים של צינורות: message ו-stream. צינור להעברת הודעות משמש לבקרה ולסטטוס דו-כיווניים. צינור נתונים משמש להעברת נתונים בכיוון אחד.

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

יש שלושה מצבי העברת נתונים עיקריים: interrupt,‏ bulk ו-isochronous. נרחיב על מצב איסוכרוני בהקשר של אודיו.

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

מצבי USB ב-Android

מצב פיתוח

מצב פיתוח קיים מאז הגרסה הראשונית של Android. מכשיר Android מופיע כציוד היקפי USB למחשב מארח שבו פועלת מערכת הפעלה למחשב, כמו Linux, ‏ Mac OS X או Windows. הפונקציה ההיקפית היחידה שמוצגת היא Android fastboot או Android Debug Bridge‏ (adb). הפרוטוקולים fastboot ו-adb מוסיפים שכבה על מצב העברת הנתונים בכמות גדולה ב-USB.

מצב מארח

מצב מארח הוצג ב-Android 3.1 (רמת API 12).

מכשיר Android חייב לשמש כמארח, ורוב מכשירי Android כוללים מחבר micro-USB שלא מאפשר הפעלת מארח באופן ישיר. לכן בדרך כלל נדרש מתאם לנייד (OTG) כמו זה:

OTG

איור 1. מתאם לתנועה (OTG)

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

מרכז מופעל

איור 2. מרכז מופעל

מצב אביזר

מצב אביזר הוצג ב-Android 3.1 (רמת API 12) והועבר לאחור ל-Android 2.3.4. במצב הזה, מכשיר Android פועל כציוד היקפי USB, בשליטה של מכשיר אחר, כמו תחנת עגינה שמשמשת כמארח. ההבדל בין מצב פיתוח למצב אביזר הוא שפונקציות USB נוספות גלויות למארח, מעבר ל-adb. מכשיר Android מתחיל במצב פיתוח ולאחר מכן עובר למצב אביזר באמצעות תהליך מחדש של ניהול משא ומתן.

במסגרת Android 4.1 נוספו תכונות למצב אביזר, במיוחד אודיו כפי שמתואר בהמשך.

אודיו ב-USB

סוגים של USB

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

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

סיווג אודיו ב-USB

כאן אנחנו עוסקים רק בציוד היקפי שמטמיע פונקציות אודיו, ולכן עומד בדרישות של סיווג מכשירי האודיו. יש שתי מהדורות של מפרט הסיווג של אודיו ב-USB: סיווג 1 (UAC1) וסיווג 2 (UAC2).

השוואה לכיתות אחרות

USB כולל סיווגים רבים של מכשירים אחרים, שחלקם עשויים להתבלבל עם סיווג האודיו. Mass Storage Class‏ (MSC) משמש לגישה למדיה לפי קטעים, ואילו Media Transfer Protocol‏ (MTP) משמש לגישה מלאה לקובצי המדיה. אפשר להשתמש ב-MSC וב-MTP להעברת קובצי אודיו, אבל רק USB audio class מתאים לסטרימינג בזמן אמת.

מסופי אודיו

בדרך כלל, הפינים של ציוד אודיו היקפי הם אנלוגיים. האות האנלוגי שמוצג במסוף הקלט של ההתקן ההיקפי מומר לדיגיטל באמצעות ממיר אנלוגי-דיגיטלי (ADC), ועובר בפרוטוקול USB לשימוש המארח. ה-ADC הוא מקור נתונים למארח. באופן דומה, המארח שולח אות אודיו דיגיטלי באמצעות פרוטוקול USB להתקן ההיקפי, שבו ממיר דיגיטלי לאנלוגי (DAC) ממיר את האות ומציג אותו במסוף פלט אנלוגי. ה-DAC הוא sink של המארח.

ערוצים

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

מצב העברה איסוכרוני

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

העברות איסוכרוניות מתרחשות בכל תקופת התחלת פריים (SOF). תקופת ה-SOF היא אלפית שנייה אחת במהירות מלאה, ו-125 מיקרו-שניות במהירות גבוהה. כל פריים במהירות מלאה נושא עד 1,023 בייטים של עומס שימושי, ופרמ של מהירות גבוהה נושא עד 1,024 בייטים. על סמך הנתונים האלה, אנחנו מחשבים את קצב ההעברה המקסימלי כ-1,023,000 או 8,192,000 בייטים לשנייה. כך מוגדר מגבלה תיאורטית על שיעור הדגימה, מספר הערוצים ועומסי הביטים המשולבים של האודיו. המגבלה בפועל נמוכה יותר.

במצב איסוכרוני יש שלושה מצבי משנה:

  • ניתן להתאמה
  • אסינכרוני
  • סינכרוני

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

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

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

בטבלה הבאה מפורטים סיכומי המצבים המשניים של תקשורת איסוכרונית:

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

בפועל, מצב המשנה חשוב כמובן, אבל צריך להביא בחשבון גם גורמים אחרים.

תמיכה ב-Android בקטגוריית אודיו USB

מצב פיתוח

אין תמיכה באודיו USB במצב פיתוח.

מצב מארח

Android מגרסה 5.0 (רמת API‏ 21) ואילך תומך בקבוצת משנה של תכונות אודיו USB מסוג 1 (UAC1):

  • מכשיר Android צריך לשמש כמארח
  • פורמט האודיו חייב להיות PCM (סוג ממשק I)
  • עומק הביטים חייב להיות 16, ‏ 24 או 32 ביטים, כאשר 24 ביטים של נתוני אודיו שימושיים ממורכזים בצד ימין של הביטים המשמעותיים ביותר של המילה בת 32 הביטים.
  • תדירות הדגימה צריכה להיות 48,‏ 44.1,‏ 32,‏ 24,‏ 22.05,‏ 16,‏ 12,‏ 11.025 או 8kHz
  • מספר הערוצים חייב להיות 1 (מונו) או 2 (סטריאו)

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

מצב אביזר

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

האודיו במצב אביזר כולל את התכונות הבאות:

  • מכשיר Android צריך להיות בשליטה של מארח מנוסה שיכול קודם להעביר את מכשיר Android ממצב פיתוח למצב אביזר, ואז להעביר את נתוני האודיו מנקודת הקצה המתאימה. לכן, מכשיר Android לא מופיע כ'ללא נהג' למארח.
  • הכיוון חייב להיות קלט, ביחס למארח
  • פורמט האודיו חייב להיות PCM של 16 ביט
  • תדירות הדגימה חייבת להיות 44.1kHz
  • מספר הערוצים חייב להיות 2 (סטריאו)

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

יישומים של אודיו דיגיטלי ב-USB

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

סיפור על שני ממירי DAC

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

השוואה בין DAC

איור 3. השוואה בין שני DACs

איזה עיצוב טוב יותר? התשובה תלויה בצרכים שלכם. לכל אחד מהם יש יתרונות וחסרונות.

הערה: זוהי השוואה מלאכותית, כי במכשיר Android אמיתי כנראה שתי האפשרויות יהיו זמינות.

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

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

במכשירים ניידים יש לוחות מעגלים בצפיפות גבוהה, שעלולה לגרום ליותר הזדמנויות לשיחת צ'אט בין שני אנשים שאינם מדברים זה עם זה, שגורמת לירידה באיכות של אותות אנלוגיים סמוכים. תקשורת דיגיטלית פחות חשופה לרעש, ולכן העברת ה-DAC ממכשיר Android A ללוח מעגלים חיצוני C מאפשרת לבודד פיזית ואלקטרית את השלבים האנלוגיים האחרונים מלוח המעגלים הצפוף והרועש, וכתוצאה מכך ליהנות מאיכות אודיו גבוהה יותר.

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

אפליקציות במצב מארח

דוגמאות לאפליקציות אודיו אופייניות במצב מארח USB:

  • האזנה למוזיקה
  • טלפוניה
  • העברת הודעות מיידיות וצ'אט קולי
  • מוקלטת

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

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

ניפוי באגים במצב מארח

במצב מארח USB, אי אפשר לבצע ניפוי באגים ב-adb דרך USB. אפשרות חלופית מפורטת בקטע שימוש אלחוטי במאמר בנושא Android Debug Bridge.

הטמעת אודיו ב-USB

המלצות לספקי ציוד היקפי של אודיו

כדי לאפשר פעולה הדדית עם מכשירי Android, ספקי ציוד היקפי של אודיו צריכים:

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

המלצות ליצרני ציוד מקורי (OEM) של מכשירי Android ולספקי SoC

כדי לתמוך באודיו דיגיטלי ב-USB, יצרני ציוד מקורי (OEM) של מכשירים וספקי SoC צריכים:

  • תכנון חומרה שתומכת במצב מארח USB
  • הפעלת תמיכה במארח USB גנרי ברמת המסגרת באמצעות דגל התכונה android.hardware.usb.host.xml
  • הפעלת כל תכונות הליבה הנדרשות: מצב מארח USB, אודיו USB, מצב העברה איזוכרונית
  • להתעדכן לגבי הגרסאות האחרונות של הליבה והתיקונים שלה. למרות המטרה הנשגבת של תאימות לכיתה, יש ציוד היקפי קיים של אודיו עם מוזרויות, ולליבות האחרונים יש פתרונות זמניים לבעיות כאלה
  • מפעילים את מדיניות האודיו ב-USB כפי שמתואר בהמשך
  • מוסיפים את audio.usb.default ל-PRODUCT_PACKAGES בקובץ device.mk
  • בדיקה של יכולת הפעולה ההדדית עם התקני אודיו חיצוניים נפוצים ב-USB

הפעלת מדיניות אודיו ב-USB

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

device/oem/codename/audio_policy.conf

צריך להחליף את הרכיב 'oem' בנתיב לשם של יצרן המכשיר עם מערכת Android, ואת 'codename' בשם הקוד של המכשיר.

דוגמה לרשומה:

audio_hw_modules {
  ...
  usb {
    outputs {
      usb_accessory {
        sampling_rates 44100
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_USB_ACCESSORY
      }
      usb_device {
        sampling_rates dynamic
        channel_masks dynamic
        formats dynamic
        devices AUDIO_DEVICE_OUT_USB_DEVICE
      }
    }
    inputs {
      usb_device {
        sampling_rates dynamic
        channel_masks AUDIO_CHANNEL_IN_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_USB_DEVICE
      }
    }
  }
  ...
}

קוד מקור

ההטמעה של שיטת הפשטת החומרה (HAL) לאודיו ב-USB נמצאת כאן:

hardware/libhardware/modules/usbaudio/

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

בדיקת אודיו ב-USB

מידע על בדיקות CTS לאודיו ב-USB זמין במאמר בדיקות של בודק CTS לאודיו ב-USB.