אפקטי אודיו

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

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

דרישות מוקדמות

  • כמו כל אפקט אודיו אחר, האפקט צריך להיות מוטמע על ידי ספריית ספק ומופיע בקובץ התצורה audio_effects.xml.
  • האפקט צריך להיות מסוג עיבוד מקדים או עיבוד פוסט (הדגל TYPE_PRE_PROC או TYPE_POST_PROC מוגדר ב-EffectDescriptor.flags).
  • אם הטמעת האפקט מואצת על ידי חומרה (הדגל HW_ACC_TUNNEL מוגדר ב-EffectDescriptor.flags), אפשר לצרף אותה לנתיב אודיו שמחובר כולו מתחת ל-HAL (לא נפתח שידור אודיו להפעלה או ללכידה ב-HAL של האודיו).

יצירה והפעלה של אפקט במכשיר

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

שימוש בקובץ הגדרות של אפקטים קוליים

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

כדי לעשות את זה, מוסיפים קטע ספציפי בקובץ audio_effects.xml באופן הבא:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

שימוש ב-API של המערכת

נוסף בנאי חדש מסוג @SystemApi למחלקה android.media.audiofx.AudioEffect כדי ליצור ולהפעיל אפקט במכשיר:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

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

יש גם API שאפשר להשתמש בו כדי לבדוק אם הטמעה תומכת בשילוב מסוים של מכשיר/אפקט.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

ממשקי API חדשים של HAL

HAL של אפקטים קוליים

ל-HAL V6.0 של אפקט האודיו יש חתימה חדשה לשיטת createEffect(), שמאפשרת ליצור אפקט שמצורף למכשיר:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • הערך שצוין במאפיין AudioSession חייב להיות AudioSessionConsts.DEVICE.
  • המערכת מתעלמת מההגדרה AudioIoHandle אם ההגדרה session היא AudioSessionConsts.DEVICE.
  • ה-device מזוהה על ידי ה-AudioPortHandle הייחודי שלו שהוקצה על ידי מסגרת האודיו כשהמכשיר נבחר ב-HAL של האודיו באמצעות השיטה IDevice::createAudioPatch().

Audio HAL

כדי לתמוך בתכונת אפקט המכשיר, ה-HAL של האודיו צריך להטמיע את בקרת ניתוב האודיו באמצעות IDevice::createAudioPatch() API. השיטה הזו מסומנת בIDevice::supportsAudioPatches()דיווח על שיטת true.

שתי שיטות API חדשות, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) ו- IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) מעבירות להטמעת HAL מידע על כך שאפקט במכשיר הופעל או הושבת במכשיר מסוים.

המכשיר מזוהה באמצעות המזהה AudioPortHandle שלו, שמשמש ליצירת תיקון אודיו באמצעות השיטה IDevice::createAudioPatch().

אפשר להשתמש בממשקי ה-API של Audio HAL בהטמעה אם נדרש תיאום בין ה-HAL של האודיו וה-HAL של האפקט כשמפעילים או משביתים אפקט.