מאמר זה סוקר את התמיכה של Android באודיו דיגיטלי בחיבור USB ועוד פרוטוקולים מבוססי USB.
קהל
קהל היעד של המאמר הזה הוא יצרני ציוד מקורי למכשירי Android, ספקי SoC, ספקים של ציוד היקפי לאודיו בחיבור USB, מפתחים מתקדמים של אפליקציות אודיו, ואחרים הזקוקים להבנה מעמיקה של אודיו דיגיטלי בחיבור USB ב-Android.
משתמשי קצה של מכשירי Nexus צריכים לראות את המאמר הקלטה והשמעת אודיו באמצעות מצב מארח USB ב במקום זאת, ניתן במרכז העזרה של Nexus. המאמר הזה לא מיועד למשתמשי קצה, צרכנים מסוימים חובבי אודיו עשויים למצוא קטעים שעשויים לעניין אותם.
סקירה כללית של USB
אפיק טורי אוניברסלי (USB) מתואר בצורה לא רשמית במאמר בוויקיפדיה USB, ומוגדרת באופן רשמי על ידי הסטנדרטים שמפורסמים USB Implementers Forum, Inc. לנוחיותכם, נסכם כאן את המושגים העיקריים של USB, אבל הסטנדרטים הם המקור המוסמך.
מושגים בסיסיים ומונחים
USB הוא אוטובוס עם יוזם יחיד של פעולות העברת נתונים, שנקרא המארח. המארח מתקשר עם ציוד היקפי דרך האוטובוס.
הערה: המונחים device ואביזר הם מילים נרדפות נפוצות ציוד היקפי. אנחנו לא משתמשים במונחים האלה, כי הם עלולים להתבלבל מכשיר Android או הקונספט הספציפי ל-Android שנקרא מצב האביזר.
תפקיד מארח קריטי הוא ספירה: תהליך הזיהוי של ציוד היקפי שמחובר לאוטובוס, והרצת שאילתות לגבי המאפיינים שלהם שמבוטאים באמצעות תיאורים.
ציוד היקפי יכול להיות אובייקט פיזי אחד אבל בפועל מיישמים כמה פונקציות לוגיות. לדוגמה, לציוד היקפי של מצלמת אינטרנט יכול להיות גם פונקציה של מצלמה וגם פונקציית האודיו של המיקרופון.
לכל פונקציה היקפית יש ממשק מגדיר את הפרוטוקול לתקשורת עם הפונקציה הזו.
המארח מתקשר עם ציוד היקפי דרך pipe לנקודת קצה (endpoint), מקור נתונים או sink סופק על ידי אחת מהפונקציות של הציוד ההיקפי.
יש שני סוגים של קווים אנכיים: הודעה וסטרימינג. צינור עיבוד נתונים משמש לשליטה דו-כיוונית ולסטטוס. צינור עיבוד נתונים משמש להעברת נתונים חד-כיוונית.
המארח יוזם את כל העברות הנתונים, לכן, המונחים input ו-output באים לידי ביטוי ביחס למארח. פעולת קלט מעבירה נתונים מהציוד ההיקפי למארח, בזמן שפעולת פלט מעבירה נתונים מהמארח לציוד ההיקפי.
יש שלושה מצבים עיקריים של העברת נתונים: הפרעות, בכמות גדולה ואיזוכרון. במצב כרונולוגי נדון בהרחבה בהקשר של אודיו.
בציוד ההיקפי עשויים להיות טרמינלים שמתחברים לעולם החיצוני, מעבר לציוד ההיקפי עצמו. כך, הציוד ההיקפי משמש כדי לתרגם בין פרוטוקול USB לבין 'עולם אמיתי' . המסופים הם אובייקטים לוגיים של הפונקציה.
מצבי USB ב-Android
מצב פיתוח
מצב פיתוח קיים מאז ההשקה הראשונית של Android. מכשיר Android מופיע כציוד היקפי בחיבור USB במחשב מארח שפועלת בו מערכת הפעלה שולחנית כמו Linux, Mac OS X או Windows. הפונקציה ההיקפית היחידה שנראית לה היא אתחול מהיר של Android או Android Debug Bridge (adb). פרוטוקולים של אתחול מהיר ו-adb פרוסים מעל מצב העברת נתונים בכמות גדולה בחיבור USB.
מצב מארח
מצב מארח נכלל ב-Android 3.1 (רמת API 12).
מכשיר Android צריך לשמש כמארח, ורוב מכשירי Android כוללים את מחבר מיקרו-USB שלא מאפשר באופן ישיר פעולה על ידי המארח, מתאם בדרכים (OTG) כמו הדרישה הזו בדרך כלל:
ייתכן שמכשיר Android לא מספק מספיק אנרגיה להפעלה של ציוד היקפי ספציפי, בהתאם לכמות החשמל שדרושה לציוד ההיקפי ואת הכמות שמכשיר ה-Android יכול לספק. גם אם אם קיים סוללה מספקת, הטעינה של הסוללה של מכשיר ה-Android עשויה הם יקוצרו באופן משמעותי. במצבים כאלה, מומלץ להשתמש hub, למשל:
מצב האביזר
מצב האביזר הושק ב-Android 3.1 (רמת API 12) והועבר חזרה ל-Android 2.3.4. במצב הזה, מכשיר Android פועל כציוד היקפי בחיבור USB, בשליטת מכשיר אחר, כמו אביזר עגינה שמשמש כמארח. ההבדל בין מצב פיתוח למצב אביזר הוא שפונקציות USB נוספות גלויות למארח, מעבר ל-adb. מכשיר Android יתחיל במצב פיתוח ואז עובר למצב 'אביזר' בתהליך משא ומתן מחדש.
מצב האביזר הוארך עם תכונות נוספות ב-Android 4.1, ספציפית האודיו שמתואר בהמשך.
אודיו בחיבור USB
סוגי USB
לכל פונקציה של ציוד היקפי משויך מסמך סיווג מכשיר שמציין את הפרוטוקול הסטנדרטי לפונקציה הזו. כך ניתן להפעיל מארחים ופונקציות היקפיות שתואמות למחלקות לתפעל אותם זה לצד זה, ללא ידע מפורט על דרכי הפעולה של כל אחד מהשני. תאימות הסיווג היא קריטית אם המארח והציוד ההיקפי מסופקים על ידי ישויות שונות.
המונח driverless הוא שם נרדף נפוץ לתואם למחלקה, שמציינת שאפשר להשתמש בתכונות הסטנדרטיות של ציוד היקפי ללא צורך בהפעלה ספציפית של מערכת ההפעלה מנהל ההתקנים שרוצים להתקין. אפשר להניח שציוד היקפי שמתפרסם כ"אין צורך בנהג" למערכות הפעלה מרכזיות למחשבים שולחניים יעמדו בדרישות של השיעור, אבל יכולים להיות חריגים.
סיווג אודיו ב-USB
כאן אנחנו עוסקים רק בציוד היקפי פונקציות אודיו, וכך לפעול בהתאם לסיווג של מכשיר האודיו. יש שתי פלטפורמות מהדורות של מפרט סיווג האודיו ב-USB: מחלקה 1 (ציות1 ) ו-2 (UAC2).
השוואה לקטגוריות אחרות
USB כולל הרבה סוגי מכשירים אחרים, שחלקם עשויים להיות מבלבלים בסיווג האודיו. סוג אחסון (storage class) (MSC) משמש עבור שממוקדת במגזר מסוים למדיה, Media Transfer Protocol (פרוטוקול העברת מדיה) (MTP) מיועדת לגישה מלאה של קבצים למדיה. אפשר להשתמש גם ב-MSC וגם ב-MTP כדי להעביר קובצי אודיו, אבל רק סיווג אודיו של USB מתאים לסטרימינג בזמן אמת.
מסופי אודיו
המסופים של ציוד היקפי לאודיו הם בדרך כלל אנלוגיים. האות האנלוגי שמוצג בנקודת הקלט של הציוד ההיקפי מומר לדיגיטלי על ידי ממיר אנלוגי לדיגיטל (ADC), שמועבר באמצעות פרוטוקול USB לשימוש על ידי המארח. ADC הוא מקור נתונים למארח. באופן דומה, המארח שולח אות אודיו דיגיטלי בחיבור USB לציוד ההיקפי, שבו ממיר דיגיטלי לאנלוגי (DAC) ממירה ומציג למסוף פלט אנלוגי. DAC הוא sink למארח.
ערוצים
ציוד היקפי עם פונקציית אודיו יכול לכלול טרמינל מקור, מסוף כיור או את שניהם. לכל כיוון יכול להיות ערוץ אחד (מונו), שני ערוצים (סטריאו), ועוד. ציוד היקפי שיש לו יותר משני ערוצים נקראים ריבוי ערוצים. מקובל לפרש זרם סטריאו שכולל שמאל וימין, וכתוצאה מכך לפרש זרם מרובה-ערוצים מיקומים מרחביים התואמים לכל ערוץ. עם זאת, היא גם מתאימה למדי (במיוחד עבור אודיו ב-USB, HDMI) כדי שלא להקצות משמעות מרחבית סטנדרטית של כל אחד מהערוצים. במקרה הזה, נקבע עד והמשתמש כדי להגדיר את אופן השימוש בכל ערוץ. לדוגמה, זרם USB בן ארבעה ערוצים עשוי לכלול את שלושת הסוגים ערוצים שמחוברים למיקרופונים שונים בחדר, שמקבל קלט מרדיו AM.
מצב העברה מבודד
אודיו USB משתמש במצב העברה איזוכרון למאפיינים בזמן אמת, על חשבונו של התאוששות משגיאות. במצב איזוכרוני, רוחב הפס מובטח והעברת הנתונים מתבצעות שגיאות באמצעות בדיקת יתירות מחזורית (CRC). אבל יש אין אישור של המנות או שידור חוזר של המנות במקרה של שגיאה.
שידורים מסוימים מתרחשים בכל תקופה של תחילת הפריים (SOF). פרק הזמן של SOF הוא אלפית השנייה במהירות מלאה, ו-125 מיקרו-שניות במהירות גבוהה. כל מסגרת במהירות מלאה נושאת במטען ייעודי (payload) של עד 1,023 בייטים, ומסגרת במהירות גבוהה נושאת עד 1,024 בייטים. כשמשלבים בין כל הדברים האלה, קצב ההעברה המקסימלי הוא 1,023,000 או 8,192,000 בייטים לשנייה. ההגדרה הזו מגדירה גבול עליון תיאורטי לאודיו המשולב קצב הדגימה, ספירת הערוצים ועומק הסיביות. המגבלה המעשית נמוכה יותר.
במצב איזוכרוני יש שלושה מצבי משנה:
- ניתן להתאמה
- אסינכרוני
- סינכרוני
בתת-מצב דינמי, המקור או ה-sink ההיקפי מסתגלים לקצב הדגימה שעשוי להשתנות של המארח.
בתת-מצב אסינכרוני (נקרא גם משוב מרומז) ה-sink או המקור קובעים את קצב הדגימה, והמארח מתאים. היתרון התיאורטי העיקרי של תת-מצב אסינכרוני הוא שהמקור או שעון ה-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 (סטריאו)
ייתכן שקוד המקור של ה-framework של Android יופיע על קוד נוסף מעבר למינימום הנדרש כדי לתמוך בתכונות האלה. אבל הקוד הזה לא אומת, ולכן תכונות מתקדמות יותר עדיין לא נתבעו.
מצב האביזר
מערכת Android 4.1 (רמת API 16) הוסיפה למארח תמיכה מוגבלת בהפעלת אודיו. כשמצב 'אביזר' מופעל, Android מנתב את פלט האודיו באופן אוטומטי ל-USB. כלומר, מכשיר ה-Android משמש כמקור נתונים למארח, למשל אביזר עגינה.
אודיו במצב אביזר כולל את התכונות הבאות:
- מכשיר Android חייב להיות נשלט על ידי מארח בעל ידע יכול קודם להעביר את מכשיר Android ממצב פיתוח למצב אביזרים, ואז המארח צריך להעביר את נתוני האודיו מנקודת הקצה המתאימה. לכן, מכשיר Android לא מופיע 'ללא מנהל התקן' למארח.
- הכיוון חייב להיות קלט, המבוטא ביחס למארח
- פורמט האודיו חייב להיות PCM של 16 ביט
- תדירות הדגימה חייבת להיות 44.1kHz
- מספר הערוצים חייב להיות 2 (סטריאו)
השימוש באודיו במצב האביזר לא היה נפוץ, ובשלב הזה לא מומלץ להשתמש בה בעיצובים חדשים.
אפליקציות של אודיו דיגיטלי בחיבור USB
כפי שמציין השם, מיוצג אות האודיו הדיגיטלי של ה-USB לפי מקור נתונים דיגיטלי ולא האנלוגי. אות שמשמש את ה-TRS Mini הנפוץ מחבר האוזניות. בסופו של דבר, צריך להמיר כל אות דיגיטלי לאנלוגי כדי לשמוע אותו. לבחירת המיקום להציב את ההמרה יש יתרונות וחסרונות.
סיפור של שני ספקים של מודעות דינמיות (DAC)
בתרשים לדוגמה שבהמשך אנחנו משווים בין שני עיצובים. קודם כל יש מכשיר נייד עם מעבד אפליקציות (AP), DAC מובנה, מגבר, ומחבר TRS אנלוגי שמחובר לאוזניות. אנחנו מתייחסים גם מכשיר נייד עם USB שמחובר ל-USB DAC ולמגבר חיצוניים, גם באמצעות אוזניות.
איזה עיצוב טוב יותר? התשובה תלויה בצרכים שלך. לכל אחת מהן יש יתרונות וחסרונות.
הערה: זוהי השוואה מלאכותית, מאחר במכשיר Android אמיתי, סביר להניח ששתי האפשרויות יהיו זמינות.
העיצוב הראשון א' פשוט יותר, זול יותר, צורך פחות אנרגיה והתכנון יהיה אמין יותר, בהנחה שהרכיבים מהימנים באותה מידה. אבל בדרך כלל יש השוואה בין איכות האודיו לבין דרישות אחרות. לדוגמה, אם מדובר במכשיר שמיועד למסחר המוני, ייתכן שהוא יעוצב כך שיתאים לצרכים של הצרכן הכללי, לא של האודיופיל.
בעיצוב השני, ניתן לתכנן את ציוד היקפי האודיו החיצוני C איכות אודיו גבוהה יותר והספק כוח גבוה יותר בלי להשפיע על העלות של מכשיר Android B בשוק ההמוני הבסיסי. כן, זה עיצוב יקר יותר, אבל רק מי שרוצים יכול לקחת את העלות.
מכשירים ניידים ידועים לשמצה בצפיפות גבוהה של מעגלים חשמליים, שעשויים להוביל להזדמנויות נוספות דיבור הדדי שמפירה אותות אנלוגיים דומים. תקשורת דיגיטלית חשופה פחות רעש, לכן צריך להעביר את ה-DAC ממכשיר Android A ללוח מעגל חיצוני השלבים האנלוגיים הסופיים עם C מאפשר להיות פיזית וחשמלית המערכת מבודדת מלוח המעגל עם הדחיסה והרעש, וכתוצאה מכך מתקבלת אודיו באיכות גבוהה יותר.
לעומת זאת, העיצוב השני מורכב יותר, וככל שהמורכבות יותר מורכבת הזדמנויות להיכשל. יש גם זמן אחזור נוסף מבקרי ה-USB.
אפליקציות במצב מארח
אפליקציות אודיו אופייניות במצב מארח USB כוללות:
- האזנה למוזיקה
- טלפוניה
- העברת הודעות מיידיות וצ'אט קולי
- מוקלטת
עבור כל האפליקציות האלה, מערכת Android מזהה התקן USB דיגיטלי תואם ציוד היקפי לאודיו, ומנתב את ההפעלה והצילום של האודיו באופן אוטומטי בהתאם לכללי המדיניות בנושא אודיו. תוכן סטריאו מופעל בשני הערוצים הראשונים של הציוד ההיקפי.
אין ממשקי API ספציפיים לאודיו דיגיטלי ב-USB. לשימוש מתקדם, הניתוב האוטומטי עלול להפריע לאפליקציות שתומכים ב-USB. צריך להשבית את הניתוב האוטומטי באפליקציות כאלה באמצעות הפקד המתאים בקטע Media (מדיה) הגדרות / אפשרויות למפתחים.
ניפוי באגים במצב מארח
במצב אירוח USB, ניפוי באגים באמצעות adb ב-USB לא זמין. אפשר לעיין בקטע שימוש בחיבור אלחוטי. מתוך הכלי לניפוי באגים ב-Android כחלופה.
הטמעת אודיו בחיבור USB
המלצות לספקים של ציוד היקפי לאודיו
כדי לפעול באופן הדדי עם מכשירי Android, ספקי ציוד היקפי של אודיו צריכים:
- תכנון לתאימות לסיווג אודיו; מערכת Android מטרגטת כרגע את כיתה 1, אבל כדאי לתכנן לכיתה 2
- להימנע ממוזרדות
- בדיקה של יכולת פעולה הדדית בחומרי עזר ובמכשירי Android פופולריים
- לתעד באופן ברור תכונות נתמכות, תאימות של סיווג אודיו, דרישות חשמל וכו'. כדי שהצרכנים יוכלו לקבל החלטות מושכלות
המלצות ליצרני ציוד מקורי למכשירי Android ולספקי SoC
כדי לתמוך באודיו דיגיטלי בחיבור USB, יצרני ציוד מקורי של מכשירים וספקי SoC צריכים:
- עיצוב חומרה לתמיכה במצב אירוח USB
- הפעלת תמיכה במארח USB גנרי ברמת ה-framework
באמצעות התכונה הניסיונית
android.hardware.usb.host.xml
- להפעיל את כל תכונות הליבה הנדרשות: מצב מארח USB, אודיו ב-USB, מצב העברה איזורונית; למידע נוסף, ראו הגדרת ליבה (Kernel) של Android.
- להתעדכן בגרסאות ובתיקונים האחרונים של הליבה; למרות המטרה העיקרית של תאימות לסיווג, יש ציוד היקפי קיים של אודיו עם quirks, ולליבות עדכניות יש פתרונות עקיפים כאלה.
- הפעלת המדיניות בנושא אודיו בחיבור USB כפי שמתואר בהמשך
- הוספת audio.usb.default ל-PRODUCT_PACKAGES ב-device.mk
- בדיקה ליכולת פעולה הדדית עם ציוד היקפי נפוץ של אודיו בחיבור USB
הפעלת המדיניות בנושא אודיו בחיבור USB
כדי להפעיל אודיו ב-USB, צריך להוסיף רשומה קובץ התצורה של מדיניות האודיו. בדרך כלל שנמצא כאן:
device/oem/codename/audio_policy.conf
רכיב שם הנתיב 'oem' צריך להחליף את השם של ה-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 } } } ... }
קוד מקור
The Abstraction Layer (HAL) של חומרת האודיו יישום אודיו ב-USB נמצא כאן:
hardware/libhardware/modules/usbaudio/
פרוטוקול אודיו HAL ב-USB מסתמך בעיקר על tinyalsa, מתואר במינוח של אודיו. למרות שאודיו ב-USB מסתמך על העברות אזוריות, הוא מופשט באמצעות הטמעת ALSA. אז לא צריך לדאוג, בעצמם עם החלק הזה של פרוטוקול ה-USB.
בדיקת אודיו ב-USB
למידע על בדיקות CTS לאודיו ב-USB, ראו בדיקות אימות CTS של USB אודיו.