החל מ-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 של המערכת
נוסף בנאי חדש מסוג @SystemApi למחלקה
android.media.audiofx.AudioEffect
כדי ליצור ולהפעיל אפקט במכשיר:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
אחרי שיוצרים את האפקט על ידי ציון המזהה הייחודי של אפקט האודיו ומתאר מכשיר האודיו, אפשר להפעיל או להשבית אותו באמצעות ממשקי AudioEffect API קיימים.
יש גם API שאפשר להשתמש בו כדי לבדוק אם הטמעה מסוימת תומכת בשילוב מסוים של מכשיר ואפקט.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
ממשקי API חדשים של HAL
Audio effect 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 של האודיו צריך להטמיע את בקרת ניתוב האודיו באמצעות IDevice::createAudioPatch()
API. הדיווח על השיטה הזו מסומן ב-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 של האפקט כשמפעילים או משביתים אפקט.