אפקטי אודיו

החל מ-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 יש חתימה חדשה לשיטה 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, שמשמש ליצירת תיקון אודיו בשיטה IDevice::createAudioPatch().

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