سیاست های صوتی را پیکربندی کنید

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

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

اندروید ۷.۰ یک فرمت فایل پیکربندی سیاست صوتی (XML) برای توصیف توپولوژی صوتی شما معرفی کرد.

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

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

مزایای فرمت XML

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

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

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

فرمت و محل فایل

فایل پیکربندی جدید سیاست صوتی audio_policy_configuration.xml است و در مسیر /system/etc قرار دارد. مثال‌های زیر یک پیکربندی ساده از سیاست صوتی را در قالب فایل XML برای اندروید ۱۲ و نسخه‌های پایین‌تر از اندروید ۱۲ نشان می‌دهند.

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

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

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

موارد گنجانده شده در فایل

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

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

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

  • A2DP: a2dp_audio_policy_configuration.xml
  • تغییر مسیر زیرمیکس: rsubmix_audio_policy_configuration.xml
  • یو‌اس‌بی: usb_audio_policy_configuration.xml

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

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

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

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

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

/engineconfigurable پیاده‌سازی موتور سیاست که به Parameter Framework متکی است (به پایین مراجعه کنید). پیکربندی بر اساس Parameter Framework است و در آن سیاست توسط فایل‌های XML تعریف می‌شود.
/enginedefault پیاده‌سازی موتور سیاست‌گذاری بر اساس پیاده‌سازی‌های قبلی Android Audio Policy Manager. این پیش‌فرض است و شامل قوانین کدگذاری‌شده‌ی ثابتی است که با پیاده‌سازی‌های Nexus و AOSP مطابقت دارند.
/service شامل رابط‌های اتصال، نخ‌بندی و پیاده‌سازی قفل با رابط به بقیه چارچوب است.

پیکربندی با استفاده از Parameter Framework

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

استفاده از سیاست صوتی قابل تنظیم، فروشندگان OEM را قادر می‌سازد تا:

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

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

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

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

APIهای مسیریابی سیاست صوتی

اندروید ۶.۰ یک API عمومی برای شمارش و انتخاب معرفی کرد که بر روی زیرساخت پورت صوتی/پچ صوتی قرار می‌گیرد و به توسعه‌دهندگان برنامه اجازه می‌دهد تا اولویت یک خروجی یا ورودی دستگاه خاص را برای رکوردها یا آهنگ‌های صوتی متصل مشخص کنند.

در اندروید ۷.۰، API شمارش و انتخاب توسط تست‌های CTS تأیید شده و برای شامل شدن مسیریابی برای جریان‌های صوتی بومی C/C++ (OpenSL ES) توسعه داده شده است. مسیریابی جریان‌های بومی همچنان در جاوا انجام می‌شود، با اضافه شدن یک رابط AudioRouting که جایگزین، ترکیب و منسوخ کردن روش‌های مسیریابی صریح مختص کلاس‌های AudioTrack و AudioRecord می‌شود.

برای جزئیات بیشتر در مورد API شمارش و انتخاب، به رابط‌های پیکربندی اندروید و 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 هنگام ارسال به دستگاه صوتی که از صدای چند کاناله پشتیبانی نمی‌کند، محتوا را به طور خودکار به استریو تبدیل می‌کند.

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

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