החל מ-Android 11, יצרני המכשירים יכולים לצרף ולהפעיל אפקטי אודיו מסוימים באופן אוטומטי כשהתקן אודיו מסוים נבחר להקלטת אודיו או להפעלה. שיפור חשוב אחד הוא ההוספה של אפקטים קוליים בנתיב אודיו שמוטמע במלואו מתחת ל-HAL של אודיו (חיבור ישיר בין קלט מכשיר ומכשיר פלט) יכולים לשלוט באמצעות המסגרת של אפקטים קוליים.
התכונה הזו מיועדת בעיקר ליצרני ציוד מקורי לכלי רכב, אבל אפשר להשתמש בה גם במכשירים אחרים עם Android. גורמי צורה. אפליקציה לדוגמה מכניסה אפקט לשיפור הקול לטיונר ה-FM כאשר הוא מחובר ישירות לרמקול דרך ה-DSP של האודיו.
דרישות מוקדמות
- כמו בכל אפקט אודיו אחר, יש להטמיע את האפקט באמצעות ספריית ספקים
בקובץ התצורה
audio_effects.xml
. - האפקט חייב להיות מסוג עיבוד מראש או לאחר עיבוד
(סימון
TYPE_PRE_PROC
אוTYPE_POST_PROC
מוגדר ב-EffectDescriptor.flags
). - אם יישום האפקט מואץ באמצעות HW
(סימון
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 של המערכת
בנאי חדש של @SystemApi נוסף אל
מחלקה android.media.audiofx.AudioEffect
כדי ליצור ולהפעיל אפקט למכשיר:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
אחרי יצירת האפקט, מציינים את המזהה הייחודי של אפקט האודיו ואת מתאר התקן האודיו. אפשר להפעיל או להשבית אותו באמצעות ממשקי API קיימים של AudioEffective API.
ממשק API זמין גם לשליחת שאילתות אם הטמעה תומכת בשילוב נתון של מכשיר ואפקט.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
ממשקי API חדשים עם HAL
אפקט אודיו 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()
.
אודיו 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 כאשר אפקט מופעל או מושבת.