تم طرح طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت في نظام التشغيل Android 9 لدعم حالات استخدام الصوت ذات الصلة بالسيارات. اعتبارًا من الإصدار 14 من نظام التشغيل Android، يتيح HAL للتحكّم في الصوت ما يلي:
- التلاشي والتوازن
- طلب التركيز على الصوت في طبقة تجريد الأجهزة (HAL)
- كتم صوت الجهاز وخفض مستوى الصوت
- تغييرات مستوى الصوت في الجهاز الصوتي
- تغييرات في إعدادات منفذ الصوت
يوضّح الشكل 1 نظرة عامة عالية المستوى على بنية خدمة الصوت في السيارة، حيث تتواصل خدمة الصوت في السيارة مع طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت.
الشكل 1. ضبط الصوت في مناطق متعدّدة
تلاشي الصوت وتوازنه
تم طرح الإصدار 1 من طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت باستخدام HIDL في Android 9 لتوفير ميزة خفض مستوى الصوت تدريجيًا وموازنة الصوت في حالات استخدام السيارات. وبصرف النظر عن المؤثرات الصوتية العامة المتوفّرة في Android، تتيح هذه الآلية لتطبيقات النظام ضبط توازن الصوت والتلاشي من خلال واجهات برمجة التطبيقات CarAudioManager
التالية:
class CarAudioManager {
/**
* Adjust the relative volume in the front vs back of the vehicle cabin.
*
* @param value in the range -1.0 to 1.0 for fully toward the back through
* fully toward the front. 0.0 means evenly balanced.
*/
@SystemApi
@RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setFadeTowardFront(float value);
/**
* Adjust the relative volume on the left vs right side of the vehicle cabin.
*
* @param value in the range -1.0 to 1.0 for fully toward the left through
* fully toward the right. 0.0 means evenly balanced.
*/
@SystemApi
@RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setBalanceTowardRight(float value);
}
بعد استدعاء واجهات برمجة التطبيقات هذه، يتم استدعاء واجهات برمجة تطبيقات HAL الخاصة بالتحكّم في الصوت من خدمة صوت السيارة:
interface IAudioControl {
/**
* Control the right/left balance setting of the car speakers.
*/
oneway setBalanceTowardRight(float value);
/**
* Control the fore/aft fade setting of the car speakers.
*/
oneway setFadeTowardFront(float value);
}
تتوفّر واجهة برمجة التطبيقات في جميع إصدارات طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت، بما في ذلك واجهة AIDL HAL الجديدة.
طلب التركيز على الصوت من HAL
يعتمد نظام التشغيل Android Automotive، مثل Android، على المشاركة النشطة للتطبيقات في التركيز على الصوت لإدارة تشغيل الصوت في السيارات. تُستخدَم معلومات التركيز لإدارة عمليات التحكّم في مستوى الصوت وتخفيضه في أي من عمليات البث. وبالتالي، ولتوسيع نطاق ميزة "التركيز على الصوت" وتوفير تكامل أفضل للأصوات الخاصة بالسيارة في تجربة Android، تم تقديم سمات الصوت التالية في Android 11:
EMERGENCY
SAFETY
VEHICLE_STATUS
ANNOUNCEMENT
بالإضافة إلى هذا التغيير، تمت إضافة آلية تتيح للأصوات التي تنشأ خارج نظام Android المشاركة في طلبات الحصول على تركيز الصوت. وبالتالي، تم طرح الإصدار 2 من طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت عبر HIDL للسماح بطلبات التركيز التي تنشأ من خارج Android:
interface IAudioControl {
/**
* Registers focus listener to be used by HAL for requesting and
* abandoning audio focus.
* @param listener the listener interface
* @return closeHandle A handle to unregister observer.
*/
registerFocusListener(IFocusListener listener)
generates (ICloseHandle closeHandle);
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* @param usage The audio usage associated with the focus change
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred
*/
oneway onAudioFocusChange(bitfield<AudioUsage> usage, int32_t zoneId,
bitfield<AudioFocusChange> focusChange);
}
حيث يتم تعريف IFocusListener
على النحو التالي:
interface IFocusListener {
/**
* Called whenever HAL is requesting focus as it is starting to play
* audio of a given usage in a specified zone.
*
* @param usage The audio usage associated with the focus request
* {@code AttributeUsage}
* @param zoneId The identifier for the audio zone where the HAL is
* requesting focus
* @param focusGain The AudioFocusChange associated with this request.
*/
oneway requestAudioFocus(bitfield<AudioUsage> usage,
int32_t zoneId, bitfield<AudioFocusChange> focusGain);
/**
* Called whenever HAL is abandoning focus as it is finished playing audio
* of a given usage in a specific zone.
*
* @param usage The audio usage for which the HAL is abandoning focus
* {@code AttributeUsage}
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway abandonAudioFocus(bitfield<AudioUsage> usage, int32_t zoneId);
}
يمكن استخدام واجهات برمجة التطبيقات أعلاه لطلب التركيز الصوتي وإلغائه من طبقة تجريد الأجهزة (HAL)، على التوالي. واستجابةً لذلك، تأخذ خدمة الصوت في السيارة طلب التركيز على الصوت في الاعتبار وتعيد توجيه النتائج بشكل غير متزامن إلى الطريقة IAudioControl#onAudioFocusChange
.
يمكن استخدام واجهة برمجة التطبيقات هذه أيضًا لتتبُّع التغييرات في طلب التركيز على الصوت الصادر من طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت. بشكل عام، يُعدّ أي طلب دائم للحصول على تركيز الصوت من طبقة HAL نشطًا، وهو ما يختلف عن طلب الحصول على تركيز الصوت من Android، حيث لا يُعدّ نشطًا إلا تشغيل مقطع صوتي نشط مطابق.
نقل HIDL إلى AIDL HAL للتحكّم في الصوت
مع ظهور AIDL وعملية النقل المطلوبة في Android 12 (لمزيد من المعلومات، راجِع AIDL لواجهات HAL)، تم نقل واجهة HAL الخاصة بالتحكّم في الصوت إلى AIDL. بالنسبة إلى واجهات برمجة التطبيقات الحالية لإصدار 2 من HIDL للتحكّم في الصوت، يتطلّب نقل البيانات إجراء تعديلات بسيطة على الطرق الحالية:
interface IAudioControl {
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* @param usage The audio usage associated with the focus change
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred.
*/
oneway void onAudioFocusChange(in String usage, in int zoneId,
in AudioFocusChange focusChange);
/**
* Registers focus listener to be used by HAL for requesting and
* abandoning audio focus.
* @param listener the listener interface.
*/
oneway void registerFocusListener(in IFocusListener listener);
/**
* Control the right/left balance setting of the car speakers.
*/
oneway void setBalanceTowardRight(in float value);
/**
* Control the fore/aft fade setting of the car speakers.
*/
oneway void setFadeTowardFront(in float value);
}
وIFocusListener
المقابل:
interface IFocusListener {
/**
* Called whenever HAL is abandoning focus as it is finished playing audio
* of a given usage in a specific zone.
*
* @param usage The audio usage for which the HAL is abandoning focus
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway void abandonAudioFocus(in String usage, in int zoneId);
/**
* Called whenever HAL is requesting focus as it is starting to play audio
* of a given usage in a specified zone.
*
* @param usage The audio usage associated with the focus request
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone where the HAL is
* requesting focus
* @param focusGain The AudioFocusChange associated with this request.
*/
oneway void requestAudioFocus(in String usage, in int zoneId,
in AudioFocusChange focusGain);
}
كتم صوت مجموعة الأجهزة
قدّمت الإصدار 12 من نظام التشغيل Android ميزة كتم صوت مجموعة وحدات التخزين للسماح بالتحكّم بشكل أكثر شمولاً في كتم الصوت أثناء تفاعلات المستخدم مع الصوت. يتيح ذلك لواجهة HAL الخاصة بالتحكّم في الصوت تلقّي أحداث كتم الصوت التي تعترضها خدمة الصوت في السيارة.
لتفعيل الميزة، على المصنّعين الأصليين للأجهزة ضبط إعدادات audioUseCarVolumeGroupMuting
على true
في خدمة السيارة config.xml
:
<!-- Configuration to enable muting of individual volume groups.
If this is set to false, muting of individual volume groups is disabled,
instead muting will toggle master mute. If this is set to true, car volume
group muting is enabled and each individual volume group can be muted separately. -->
<bool name="audioUseCarVolumeGroupMuting">true</bool>
قبل الإصدار 13 من نظام التشغيل Android، كان يجب استبدال الإعدادات بتراكب موارد في وقت التشغيل من أجل packages/services/Car/service/res/values/config.xml
(لمزيد من المعلومات، راجِع تخصيص الإصدار باستخدام تراكبات الموارد). بدءًا من Android 13، يمكنك استخدام تراكبات الموارد في وقت التشغيل لتغيير قيمة الإعداد. لمزيد من المعلومات، اطّلِع على تغيير قيمة موارد التطبيق
في وقت التشغيل.
يمكن لتطبيقات النظام تحديد ما إذا كانت الميزة مفعَّلة باستخدام واجهة برمجة التطبيقات CarAudioManager#isAudioFeatureEnabled
. يجب أن تكون المَعلمة التي تم تمريرها هي الثابت
CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
. يعرض الإجراء true
إذا كانت الميزة مفعّلة على الجهاز، وإلا يعرض false
.
بالإضافة إلى تفعيل ميزة audioUseCarVolumeGroupMuting
، يجب أن تنفّذ طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت عبر AIDL آلية كتم صوت مجموعة الصوت:
interface IAudioControl {
/**
* Notifies HAL of changes in output devices that the HAL should apply
* muting to.
*
* This will be called in response to changes in audio mute state for each
* volume group and will include a {@link MutingInfo} object per audio
* zone that experienced a mute state event.
*
* @param mutingInfos an array of {@link MutingInfo} objects for the audio
* zones where audio mute state has changed.
*/
oneway void onDevicesToMuteChange(in MutingInfo[] mutingInfos);
}
حيث تحتوي معلومات الكتم على معلومات الكتم ذات الصلة بنظام الصوت:
parcelable MutingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be muted.
*/
String[] deviceAddressesToMute;
/**
* List of addresses for audio output devices that were previously be
* muted and should now be unmuted.
*/
String[] deviceAddressesToUnmute;
}
يتضمّن نظام التشغيل Android Automotive آليتَين مختلفتَين لكتم الصوت، استنادًا إلى ما يلي:
الأحداث الرئيسية التي تستخدم الصوت KEYCODE_VOLUME_MUTE
طلبات مباشرة إلى خدمة الصوت في السيارة باستخدام واجهة برمجة التطبيقات الخاصة بكتم الصوت في مدير الصوت في السيارة،
CarAudioManager#setVolumeGroupMute
.
عند التفعيل، يؤدي كلا الآليتَين إلى كتم صوت المكالمة في طبقة تجريد الأجهزة (HAL) الخاصة بأداة التحكّم في الصوت.
تجنُّب التداخل مع أصوات أخرى في السيارة
قدّمت الإصدار 12 من نظام التشغيل Android ميزة خفض مستوى صوت السيارة لتحسين التحكّم في التشغيل المتزامن لتدفقات الصوت. يتيح ذلك لمصنّعي المعدات الأصلية تنفيذ سلوك التخفيض الخاص بهم استنادًا إلى إعدادات الصوت المادية للسيارة وحالة التشغيل الحالية، وفقًا لما تحدّده خدمة صوت السيارة.
تستند آلية "تجنُّب التداخل مع أصوات أخرى" إلى التغييرات في حزمة تركيز الصوت. عند حدوث أي تغيير في التركيز (سواء كان طلب تركيز أو إلغاء تركيز)، يتم إبلاغ طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت. على غرار ميزة إيقاف مجموعة أصوات السيارة، يمكن تفعيل ميزة خفض مستوى صوت السيارة باستخدام علامة الإعداد audioUseHalDuckingSignals
:
<!-- Configuration to enable IAudioControl#onDevicesToDuckChange API to
inform HAL when to duck. If this is set to true, the API will receive signals
indicating which output devices to duck as well as what usages are currently
holding focus. If set to false, the API will not be called. -->
<bool name="audioUseHalDuckingSignals">true</bool>
لتفعيل الميزة، يجب أن تنفّذ طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت AIDL المنطق ذي الصلة باستخدام الإشارة التي يتم تلقّيها من خدمة الصوت في السيارة:
interface IAudioControl {
/**
* Notifies HAL of changes in output devices that the HAL should apply
* ducking to.
*
* This will be called in response to changes in audio focus, and will
* include a {@link DuckingInfo} object per audio zone that experienced
* a change in audo focus.
*
* @param duckingInfos an array of {@link DuckingInfo} objects for the
* audio zones where audio focus has changed.
*/
oneway void onDevicesToDuckChange(in DuckingInfo[] duckingInfos);
}
تتضمّن معلومات نظام الصوت ذات الصلة معلومات خفض مستوى الصوت:
parcelable DuckingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be ducked.
*/
String[] deviceAddressesToDuck;
/**
* List of addresses for audio output devices that were previously be
* ducked and should now be unducked.
*/
String[] deviceAddressesToUnduck;
/**
* List of usages currently holding focus for this audio zone.
*/
String[] usagesHoldingFocus;
}
بالإضافة إلى معلومات إعداد الصوت في السيارة الواردة في عناوين الأجهزة التي يجب خفض مستوى صوتها أو رفعه، تحتوي معلومات خفض مستوى الصوت أيضًا على معلومات حول استخدامات سمات الصوت التي تحافظ على التركيز. والغرض من هذه البيانات هو إعلام نظام الصوت بسمات الصوت النشطة.
هذا الإجراء مطلوب لأنّه في إعدادات الصوت في السيارة، يمكن تعيين سمات صوتية متعددة لجهاز واحد، وبدون المعلومات الإضافية، لا يكون من الواضح الاستخدامات النشطة.
AIDL audio control HAL 2.0
لتحديث واجهات برمجة التطبيقات وتسهيل الوظائف الجديدة، تم تعديل طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت باستخدام لغة تعريف واجهة Android (AIDL) إلى الإصدار 2.0 في Android 13:
- التركيز على الصوت مع "
PlaybackTrackMetadata
" - دالة معاودة الاتصال الخاصة بمكاسب الصوت
يتم تحديد البيانات الوصفية للتشغيل في android.hardware.audio.common
على النحو التالي:
parcelable PlaybackTrackMetadata {
AudioUsage usage = INVALID;
AudioContentType contentType = UNKNOWN;
float gain;
AudioChannelLayout channelMask;
AudioDevice sourceDevice;
String[] tags;
}
وظلت جميع الوظائف الأخرى من الإصدار 1.0 من أداة التحكم في الصوت AIDL متاحة ويمكن استخدامها. هناك استثناء يتعلق بطريقة تغيير تركيز الصوت، كما هو موضّح في طريقة تغيير تركيز الصوت.
التركيز على عناصر التحكّم في الصوت مع البيانات الوصفية لمقطع التشغيل
لعرض المزيد من المعلومات لنظام الصوت أسفل طبقة تجريد الأجهزة (HAL)، تعرض التحديثات الآن
PlaybackTrackMetadata
. على وجه التحديد، تم توسيع نطاق HAL الخاص بالتحكّم في الصوت باستخدام طريقة جديدة:
interface IAudioControl {
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* The HAL is not required to wait for a callback of AUDIOFOCUS_GAIN
* before playing audio, nor is it required to stop playing audio in the
* event of a AUDIOFOCUS_LOSS callback is received.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred.
*/
oneway void onAudioFocusChangeWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId,
in AudioFocusChange focusChange);
}
يتم إجراء تغيير مماثل ومطابق على IFocusListener
:
/**
* Called to indicate that the audio output stream associated with
* {@link android.hardware.audio.common.PlaybackTrackMetadata} is
* abandoning focus as playback has stopped.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway void abandonAudioFocusWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId);
/**
* Called to indicate that the audio output stream associated with
* {@link android.hardware.audio.common.PlaybackTrackMetadata} has taken
* the focus as playback is starting for the corresponding stream.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
* @param focusGain The focus type requested.
*/
oneway void requestAudioFocusWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId,
in AudioFocusChange focusGain);
}
On audio focus change method
تعمل عمليات التركيز المذكورة أعلاه بالطريقة نفسها الموضّحة في طلب التركيز على الصوت من طبقة تجريد الأجهزة (HAL). تحتوي البيانات الوصفية لمسار التشغيل فقط على مزيد من المعلومات بالإضافة إلى استخدامات سمات الصوت. بشكل عام، ما لم تكن المعلومات الإضافية التي توفّرها البيانات الوصفية لمسار التشغيل مطلوبة، يمكن أن يستمر استخدام طرق HAL السابقة في عنصر تحكّم Android المعدَّل.
إذا قرّر مطوّرو طبقة تجريد الأجهزة عدم توفير IAudioControl#onAudioFocusChangeWithMetaData
، يجب أن تعرض الطريقة نتائج تتضمّن الخطأ UNKNOWN_TRANSACTION
كما هو موضّح في استخدام طرق واجهة الإصدار.
تتصل خدمة الصوت أولاً بـ onAudioFocusChangeWithMetaData
ثم تعيد المحاولة باستخدام طريقة onAudioFocusChange
في حال حدوث خطأ UNKNOWN_TRANSACTION
.
خفض مستوى صوت السيارة باستخدام البيانات الوصفية لمقطع التشغيل
أضاف الإصدار 2.0 من AIDL audio control HAL البيانات الوصفية لمسار التشغيل إلى معلومات خفض مستوى الصوت:
parcelable DuckingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be ducked.
*/
String[] deviceAddressesToDuck;
/**
* List of addresses for audio output devices that were previously be
* ducked and should now be unducked.
*/
String[] deviceAddressesToUnduck;
/**
* List of usages currently holding focus for this audio zone.
*/
String[] usagesHoldingFocus;
/**
* List of output stream metadata associated with the current focus
* holder for this audio zone
*/
@nullable PlaybackTrackMetadata[] playbackMetaDataHoldingFocus;
}
تم إيقاف usagesHoldingFocus
نهائيًا. على المطوّرين الآن استخدام
playbackMetaDataHoldingFocus
لتحديد استخدام سمة الصوت ومعلومات الصوت الأخرى. ومع ذلك، ستظل المَعلمة usagesHoldingFocus
تتضمّن المعلومات المطلوبة إلى أن تتم إزالة هذا الخيار رسميًا.
دالة معاودة الاتصال الخاصة بمستوى الصوت
لإتاحة إمكانية رؤية التغييرات في الصوت التي تقع أسفل طبقة تجريد الأجهزة (HAL) بشكل أوضح لنظام التشغيل Android Automotive (AAOS) في الإصدار 13 من نظام التشغيل Android، أضفنا آلية يمكنك استخدامها لإرسال التغييرات في مستوى الصوت من نظام الصوت في السيارة إلى خدمة الصوت في السيارة. تعرض الآلية تغييرات في مؤشر مستوى صوت كسب الصوت مع توضيح السبب وراء تغيير الكسب، وذلك على النحو التالي:
- القيود المفروضة على الحسابات المحظورة أو التي تم كتم صوتها
- القيود المفروضة على استخدام الميزات
- قيود التوهين
تُظهر هذه التغييرات القيود من أسفل طبقة تجريد الأجهزة (HAL) إلى خدمة صوت السيارة، وأخيرًا إلى تطبيق واجهة مستخدم النظام لإبلاغ المستخدم. تم توسيع نطاق الجزء الأخير، أي إمكانية الوصول إلى واجهة مستخدم النظام، في Android 14 للسماح لتطبيقات واجهة مستخدم النظام بالحصول على هذه المعلومات بسهولة أكبر من خلال آلية ردّ الاتصال الخاصة بمعلومات مجموعة الصوت.
تسجّل واجهة برمجة التطبيقات HAL للتحكّم في الصوت وظيفة معاودة الاتصال الخاصة بمستوى الصوت على النحو التالي:
interface IAudioControl {
/**
* Registers callback to be used by HAL for reporting unexpected gain(s)
* changed and the reason(s) why.
*
* @param callback The {@link IAudioGainCallback}.
*/
oneway void registerGainCallback(in IAudioGainCallback callback);
}
يتم تعريف IAudioGainCallback
على النحو التالي:
interface IAudioGainCallback {
/**
* Used to indicate that one or more audio device port gains have changed,
* i.e. initiated by HAL, not by CarAudioService.
* This is the counter part of the
* {@link onDevicesToDuckChange}, {@link onDevicesToMuteChange} and,
* {@link setAudioDeviceGainsChanged} APIs.
*
* @param reasons List of reasons that triggered the given gains changed.
* @param gains List of gains affected by the change.
*/
void onAudioDeviceGainsChanged(in Reasons[] reasons,
in AudioGainConfigInfo[] gains);
}
كما هو موضّح في مستندات واجهة برمجة التطبيقات، يتم تسجيل دالة معاودة الاتصال الخاصة بمستوى الصوت من خلال خدمة صوت السيارة في طبقة تجريد الأجهزة (HAL) الخاصة بالتحكّم في الصوت. عندما يتم استدعاء واجهة برمجة التطبيقات من طبقة تجريد الأجهزة (HAL) الخاصة بعناصر التحكّم في الصوت، تستجيب خدمة صوت السيارة بإجراء مطابق (مثل الحظر أو الحدّ أو تخفيف مستوى الصوت) .
يحدّد HAL وقت استدعاء واجهة برمجة التطبيقات، وذلك بشكل أساسي للإبلاغ عن التغييرات في حالة مؤشر الكسب. في ما يتعلّق بمتطلبات اللوائح التنظيمية، يجب أن يتّخذ نظام الصوت في السيارة الإجراء المطلوب وأن يستخدم وظيفة معاودة الاتصال لإرسال المعلومات إلى خدمة الصوت في السيارة كي يتمكّن المستخدم من الاستماع إليها. على سبيل المثال، لعرض واجهة مستخدم للمستخدم.
AIDL audio control HAL 3.0
تم تعديل الإصدار 3.0 من HAL الخاص بعناصر التحكّم في الصوت AIDL في Android 14 لتعديل واجهات برمجة التطبيقات بهدف توفير وظائف أكثر فعالية لمؤشر مستوى الصوت. تتيح واجهة برمجة التطبيقات HAL للتحكّم في الصوت لخدمة الصوت ضبط IModuleChangeCallback
وإلغاء ضبطه:
interface IAudioControl {
/**
* Sets callback with HAL for notifying changes to hardware module
* (that is: {@link android.hardware.audio.core.IModule}) configurations.
*
* @param callback The {@link IModuleChangeCallback} interface to use
* use when new updates are available for
*/
void setModuleChangeCallback(in IModuleChangeCallback callback);
/**
* Clears module change callback
*/
void clearModuleChangeCallback();
}
يتم تسجيل setModuleChangeCallback
من خلال خدمة الصوت في السيارة عند بدء الخدمة أو عند استرداد البيانات بعد حدوث خطأ. على سبيل المثال، إشعار بإنهاء عملية ربط HAL الخاصة بعناصر التحكّم في الصوت تلقّته خدمة صوت السيارة. يجب أن يحلّ تنفيذ HAL الخاص بعناصر التحكّم في الصوت محل أي معاودة اتصال حالية لتغيير الوحدة النمطية عند استدعاء واجهة برمجة التطبيقات.
بالنسبة إلى واجهة برمجة التطبيقات clearModuleChangeCallback
، يجب أن يمحو التنفيذ وظيفة رد الاتصال الحالية أو ألّا يتّخذ أي إجراء إذا لم تكن هناك وظيفة رد اتصال. من الممارسات الجيدة عند تنفيذ عناصر التحكّم في الصوت تسجيل مراقب إيقاف مؤقت للدالة عند استدعائها، ثم إزالة الدالة عند استدعائها إذا تم تشغيل on binder death.
يتم تعريف IModuleChangeCallback
على النحو التالي:
oneway interface IModuleChangeCallback {
/**
* Used to indicate that one or more {@link AudioPort} configs have
* changed. Implementations MUST return at least one AudioPort.
*
* @param audioPorts list of {@link AudioPort} that are updated
*/
void onAudioPortsChanged(in AudioPort[] audioPorts);
}
عندما تسجّل خدمة صوت السيارة وظيفة ردّ الاتصال الخاصة بتغيير الوحدة، تصبح جاهزة لتلقّي تغييرات منفذ الصوت من خلال واجهة برمجة التطبيقات onAudioPortChanged
. يمكن استخدام واجهة برمجة التطبيقات لضبط مستويات الصوت في نظام الصوت فور تسجيل وظيفة معاودة الاتصال. بالنسبة إلى التغييرات الأخرى في مستوى الصوت الديناميكي، يمكن استدعاء واجهة برمجة التطبيقات في أي وقت. يتم تطبيق التغييرات المناسبة وتعديل خدمة الصوت في السيارة وفقًا لذلك.