אפקטי אודיו

החל מ-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 של המערכת

נוספה ל-class‏ android.media.audiofx.AudioEffect קונסטרוקטור חדש של @SystemApi כדי ליצור אפקט של מכשיר ולהפעיל אותו:

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

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

ממשק API זמין גם לשליחת שאילתות אם הטמעה תומכת בשילוב נתון של מכשיר ואפקט.

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

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

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

לאפקט האודיו HAL V6.0 יש חתימה חדשה ל-method 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 של האודיו חייבת להטמיע ניתוב אודיו שליטה באמצעות ה-API של IDevice::createAudioPatch(). הערך הזה מצוין באמצעות שיטה IDevice::supportsAudioPatches() לדיווח true.

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

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

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