تم تقديم HAL للتحكم في الصوت في Android 9 ل إتاحة حالات استخدام الصوت ذات الصلة بالسيارات. اعتبارًا من الإصدار 14 من Android، تتيح واجهة برمجة التطبيقات Audio control HAL ما يلي:
- التلاشي والتوازن
- طلب التركيز على الصوت في HAL
- كتم صوت الجهاز وخفضه
- تغييرات في مستوى صوت جهاز الصوت
- تغييرات في إعدادات منفذ الصوت
يعرض الشكل 1 نظرة عامة على مستوى عالٍ لبنية خدمة الصوت في السيارة، والتي تتواصل فيها خدمة الصوت في السيارة مع HAL الخاص بعناصر التحكّم في الصوت.
الشكل 1: ضبط الصوت في عدة مناطق
تلاشي الصوت وتوازنه
تم طرح الإصدار 1 من HIDL audio control HAL في الإصدار 9 من Android
لإتاحة خفض مستوى الصوت وتوازنه في حالات استخدام
السيارات. بخلاف التأثيرات الصوتية العامة المتوفرة في 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
يعتمد نظام التشغيل AAOS، مثل Android، على المشاركة النشطة للتطبيقات في ميزة "تركيز الصوت" لإدارة تشغيل الصوت في السيارات. تُستخدَم معلومات التركيز لإدارة البثّات التي تريد التحكّم في مستوى صوتها وخفضه. ولهذا السبب، تم تقديم السمات الصوتية التالية في Android 11 لتوسيع نطاق ميزة "التركيز على الصوت" وتوفير تكامل أفضل للأصوات الخاصة بالسيارة في تجربة Android:
EMERGENCY
SAFETY
VEHICLE_STATUS
ANNOUNCEMENT
بالإضافة إلى هذا التغيير، تمت إضافة آلية للأصوات التي تأتي من خارج Android للمشاركة في طلبات التركيز على الصوت. وبالتالي، تم طرح الإصدار 2 من HIDL audio control HAL للسماح بطلبات التركيز التي تأتي من خارج نظام التشغيل 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 إلى HAL للتحكم في الصوت باستخدام AIDL
مع ظهور AIDL والنقل المطلوب في Android 12 (لمزيد من المعلومات، اطّلِع على AIDL لأجل HALs)، تم نقل 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);
}
كتم صوت مجموعة الأصوات
طرح نظام التشغيل Android 12 ميزة كتم صوت مجموعة الصوت للسماح بإمكانية التحكّم بشكل أكثر شمولاً في كتم الصوت أثناء تفاعلات المستخدم مع الصوت. يتيح ذلك لواجهة 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>
قبل Android 13، كان يجب استبدال الإعدادات
بتطبيق ميزة "تداخل الموارد" أثناء التشغيل لملف APKpackages/services/Car/service/res/values/config.xml
(للاطّلاع على مزيد من المعلومات، يُرجى الاطّلاع على مقالة
تخصيص حِزمة التطبيق باستخدام ميزة "تداخل
الموارد"). اعتبارًا من الإصدار
13 من Android، يمكنك استخدام تراكب الموارد أثناء التشغيل لتغيير قيمة
الإعداد. لمزيد من المعلومات، اطّلِع على مقالة تغيير قيمة موارد التطبيق
أثناء التشغيل.
يمكن لتطبيقات النظام تحديد ما إذا كانت الميزة مفعّلة باستخدام واجهة برمجة التطبيقات
CarAudioManager#isAudioFeatureEnabled
. يجب أن تكون المَعلمة التي تم تمريرها هي الثابت
CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
. تعرِض الطريقةtrue
إذا كانت الميزة مفعّلة على الجهاز، وfalse
في حال أخرى.
بالإضافة إلى تفعيل ميزة audioUseCarVolumeGroupMuting
، يجب أن ينفذ AIDL
HAL لعناصر التحكّم بالصوت آلية كتم صوت مجموعة الصوت:
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;
}
يتضمّن AAOS آليتين مختلفتَين لإيقاف الصوت، استنادًا إلى:
الأحداث الرئيسية التي تستخدم الصوت KEYCODE_VOLUME_MUTE
المكالمات المباشرة إلى خدمة الصوت في السيارة باستخدام واجهة برمجة التطبيقات الخاصة بإيقاف الصوت في مدير الصوت في السيارة،
CarAudioManager#setVolumeGroupMute
عند تفعيل كلتا الآليتين، يؤدي ذلك إلى كتم صوت المكالمة في HAL الخاص بعناصر التحكّم في الصوت.
خفض مستوى صوت الوسائط أثناء تشغيل صوت السيارة
طرح نظام التشغيل Android 12 ميزة كتم صوت الوسائط في السيارة لتحسين التحكّم في تشغيل الوسائط المتزامنة. يتيح ذلك لمصنّعي السيارات الأصليين تنفيذ سلوكهم الخاص بالخفض التدريجي استنادًا إلى إعدادات الصوت المادية للسيارة وحالة التشغيل الحالية، وفقًا لما تحدّده خدمة الصوت في السيارة.
تستند آلية خفض مستوى الصوت إلى التغييرات في تسلسل مصادر الصوت التي يتم التركيز عليها. عند حدوث
تغيير في التركيز (سواء كان طلب تركيز أو إيقاف التركيز)، يتم إبلاغ 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 LOGIسمًا ينطبق على إشارة التحكّم في الصوت الواردة من خدمة الصوت في السيارة:
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;
}
بالإضافة إلى معلومات ضبط الصوت في السيارة المضمّنة في عناوين الجهاز لإخفاء الصوت أو إظهاره، تحتوي معلومات إخفاء الصوت أيضًا على معلومات عن استخدامات سمة الصوت التي تركّز عليها. الغرض من هذه البيانات هو إعلام نظام الصوت بعمليات استخدام سمات الصوت النشطة.
هذا الإجراء مطلوب لأنّه في إعدادات الصوت في السيارة، يمكن تخصيص سمات صوت متعددة لجهاز واحد، وبدون المعلومات الإضافية، لا يكون من الواضح الاستخدامات النشطة.
واجهة برمجة التطبيقات لعناصر التحكّم في الصوت (HAL) 2.0 في لغة تعريف واجهة نظام Android
لتحديث واجهات برمجة التطبيقات وتسهيل استخدام الوظائف الجديدة، تم تحديث HAL لوحة التحكّم في الصوت باستخدام 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);
}
تفعيل طريقة تغيير التركيز على الصوت
تعمل عمليات التركيز المذكورة أعلاه بالطريقة نفسها الموضّحة في طلب ملف صوتي التركيز من HAL. تحتوي البيانات الوصفية لمقطع التشغيل فقط على المزيد من المعلومات إلى جانب استخدامات سمات الصوت. بشكل عام، يمكن أن يستمر استخدام الطرق السابقة في حزمة HAL المعدَّلة الخاصة بواجهة برمجة التطبيقات لنظام التحكّم في Android ، ما لم تكن هناك حاجة إلى المعلومات المضافة التي تقدّمها البيانات الوصفية للمقطع الصوتي الذي يتم تشغيله.
إذا قرّر مطوّرو HAL عدم إتاحة
IAudioControl#onAudioFocusChangeWithMetaData
، من المفترض أن تعرض الطريقة نتائج
مع الخطأ UNKNOWN_TRANSACTION
كما هو موضّح في استخدام methods
للواجهة التي تتضمّن إصدارات.
تستدعي خدمة الصوت أولاً onAudioFocusChangeWithMetaData
ثم تتم إعادة المحاولة باستخدام الطريقة onAudioFocusChange
في حال حدوث خطأ UNKNOWN_TRANSACTION
.
كتم صوت السيارة باستخدام البيانات الوصفية للمقطع الصوتي الذي يتم تشغيله
أضاف الإصدار 2.0 من HAL الخاص بميزة التحكّم في الصوت في AIDL البيانات الوصفية للمقطع الصوتي الذي يتم تشغيله إلى معلومات كتم الصوت:
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 أكثر وضوحًا لنظام التشغيل 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 حالات استدعاء واجهة برمجة التطبيقات، وذلك في المقام الأول للإبلاغ عن التغييرات في حالة فهرس gain. وفقًا لمتطلبات التنظيم، يجب أن يتّخذ نظام الصوت في السيارة الإجراء المطلوب ويستخدم طلب إعادة الاتصال للإبلاغ عن المعلومات إلى خدمة الصوت في السيارة للسماح للمستخدم بالاستهلاك. على سبيل المثال، لعرض واجهة مستخدم للمستخدم.
واجهة برمجة التطبيقات لنظام التحكّم في الصوت (HAL) 3.0 من لغة تعريف واجهة نظام Android
تم تعديل إصدار HAL الخاص بعنصر التحكّم في الصوت في AIDL لنظام التشغيل Android 14
إلى الإصدار 3.0 لتعديل واجهات برمجة التطبيقات من أجل توفير وظيفة فهرس اكتساب إشارة الصوت
بشكل أكثر فعالية. تسمح واجهة برمجة التطبيقات HAL Audio Control لخدمة الصوت بتحديد 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
، يجب أن يؤدي التنفيذ إلى محو الرمز المرجعي الحالي للاتصال أو عدم اتّخاذ أي إجراء في حال عدم توفّر رمز مرجعي. من الممارسات الجيدة عند تنفيذ التحكّم في الصوت تسجيل مراقب للموت للإجراء المُعاد الاتصال به، ثم محو الإجراء المُعاد الاتصال به في حال بدء عملية إنهاء عملية الربط.
يتم تعريف 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
. يمكن استخدام واجهة برمجة التطبيقات
لبدء زيادة مستوى الصوت في نظام الصوت فور تسجيل دالٍّة callback. بالنسبة إلى التغييرات الأخرى في الكسب الديناميكي، يمكن استدعاء واجهة برمجة التطبيقات في أي وقت. يتم تطبيق التغييرات المقابلة وتعديل خدمة الصوت في السيارة
وفقًا لذلك.