پیکربندی خط‌مشی‌های صوتی

نسخه Android 10 شامل بازسازی قابل‌توجهی در مدیر خط‌مشی صوتی است تا انعطاف‌پذیری بیشتری برای پشتیبانی از موارد استفاده پیچیده خودرو فراهم کند:

  • استراتژی‌های مسیریابی خاص سازنده اصلی محصول.
  • گروه‌های حجم قابل‌سفارشی‌سازی برای گروه‌های انواع جاری‌سازی قدیمی که از منحنی‌های حجم یکسان استفاده می‌کنند.
  • استراتژی‌های مسیریابی به‌جای کدگذاری سخت، توسط موتور خط‌مشی صوتی اعلام می‌شود.
  • منحنی‌های میزان صدا و گروه‌های مدیریت‌شده توسط موتور خط‌مشی صوتی.
  • بازسازی کد داخلی برای آماده‌سازی تقسیم آینده بین کد مشترک و کد قابل‌پیکربندی و ارائه مدیریت غنی‌تر دستگاه صوتی. برای مثال، استفاده از همه ویژگی‌های دستگاه، نه فقط نوع آن در قوانین خط‌مشی.

در Android 7.0 قالب فایل پیکربندی خط‌مشی صوتی (XML) برای توصیف توپولوژی صوتی معرفی شد.

در نسخه‌های قبلی Android، برای اعلام دستگاه‌های صوتی موجود در محصولتان باید از device/<company>/<device>/audio/audio_policy.conf استفاده می‌شد (نمونه‌ای از این فایل را برای سخت‌افزار صوتی Galaxy Nexus در device/samsung/tuna/audio/audio_policy.conf می‌توانید ببینید). بااین‌حال، CONF قالبی ساده و اختصاصی است که برای توصیف توپولوژی‌های پیچیده برای حوزه‌هایی مثل تلویزیون و خودرو بسیار محدود است.

‫Android 7.0 audio_policy.conf را منسوخ کرد و از تعریف توپولوژی صوتی بااستفاده از قالب فایل XML که خواناتر است، طیف گسترده‌ای از ابزارهای ویرایش و تجزیه دارد، و انعطاف‌پذیر است و می‌تواند توپولوژی‌های صوتی پیچیده را توصیف کند پشتیبانی کرد. ‫Android 7.0 از پرچم ساخت ‫USE_XML_AUDIO_POLICY_CONF برای انتخاب قالب XML فایل‌های پیکربندی استفاده می‌کند.

مزایای قالب XML

همانند فایل CONF، فایل XML امکان تعریف تعداد و انواع نمایه‌های جاری‌سازی برونداد و ورودی، دستگاه‌های قابل‌استفاده برای بازپخش و ضبط، و مشخصه‌های صوتی را فراهم می‌کند. علاوه‌براین، قالب XML بهبودهای زیر را ارائه می‌دهد:

  • در Android 10، استفاده هم‌زمان از بیش‌از یک برنامه ضبط فعال مجاز است.
    • شروع ضبط هرگز به‌دلیل وضعیت هم‌زمان رد نمی‌شود.
    • کاربرگ registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) تغییرات مسیر ضبط را به مشتریان اطلاع می‌دهد.
  • در موقعیت‌های زیر، کارخواه نمونه‌های صوتی بی‌صدا دریافت می‌کند:
    • مورد استفاده حساس به حریم خصوصی (برای مثال، VOICE_COMMUNICATION) فعال است.
    • کارخواه سرویس پیش‌زمینه‌ای یا واسط کاربر پیش‌زمینه‌ای ندارد.
    • نقش‌های ویژه توسط خط‌مشی تشخیص داده می‌شوند:
      • سرویس دسترس‌پذیری: حتی اگر مورد استفاده حساس به حریم خصوصی فعال باشد، می‌تواند ضبط کند.
      • «دستیار»: اگر میانای کاربری در بالا باشد، حساس به حریم خصوصی درنظر گرفته می‌شود.
  • ساختار نمایه‌های صوتی مشابه با توصیف‌گرهای صوتی ساده HDMI است و مجموعه‌ای متفاوت از نرخ‌های نمونه‌برداری/ماسک‌های کانال را برای هر قالب صوتی فعال می‌کند.
  • تعاریف صریحی برای همه اتصالات ممکن بین دستگاه‌ها و جاری‌سازی‌ها وجود دارد. قبلاً، یک قانون ضمنی امکان اتصال همه دستگاه‌های متصل به یک ماژول HAL را فراهم می‌کرد و از کنترل اتصالات درخواستی با APIهای وصله صوتی توسط خط‌مشی صوتی جلوگیری می‌کرد. در قالب XML، شرح توپولوژی محدودیت‌های اتصال را تعریف می‌کند.
  • پشتیبانی از شامل از تکرار تعریف‌های استاندارد A2DP،‏ USB، یا ارسال مجدد جلوگیری می‌کند.
  • منحنی‌های صدا قابل سفارشی‌سازی هستند. قبلاً، جدول‌های حجم کدبندی سخت می‌شدند. در قالب XML، جدول‌های حجم توصیف می‌شوند و می‌توانند سفارشی‌سازی شوند.

الگوی موجود در frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml بسیاری از این ویژگی‌ها را درحال استفاده نشان می‌دهد.

قالب و مکان فایل

فایل پیکربندی خط‌مشی صوتی جدید audio_policy_configuration.xml است و در /system/etc قرار دارد. مثال‌های زیر پیکربندی خط‌مشی صوتی ساده‌ای را در قالب فایل «زبان نشانه‌گذاری توسعه‌پذیر» برای Android 12 و نسخه‌های پایین‌تر از Android 12 نشان می‌دهد.

ساختار سطح بالا شامل ماژول‌هایی است که با هر ماژول سخت‌افزاری HAL صوتی مطابقت دارد، که هر ماژول دارای فهرستی از درگاه‌های ترکیبی، درگاه‌های دستگاه، و مسیرها است:

  • درگاه‌های ترکیبی نمایه‌های پیکربندی احتمالی را برای جاری‌سازی‌هایی که می‌توانند در HAL صوتی برای بازپخش و ضبط باز شوند توصیف می‌کنند.
  • درگاه‌های دستگاه دستگاه‌هایی را که می‌توانند متصل شوند با نوع آن‌ها (و درصورت لزوم نشانی و ویژگی‌های صوتی) توصیف می‌کنند.
  • مسیرها از توصیفگر درگاه ترکیبی جدا شده است و توصیف مسیرها از دستگاه به دستگاه یا جاری‌سازی به دستگاه را امکان‌پذیر می‌کند.

جدول‌های میزان صدا فهرست‌های ساده‌ای از نقاطی هستند که منحنی استفاده‌شده برای تبدیل شاخص واسط کاربر به میزان صدا در دسی‌بل را تعریف می‌کنند. یک فایل include جداگانه منحنی‌های پیش‌فرض را ارائه می‌دهد، اما هر منحنی برای یک مورد استفاده و دسته دستگاه خاص می‌تواند بازنویسی شود.

گنجاندن فایل

از روش «گنجاندن XML» (XInclude) می‌توان برای گنجاندن اطلاعات پیکربندی خط‌مشی صوتی موجود در فایل‌های XML دیگر استفاده کرد. همه فایل‌های اضافه‌شده باید ساختار شرح‌داده‌شده در بالا را با محدودیت‌های زیر دنبال کنند:

  • فایل‌ها فقط می‌توانند حاوی عناصر سطح بالا باشند.
  • فایل‌ها نمی‌توانند حاوی عناصر XInclude باشند.

از «استفاده شامل» برای جلوگیری از کپی کردن اطلاعات پیکربندی واحد سخت‌افزاری کنترل (HAL) صوتی «پروژه متن‌باز Android» استاندارد (AOSP) در همه فایل‌های پیکربندی خط‌مشی صوتی (که مستعد خطا است) استفاده کنید. یک فایل XML پیکربندی خط‌مشی صوتی استاندارد برای HALهای صوتی زیر ارائه شده است:

  • A2DP: a2dp_audio_policy_configuration.xml
  • تغییر مسیر زیرمیکس: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

سازمان کد خط‌مشی صوتی

‫AudioPolicyManager.cpp به چند واحد تقسیم شده است تا نگهداری و پیکربندی آن آسان شود. سازمان frameworks/av/services/audiopolicy شامل پیمانه‌های زیر است.

مدول شرح
/managerdefault شامل پیاده‌سازی رفتار و میاناهای عمومی مشترک بین همه برنامه‌ها می‌شود. مشابه AudioPolicyManager.cpp با عملکرد موتور و مفاهیم رایج انتزاعی.
/common کلاس‌های پایه را تعریف می‌کند (برای مثال، ساختارهای داده برای نمایه‌های جاری‌سازی صوتی ورودی خروجی، توصیف‌گرهای دستگاه صوتی، وصله‌های صوتی، و درگاه‌های صوتی). این مورد قبلاً در AudioPolicyManager.cpp تعریف شده است.
/engine

قوانینی را که مشخص می‌کند کدام دستگاه و حجم باید برای مورد استفاده قرار گیرد اجرا می‌کند. این رابط استاندارد با بخش عمومی را پیاده‌سازی می‌کند، برای مثال، برای دریافت دستگاه مناسب برای یک مورد استفاده بازپخش یا ضبط خاص، یا برای تنظیم دستگاه‌های متصل یا وضعیت خارجی (یعنی وضعیت تماس استفاده اجباری) که می‌تواند تصمیم مسیریابی را تغییر دهد.

در دو نسخه دردسترس است: پیکربندی‌پذیر و پیش‌فرض. برای اطلاعات مربوط به نحوه انتخاب نسخه، پیکربندی بااستفاده از چارچوب پارامتر را ببینید.

/engineconfigurable پیاده‌سازی موتور خط‌مشی که به «چارچوب پارامتر» متکی است (به زیر مراجعه کنید). پیکربندی براساس «چارچوب پارامتر» است و خط‌مشی توسط فایل‌های XML تعریف می‌شود.
/enginedefault پیاده‌سازی موتور خط‌مشی براساس پیاده‌سازی‌های قبلی «مدیر خط‌مشی صوتی Android». این حالت پیش‌فرض است و شامل قوانین سخت‌رمزی است که با پیاده‌سازی‌های Nexus و AOSP مطابقت دارد.
/service شامل میاناهای صحافی، رشته‌بندی، و پیاده‌سازی قفل کردن با میانای بقیه چارچوب می‌شود.

پیکربندی بااستفاده از «چارچوب پارامتر»

کد خط‌مشی صوتی به‌گونه‌ای سازمان‌دهی شده است که درک و نگهداری آن آسان باشد و درعین‌حال از خط‌مشی صوتی که کاملاً توسط فایل‌های پیکربندی تعریف شده است پشتیبانی کند. سازمان و طراحی خط‌مشی صوتی براساس «چارچوب پارامتر Intel»، چارچوبی مبتنی بر افزایه و مبتنی بر قانون برای مدیریت پارامترها است.

استفاده از خط‌مشی صوتی پیکربندی‌پذیر به فروشندگان OEM امکان می‌دهد:

  • ساختار سیستم و پارامترهای آن را در XML توصیف کنید.
  • برای دسترسی به پارامترهای شرح‌داده‌شده، زیرینه (افزایه) بنویسید (به زبان ++C) یا از زیرینه موجود استفاده مجدد کنید.
  • شرایط/قوانینی را تعریف کنید (در XML یا در زبان خاص دامنه) که براساس آن‌ها پارامتر معینی باید مقدار معینی را بپذیرد.

‫AOSP شامل نمونه‌ای از فایل پیکربندی خط‌مشی صوتی است که از «چارچوب پارامتر» در Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml استفاده می‌کند. برای جزئیات، به اسناد Intel درباره چارچوب پارامتر مراجعه کنید.

در Android 10 یا پایین‌تر، خط‌مشی صوتی پیکربندی‌پذیر بااستفاده از گزینه ساخت USE_CONFIGURABLE_AUDIO_POLICY انتخاب می‌شود. در Android 11 یا بالاتر، نسخه موتور خط‌مشی صوتی در فایل audio_policy_configuration.xml انتخاب می‌شود. برای انتخاب موتور خط‌مشی صوتی قابل‌پیکربندی، مقدار مشخصه engine_library عنصر globalConfiguration را روی configurable تنظیم کنید، مانند مثال زیر:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

میاناهای برنامه‌سازی کاربردی مسیریابی خط‌مشی صوتی

در Android 6.0، «میانای برنامه‌سازی کاربردی» عمومی «شمارش و انتخاب» معرفی شد که در بالای زیرساخت وصله صوتی/درگاه صوتی قرار دارد و به توسعه‌دهندگان برنامه امکان می‌دهد اولویت خود را برای خروجی یا ورودی دستگاه خاصی برای قطعه‌ها یا آهنگ‌های صوتی متصل نشان دهند.

در Android 7.0، «میانای برنامه‌سازی کاربردی شمارش و انتخاب» با آزمون‌های «مجموعه آزمون سازگاری» درستی‌سنجی می‌شود و برای شامل شدن مسیریابی برای جاری‌سازی‌های صوتی بومی C/C++ (OpenSL ES) گسترش می‌یابد. مسیریابی جاری‌سازی‌های بومی همچنان در Java انجام می‌شود، با افزودن میانای AudioRouting که جایگزین، ترکیب، و منسوخ می‌کند روش‌های مسیریابی صریح را که مختص کلاس‌های AudioTrack و AudioRecord بودند.

برای جزئیات مربوط به Enumeration and Selection API، به میاناهای پیکربندی Android و OpenSLES_AndroidConfiguration.h مراجعه کنید. برای جزئیات مربوط به مسیریابی صدا، به AudioRouting مراجعه کنید.

پشتیبانی چندکاناله

اگر سخت‌افزار و درایورتان از صدای چندکاناله ازطریق HDMI پشتیبانی می‌کند، می‌توانید جاری‌سازی صدا را مستقیماً به سخت‌افزار صوتی برون‌برد کنید (این کار میکسر AudioFlinger را دور می‌زند، بنابراین صدا به دو کانال پایین‌میکس نمی‌شود.) HAL صوتی باید نشان دهد که آیا نمایه جاری‌سازی خروجی از قابلیت‌های صوتی چندکاناله پشتیبانی می‌کند یا نه. اگر HAL قابلیت‌هایش را آشکار کند، مدیر خط‌مشی پیش‌فرض اجازه می‌دهد بازپخش چندکاناله ازطریق HDMI انجام شود. برای جزئیات پیاده‌سازی، به device/samsung/tuna/audio/audio_hw.c مراجعه کنید.

برای مشخص کردن اینکه محصولتان حاوی خروجی صوتی چندکاناله است، فایل پیکربندی خط‌مشی صوتی را ویرایش کنید تا خروجی چندکاناله محصولتان را توصیف کند. مثال زیر از frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml یک ماسک کانال پویا را نشان می‌دهد، به این معنی که مدیر خط‌مشی صوتی پس‌از اتصال، ماسک‌های کانال پشتیبانی‌شده توسط سینک HDMI را پُرسمان می‌کند.

همچنین می‌توانید ماسک کانال ثابتی مثل AUDIO_CHANNEL_OUT_5POINT1 را مشخص کنید. وقتی محتوا به دستگاه صوتی‌ای ارسال می‌شود که از صدای چندکاناله پشتیبانی نمی‌کند، ترکیب‌کننده AudioFlinger به‌طور خودکار محتوا را به صدای استریو تبدیل می‌کند.

کدک‌های رسانه

مطمئن شوید که کدک‌های صوتی که سخت‌افزار و درایورهای شما پشتیبانی می‌کنند به‌درستی برای محصولتان اعلام شده‌اند. برای جزئیات، به نمایش کدک‌ها در چارچوب مراجعه کنید.