החל מ-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 כאשר אפקט מופעל או מושבת.