این مقاله پشتیبانی Android از صدای دیجیتال USB و پروتکلهای مبتنی بر USB مربوطه را بررسی میکند.
مخاطب
مخاطبان هدف این مقاله عبارتاند از «سازندگان اصلی محصول» دستگاه Android، فروشندگان SoC، تأمینکنندگان لوازم جانبی صوتی USB، توسعهدهندگان برنامه صوتی پیشرفته، و دیگر افرادی که بهدنبال درک دقیق از عملکرد داخلی صدای دیجیتال USB در Android هستند.
کاربران نهایی دستگاههای Nexus باید مقاله ضبط و بازپخش صدا بااستفاده از حالت میزبان USB را در مرکز راهنمایی Nexus ببینند. اگرچه این مقاله برای کاربران نهایی نوشته نشده است، برخیاز مصرفکنندگان علاقهمند به صدا ممکن است بخشهایی از آن را جالب بیابند.
نمای کلی USB
«گذرگاه سریال عمومی» (USB) بهطور غیررسمی در مقاله ویکیپدیا USB توصیف شده است و بهطور رسمی توسط استانداردهای منتشرشده توسط USB Implementers Forum, Inc تعریف شده است. برای راحتی، مفاهیم کلیدی USB را در اینجا خلاصه میکنیم، اما استانداردها مرجع معتبر هستند.
مفاهیم و اصطلاحات پایه
USB یک گذرگاه با یک آغازگر واحد برای عملیات انتقال داده است که میزبان نامیده میشود. میزبان ازطریق گذرگاه با دستگاههای جانبی ارتباط برقرار میکند.
توجه: اصطلاحات دستگاه و لوازم جانبی مترادفهای رایجی برای پیرامونی هستند. در اینجا از این اصطلاحات استفاده نمیکنیم، زیرا ممکن است با دستگاه Android یا مفهوم مختص Android بهنام حالت لوازم جانبی اشتباه گرفته شود.
نقش حیاتی میزبان شمارش است: فرایند تشخیص اینکه کدام لوازم جانبی به گذرگاه متصل هستند، و پرسش از خصوصیات آنها که ازطریق توصیفگرها بیان میشوند.
یک دستگاه جانبی ممکن است یک شیء فیزیکی باشد اما درواقع چندین عملکرد منطقی را پیادهسازی کند. برای مثال، یک وبکم جانبی میتواند هم عملکرد دوربین و هم عملکرد صوتی میکروفون داشته باشد.
هر عملکرد جانبی میانایی دارد که پروتکل ارتباط با آن عملکرد را تعریف میکند.
میزبان ازطریق پایپ با یک پیرامونی در نقطه پایانی ارتباط برقرار میکند، منبع داده یا سینک توسط یکی از عملکردهای پیرامونی ارائه میشود.
دو نوع کانال وجود دارد: پیام و جاریسازی. از لوله پیام برای کنترل و وضعیت دوطرفه استفاده میشود. از لوله جاریسازی برای انتقال داده یکطرفه استفاده میشود.
میزبان همه انتقالهای داده را آغاز میکند، بنابراین اصطلاحات ورودی و خروجی نسبتبه میزبان بیان میشوند. عملکرد ورودی دادهها را از پیرامونی به میزبان منتقل میکند، درحالیکه عملکرد خروجی دادهها را از میزبان به پیرامونی منتقل میکند.
سه حالت اصلی انتقال داده وجود دارد: وقفه، انبوه، و همزمان. حالت همزمان در زمینه صدا بیشتر مورد بحث قرار خواهد گرفت.
دستگاه جانبی ممکن است پایانههایی داشته باشد که به دنیای خارج از خود دستگاه جانبی متصل میشوند. به این ترتیب، دستگاه جانبی برای ترجمه بین پروتکل 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 دارای اتصالگر میکرو USB هستند که مستقیماً اجازه عملکرد میزبان را نمیدهد، معمولاً به آداپتور «در سفر» (OTG) مانند این نیاز است:
شکل ۱. آداپتور On-the-go (OTG)
دستگاه Android ممکن است بسته به میزان نیروی موردنیاز لوازم جانبی خاص و میزان نیرویی که دستگاه Android میتواند تأمین کند، نیروی کافی برای کار کردن آن لوازم جانبی را فراهم نکند. حتی اگر برق کافی دردسترس باشد، ممکن است شارژ باتری دستگاه Android بهطور قابلتوجهی کاهش یابد. برای این موقعیتها، از یک هاب دارای منبع تغذیه مانند این استفاده کنید:
شکل ۲. مرکز کنترل با منبع تغذیه
حالت لوازم جانبی
حالت جانبی در Android 3.1 (سطح میانای برنامهسازی کاربردی ۱۲) معرفی شد و به Android 2.3.4 منتقل شد. در این حالت، دستگاه Android بهعنوان یک دستگاه جانبی USB تحت کنترل دستگاه دیگری مانند پایه شارژ که نقش میزبان را ایفا میکند، عمل میکند. تفاوت بین حالت توسعه و حالت وسیله جانبی این است که عملکردهای USB اضافی فراتر از adb برای میزبان قابلمشاهده است. دستگاه Android در حالت توسعه شروع میشود و سپس ازطریق فرایند مذاکره مجدد به حالت لوازم جانبی تغییر میکند.
حالت لوازم جانبی با ویژگیهای اضافی در Android 4.1 گسترش یافت، بهویژه صدا که در زیر توضیح داده شده است.
بلندگوی USB
کلاسهای USB
هر عملکرد جانبی دارای یک سند کلاس دستگاه مرتبط است که پروتکل استاندارد آن عملکرد را مشخص میکند. این کار باعث میشود میزبانهای سازگار با کلاس و عملکردهای جانبی بدون نیاز به آگاهی دقیق از عملکرد یکدیگر، با هم کار کنند. اگر میزبان و لوازم جانبی توسط نهادهای مختلف ارائه شوند، سازگاری کلاس بسیار مهم است.
اصطلاح بدون درایور مترادف رایجی برای سازگار با کلاس است و نشان میدهد که میتوان از ویژگیهای استاندارد چنین لوازم جانبی بدون نیاز به نصب درایور خاص سیستمعامل استفاده کرد. میتوان فرض کرد که دستگاه جانبیای که بهعنوان «بدون نیاز به درایور» برای سیستمعاملهای اصلی رایانه تبلیغ میشود مطابق با کلاس خواهد بود، هرچند ممکن است استثناهایی وجود داشته باشد.
کلاس صوتی USB
در اینجا فقط به لوازم جانبیای میپردازیم که عملکردهای صوتی را پیادهسازی میکنند و بنابراین از کلاس دستگاه صوتی پیروی میکنند. دو نسخه از مشخصات کلاس صوتی USB وجود دارد: کلاس ۱ (UAC1) و کلاس ۲ (UAC2).
مقایسه با کلاسهای دیگر
«یواسبی» شامل بسیاری از دستههای دستگاه دیگر است که برخیاز آنها ممکن است با دسته صوتی اشتباه گرفته شوند. از کلاس ذخیرهسازی انبوه (MSC) برای دسترسی بخشمحور به رسانه استفاده میشود، درحالیکه پروتکل انتقال رسانه (MTP) برای دسترسی کامل به فایل رسانه است. از هر دو MSC و MTP میتوان برای انتقال فایلهای صوتی استفاده کرد، اما فقط کلاس صوتی USB برای جاریسازی همزمان مناسب است.
پایانههای صوتی
پایانههای لوازم جانبی صوتی معمولاً آنالوگ هستند. سیگنال آنالوگ ارائهشده در پایانه ورودی جانبی توسط یک مبدل آنالوگ به دیجیتال (ADC) به دیجیتال تبدیل میشود، و ازطریق پروتکل USB منتقل میشود تا توسط میزبان مصرف شود. «کنترلکننده دادههای کمکی» منبع داده برای میزبان است. بههمین ترتیب، میزبان یک سیگنال صوتی دیجیتال ازطریق پروتکل USB به دستگاه جانبی ارسال میکند، جایی که یک مبدل دیجیتال به آنالوگ (DAC) آن را تبدیل کرده و به یک ترمینال خروجی آنالوگ ارائه میدهد. DAC یک سینک برای میزبان است.
کانالها
لوازم جانبی با عملکرد صوتی میتواند شامل پایانه منبع، پایانه مقصد، یا هر دو باشد. هر جهت میتواند یک کانال (مونو)، دو کانال (استریو)، یا بیشتر داشته باشد. لوازم جانبی با بیش از دو کانال چندکاناله نامیده میشوند. معمولاً جاریسازی استریو را متشکل از کانالهای چپ و راست تفسیر میکنند و بههمین ترتیب، جاریسازی چندکاناله را دارای مکانهای فضایی متناظر با هر کانال تفسیر میکنند. بااینحال، همچنین بسیار مناسب است (بهویژه برای صدای USB بیشتر از HDMI) که معنای فضایی استاندارد خاصی به هر کانال اختصاص داده نشود. در این مورد، این برنامه و کاربر هستند که باید نحوه استفاده از هر کانال را تعریف کنند. برای مثال، یک جاریسازی ورودی USB چهار کاناله ممکن است سه کانال اول را به میکروفونهای مختلف در یک اتاق متصل کند و کانال نهایی ورودی را از یک رادیو AM دریافت کند.
حالت انتقال همزمان
صدای USB از حالت انتقال همزمان برای ویژگیهای همزمان خود استفاده میکند، بهقیمت ازدست دادن بازیابی خطا. در حالت همزمان، پهنای باند تضمین میشود و خطاهای انتقال داده بااستفاده از بررسی افزونگی چرخهای (CRC) شناسایی میشوند. اما درصورت بروز خطا، هیچ تأییدیه بسته یا انتقال مجددی وجود ندارد.
انتقالهای همزمان در هر دوره «شروع قاب» (SOF) رخ میدهد. دوره SOF برای سرعت کامل یک میلیثانیه و برای سرعت بالا ۱۲۵ میکروثانیه است. هر قاب با سرعت کامل تا ۱۰۲۳ بایت بار مفید را حمل میکند، و یک قاب با سرعت بالا تا ۱۰۲۴ بایت را حمل میکند. با ترکیب اینها، حداکثر نرخ انتقال را ۱٬۰۲۳٬۰۰۰ یا ۸٬۱۹۲٬۰۰۰ بایت در ثانیه محاسبه میکنیم. این کار یک حد بالای نظری برای ترکیب نرخ نمونهبرداری صوتی، تعداد کانال، و عمق بیت تعیین میکند. حد عملی پایینتر است.
در حالت همزمان، سه حالت فرعی وجود دارد:
- تطبیقی
- غیرهمگام
- همزمان
در زیرحالت تطبیقی، منبع یا سینک جانبی با نرخ نمونهبرداری احتمالاً متغیر میزبان تطبیق مییابد.
در زیرحالت ناهمزمان (که بازخورد ضمنی نیز نامیده میشود)، سینک یا منبع نرخ نمونه را تعیین میکند و میزبان آن را میپذیرد. مزیت نظری اصلی زیرحالت ناهمگام این است که ساعت USB منبع یا سینک ازنظر فیزیکی و الکتریکی به ساعتی که DAC یا ADC را هدایت میکند نزدیکتر است (و درواقع ممکن است همان ساعت باشد یا از آن مشتق شده باشد). این مجاورت به این معنی است که زیرحالت ناهمزمان باید کمتر درمعرض لرزش ساعت قرار گیرد. علاوهبراین، ساعت استفادهشده توسط DAC یا ADC ممکن است برای دقت بالاتر و انحراف کمتر نسبت به ساعت میزبان طراحی شده باشد.
در زیرحالت همزمان، تعداد ثابتی از بایتها در هر دوره SOF منتقل میشود. نرخ نمونه صوتی بهطور مؤثر از ساعت USB استخراج میشود. از زیرحالت همزمان معمولاً با صدا استفاده نمیشود زیرا هم میزبان و هم جانبی تحت کنترل ساعت USB هستند.
جدول زیر حالتهای فرعی همزمان را خلاصه میکند:
| حالت فرعی | تعداد بایت در هر بسته |
بسامد نمونه تعیینشده توسط |
استفادهشده برای صدا |
|---|---|---|---|
| تطبیقی | متغیر | میزبان | بله |
| ناهمگام | متغیر | جانبی | بله |
| همزمان | ثابت | ساعت USB | no |
در عمل، البته زیرحالت اهمیت دارد، اما عوامل دیگر نیز باید درنظر گرفته شوند.
پشتیبانی Android از کلاس صوتی USB
حالت توسعه
صوت USB در حالت توسعه پشتیبانی نمیشود.
حالت میزبان
Android 5.0 (سطح میانای برنامهسازی کاربردی ۲۱) و بالاتر از زیرمجموعهای از ویژگیهای کلاس صوتی USB 1 (UAC1) پشتیبانی میکند:
- دستگاه Android باید نقش میزبان را ایفا کند
- قالب صدا باید PCM (نوع میانای I) باشد
- عمق بیت باید ۱۶ بیت، ۲۴ بیت، یا ۳۲ بیت باشد که در آن ۲۴ بیت داده صوتی مفید در مهمترین بیتهای کلمه ۳۲ بیتی چپچین شده است
- بسامد نمونه باید ۴۸، ۴۴.۱، ۳۲، ۲۴، ۲۲.۰۵، ۱۶، ۱۲، ۱۱.۰۲۵، یا ۸ کیلوهرتز باشد
- تعداد کانال باید ۱ (مونو) یا ۲ (استریو) باشد
بررسی دقیق کد منبع چارچوب Android ممکن است کد اضافی فراتر از حداقل موردنیاز برای پشتیبانی از این ویژگیها را نشان دهد. اما این کد تأیید نشده است، بنابراین ویژگیهای پیشرفتهتر هنوز ادعا نشدهاند.
حالت لوازم جانبی
Android 4.1 (سطح API ۱۶) پشتیبانی محدودی برای بازپخش صدا به میزبان اضافه کرد. وقتی در حالت لوازم جانبی هستید، Android بهطور خودکار برونداد صوتی را به USB هدایت میکند. یعنی دستگاه Android بهعنوان منبع داده برای میزبان، مثلاً پایه شارژ، عمل میکند.
صدای حالت لوازم جانبی این ویژگیها را دارد:
- دستگاه Android باید توسط میزبان آگاهی کنترل شود که بتواند ابتدا دستگاه Android را از حالت توسعه به حالت لوازم جانبی منتقل کند، و سپس میزبان باید دادههای صوتی را از نقطه پایانی مناسب منتقل کند. بنابراین دستگاه Android برای میزبان «بدون درایور» نشان داده نمیشود.
- جهت باید ورودی باشد و نسبتبه میزبان بیان شود
- قالب صوتی باید PCM ۱۶ بیتی باشد
- بسامد نمونه باید ۴۴٫۱ کیلوهرتز باشد
- تعداد کانال باید ۲ (استریو) باشد
صدای حالت لوازم جانبی بهطور گستردهای پذیرفته نشده است، و درحالحاضر برای طراحیهای جدید توصیه نمیشود.
برنامههای صدای دیجیتال USB
همانطور که از نام آن پیداست، سیگنال صوتی دیجیتال USB با یک جریان داده دیجیتال نشان داده میشود نه با سیگنال آنالوگ که در اتصالدهنده هدفون کوچک TRS رایج استفاده میشود. در نهایت، هر سیگنال دیجیتالی باید به آنالوگ تبدیل شود تا قابل شنیدن باشد. در انتخاب مکان قرار دادن آن تبدیل، معاوضههایی وجود دارد.
داستان دو DAC
در نمودار مثال زیر، دو طرح را مقایسه میکنیم. ابتدا یک دستگاه همراه با «پردازنده کاربرد» (AP)، مبدل دیجیتال به آنالوگ (DAC) داخلی، تقویتکننده، و اتصالدهنده آنالوگ TRS متصل به هدفون داریم. همچنین دستگاه همراهی را که ازطریق USB به DAC و تقویتکننده USB خارجی متصل شده باشد، بههمراه هدفون درنظر میگیریم.
شکل ۳. مقایسه دو DAC
کدام طراحی بهتر است؟ پاسخ به نیازهای شما بستگی دارد. هرکدام مزایا و معایبی دارد.
توجه: این مقایسه مصنوعی است، زیرا دستگاه Android واقعی احتمالاً هر دو گزینه را دردسترس خواهد داشت.
طراحی اول A سادهتر، ارزانتر، و با مصرف انرژی کمتر است، و با فرض اینکه اجزای آن بهطور یکسان قابلاعتماد باشند، طراحی قابلاعتمادتر خواهد بود. بااینحال، معمولاً بین کیفیت صدا و سایر الزامات موازنهای وجود دارد. برای مثال، اگر این دستگاه یک دستگاه بازار انبوه باشد، ممکن است برای برآورده کردن نیازهای مصرفکننده عمومی طراحی شده باشد، نه برای علاقهمندان به موسیقی.
در طراحی دوم، دستگاه جانبی صوتی خارجی C را میتوان برای کیفیت صوتی بالاتر و توان خروجی بیشتر طراحی کرد، بدون اینکه بر هزینه دستگاه Android پایه B برای بازار انبوه تأثیر بگذارد. بله، طراحی گرانتری است، اما هزینه آن فقط توسط کسانی که آن را میخواهند جذب میشود.
دستگاههای همراه بهدلیل داشتن بردهای مدار با چگالی بالا معروف هستند که میتواند منجر به فرصتهای بیشتری برای تداخل شود که سیگنالهای آنالوگ مجاور را تخریب میکند. ارتباط دیجیتال کمتر مستعد نویز است، بنابراین انتقال DAC از دستگاه Android A به برد مدار خارجی C باعث میشود مراحل نهایی آنالوگ از برد مدار متراکم و پرنویز بهصورت فیزیکی و الکتریکی ایزوله شود و درنتیجه صدای با کیفیت بالاتری تولید شود.
ازسوی دیگر، طراحی دوم پیچیدهتر است و با پیچیدگی بیشتر، فرصتهای بیشتری برای شکست وجود دارد. همچنین تأخیر اضافی از کنترلکنندههای USB وجود دارد.
برنامههای حالت میزبان
برنامههای صوتی معمول در حالت میزبان USB شامل موارد زیر است:
- گوش دادن به موسیقی
- مکالمه از راه دور
- پیامرسانی فوری و گپ صوتی
- درحال ضبط
برای همه این برنامهها، Android یک دستگاه جانبی صوتی دیجیتال USB سازگار را شناسایی میکند و بهطور خودکار پخش و ضبط صدا را بهطور مناسب و براساس قوانین خطمشی صوتی هدایت میکند. محتوای استریو در دو کانال اول دستگاه جانبی پخش میشود.
هیچ میانای برنامهسازی کاربردی خاصی برای صدای دیجیتال USB وجود ندارد. برای استفاده پیشرفته، مسیریابی خودکار ممکن است با برنامههایی که از USB آگاه هستند تداخل داشته باشد. برای چنین برنامههایی، مسیریابی خودکار را ازطریق کنترل مربوطه در بخش «رسانه» در تنظیمات / گزینههای توسعهدهنده غیرفعال کنید.
اشکالزدایی در حالت میزبان
وقتی در حالت میزبان USB هستید، اشکالزدایی adb ازطریق USB دردسترس نیست. برای جایگزین، بخش استفاده از بیسیم در Android Debug Bridge را ببینید.
پیادهسازی صدای USB
توصیههایی برای فروشندگان لوازم جانبی صوتی
برای تعاملپذیری با دستگاههای Android، فروشندگان لوازم جانبی صوتی باید:
- طراحی برای سازگاری کلاس صوتی؛ درحالحاضر Android کلاس ۱ را هدفیابی میکند، اما بهتر است برای کلاس ۲ برنامهریزی کنید
- از ویژگیهای غیرعادی اجتناب کنید
- آزمایش برای قابلیت همکاری با دستگاههای مرجع و پرطرفدار Android
- ویژگیهای پشتیبانیشده، رعایت کلاس صوتی، الزامات توان، و غیره را بهوضوح مستند کنید تا مصرفکنندگان بتوانند تصمیمهای آگاهانه بگیرند
توصیههایی برای سازندگان تجهیزات اصلی دستگاه Android و فروشندگان SoC
برای پشتیبانی از صدای دیجیتال USB، سازندگان تجهیزات اصلی دستگاه و فروشندگان 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 مراجعه کنید.