אפקטי אודיו

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

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

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

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

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

ניתן ליצור אפקטים של אודיו שספציפיים למכשיר באחת משתי השיטות הבאות:

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

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

כדי לעשות זאת, מוסיפים קטע ספציפי בקובץ 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(). הדבר מצוין בדיווח של ה-method‏ IDevice::supportsAudioPatches() true.

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

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

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