החל מ-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.