طبقة تجريد الأجهزة للتحكم في الصوت

تم طرح واجهة برمجة التطبيقات HAL للتحكّم في الصوت في Android 9 لدعم حالات استخدام الصوت ذات الصلة بالسيارات. اعتبارًا من Android 14، تتيح واجهة برمجة التطبيقات HAL للتحكّم في الصوت ما يلي:

  • التلاشي والتوازن
  • طلب أولويّة الصوت من طبقة تجريد الأجهزة (HAL)
  • كتم صوت الجهاز وتجنُّب التداخل مع أصوات أخرى
  • تغييرات مستوى صوت الجهاز الصوتي
  • تغييرات إعدادات منفذ الصوت

يعرض الشكل 1 نظرة عامة عالية المستوى على بنية خدمة الصوت في السيارة، حيث تتواصل خدمة الصوت في السيارة مع واجهة برمجة التطبيقات HAL للتحكّم في الصوت.

ضبط الصوت في مناطق متعدّدة

الشكل 1: ضبط الصوت في مناطق متعدّدة

التلاشي والتوازن في الصوت

تم طرح الإصدار 1 من واجهة برمجة التطبيقات 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)

يعتمد نظام التشغيل AAOS، على غرار Android، على المشاركة النشطة للتطبيقات في التركيز على الصوت لإدارة تشغيل الصوت في السيارات. تُستخدَم معلومات التركيز لإدارة البث الذي يجب التحكّم فيه من أجل مستوى الصوت وتجنُّب التداخل مع أصوات أخرى. لذلك، ولتوسيع نطاق أولويّة الصوت بشكل أكبر وتوفير تكامل أفضل للأصوات الخاصة بالسيارة في تجربة Android، تم طرح سمات الصوت التالية في Android 11:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

بالإضافة إلى هذا التغيير، تمت إضافة آلية للأصوات التي تنشأ من خارج Android للمشاركة في طلبات أولويّة الصوت. وبالتالي، تم طرح الإصدار 2 من واجهة برمجة التطبيقات 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 للتحكّم في الصوت

مع ظهور 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);
}

كتم صوت مجموعة مستوى الصوت

طرح 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، كان يجب استبدال الإعداد باستخدام تراكب الموارد في الوقت الفعلي لـ packages/services/Car/service/res/values/config.xml (لمزيد من المعلومات، يُرجى الاطّلاع على تخصيص الإصدار باستخدام تراكبات الموارد). اعتبارًا من Android 13، يمكنك استخدام تراكبات موارد وقت التشغيل لتغيير قيمة الإعداد. لمزيد من المعلومات، يُرجى الاطّلاع على تغيير قيمة موارد التطبيق في وقت التشغيل.

يمكن لتطبيقات النظام تحديد ما إذا كانت الميزة مفعّلة باستخدام واجهة برمجة التطبيقات CarAudioManager#isAudioFeatureEnabled. يجب أن تكون المَعلمة التي يتم تمريرها هي الثابت CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING. تعرِض الطريقة true إذا كانت الميزة مفعّلة على الجهاز، وfalse بخلاف ذلك.

بالإضافة إلى تفعيل ميزة audioUseCarVolumeGroupMuting، يجب أن تنفّذ واجهة برمجة التطبيقات 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;
}

يتضمّن نظام التشغيل 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>

لتفعيل الميزة، يجب أن تنفّذ واجهة برمجة التطبيقات 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;
}

بالإضافة إلى معلومات إعداد الصوت في السيارة الواردة في عناوين الأجهزة التي يجب (إيقاف) تجنُّب التداخل مع أصوات أخرى فيها، تحتوي معلومات تجنُّب التداخل مع أصوات أخرى أيضًا على معلومات حول استخدامات سمات الصوت التي تحتفظ بالتركيز. والهدف من هذه البيانات هو إعلام النظام الصوتي باستخدامات سمات الصوت النشطة.

هذا مطلوب لأنه في إعداد الصوت في السيارة، يمكن تعيين سمات صوت متعدّدة لجهاز واحد، وبدون المعلومات الإضافية، لا يكون من الواضح أيّ الاستخدامات نشطة.

الإصدار 2.0 من واجهة برمجة التطبيقات AIDL للتحكّم في الصوت

لتعديل واجهات برمجة التطبيقات وتسهيل الوظائف الجديدة، تم تعديل واجهة برمجة التطبيقات 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 كما هو موضّح في استخدام طرق واجهة برمجة التطبيقات ذات الإصدارات.

تستدعي خدمة الصوت أولاً onAudioFocusChangeWithMetaData و ثم تعيد المحاولة باستخدام طريقة onAudioFocusChange إذا نتج عن ذلك خطأ UNKNOWN_TRANSACTION.

تجنُّب التداخل مع أصوات أخرى في الصوت في السيارة باستخدام البيانات الوصفية لتشغيل الصوت

أضاف الإصدار 2.0 من واجهة برمجة التطبيقات 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 في Android 13، أضفنا آلية يمكنك استخدامها لإبلاغ خدمة الصوت في السيارة بالتغييرات في مستوى الصوت من النظام الصوتي في السيارة. تعرض الآلية التغييرات في فهرس مستوى الصوت مع سبب تغيير مستوى الصوت:

  • القيود المحظورة أو التي تم كتم صوتها
  • قيود الحدود
  • قيود التخفيف

تعرض هذه التغييرات هذه القيود من أسفل واجهة برمجة التطبيقات 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 متى يتم استدعاء واجهة برمجة التطبيقات، وذلك بشكل أساسي للإبلاغ عن التغييرات في حالة فهرس مستوى الصوت. بالنسبة إلى متطلبات التنظيم، يجب أن يتّخذ النظام الصوتي في السيارة الإجراء المطلوب ويستخدم طلب معاودة الاتصال للإبلاغ عن المعلومات إلى خدمة الصوت في السيارة للسماح للمستخدم باستخدامها. على سبيل المثال، لعرض واجهة مستخدم للمستخدم.

الإصدار 3.0 من واجهة برمجة التطبيقات AIDL للتحكّم في الصوت

تم تعديل إصدار واجهة برمجة التطبيقات AIDL للتحكّم في الصوت في Android 14 إلى الإصدار 3.0 لتعديل واجهات برمجة التطبيقات وتوفير وظائف أكثر فعالية لفهرس مستوى الصوت. تسمح واجهة برمجة التطبيقات 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، يجب أن يمحو التنفيذ طلب معاودة الاتصال الحالي أو ألا يفعل أي شيء إذا لم يكن هناك طلب معاودة اتصال. من أفضل الممارسات أن تسجِّل عملية تنفيذ التحكّم في الصوت مراقبًا لانتهاء طلب معاودة الاتصال، ثم تمحو طلب معاودة الاتصال إذا تم تفعيل انتهاء رابط واجهة برمجة التطبيقات.

يتم تعريف 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. يمكن استخدام واجهة برمجة التطبيقات لتهيئة مستوى الصوت للنظام الصوتي فور تسجيل طلب معاودة الاتصال. بالنسبة إلى التغييرات الأخرى في مستوى الصوت الديناميكي، يمكن استدعاء واجهة برمجة التطبيقات في أي وقت. يتم تطبيق التغييرات المقابلة ويتم تعديل خدمة الصوت في السيارة وفقًا لذلك.