החל ב-Android 11, ליצרני המכשירים יש את היכולת לצרף ולאפשר אפקטי אודיו ספציפיים באופן אוטומטי כאשר מכשיר שמע נתון נבחר ללכידת או השמעה אודיו. שיפור גדול אחד הוא שאפקטי אודיו המוכנסים לנתיב אודיו המיושמים כולו מתחת ל-HAL האודיו (חיבור ישיר בין התקן קלט להתקן פלט) ניתנים לשליטה על ידי מסגרת אפקטי האודיו.
תכונה זו מיועדת בעיקר ליצרני ציוד מקורי לרכב, אך ניתן להשתמש בה גם בגורמי צורה אחרים של אנדרואיד. אפליקציה לדוגמה היא הוספת אפקט שיפור קול על פלט מקלט FM כאשר הוא מחובר ישירות לרמקול דרך DSP האודיו.
דרישות מוקדמות
- באשר לכל אפקט שמע אחר, האפקט חייב להיות מיושם על ידי ספריית ספקים ולרשום בקובץ התצורה
audio_effects.xml
. - האפקט חייב להיות מסוג preprocessing או postprocessing (
TYPE_PRE_PROC
אוTYPE_POST_PROC
מוגדר ב-EffectDescriptor.flags
). - אם יישום האפקט מואץ ב-HW (הדגל
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);
לאחר יצירת האפקט על ידי ציון מזהה אפקט האודיו הייחודי ומתאר התקן השמע, ניתן להפעיל או להשבית אותו עם ממשקי API קיימים של AudioEffect.
API זמין גם לשאילתה אם מימוש תומך בשילוב מכשיר/אפקט נתון.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
ממשקי API חדשים של HAL
אפקט שמע HAL
לאפקט האודיו HAL V6.0 יש חתימה חדשה עבור שיטת createEffect()
המאפשרת יצירת אפקט המחובר למכשיר:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- ה-
AudioSession
שצוין חייב להיותAudioSessionConsts.DEVICE
. - מתעלמים
AudioIoHandle
אםsession
היאAudioSessionConsts.DEVICE
. -
device
מזוהה על ידיAudioPortHandle
הייחודי שלו שהוקצה על ידי מסגרת האודיו כאשר ההתקן נבחר ב- Audio HAL עםIDevice::createAudioPatch()
.
אודיו 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()
.
ניתן להשתמש ב-Audio HAL APIs על ידי יישום אם יש צורך בתיאום בין ה-HAL של האודיו והאפקט כאשר אפקט מופעל או מושבת.