کنترل صوتی HAL

کنترل صوتی HAL در اندروید ۹ برای پشتیبانی از موارد استفاده صوتی مرتبط با خودرو معرفی شد. از اندروید ۱۴، کنترل صوتی HAL از موارد زیر پشتیبانی می‌کند:

  • محو شدن و تعادل
  • درخواست فوکوس صوتی HAL
  • بی‌صدا کردن و خاموش کردن دستگاه
  • تغییرات در گِین دستگاه صوتی
  • تغییرات پیکربندی پورت صوتی

شکل ۱ یک نمای کلی از معماری سرویس صوتی خودرو را نشان می‌دهد که در آن سرویس صوتی خودرو با کنترل صوتی HAL ارتباط برقرار می‌کند.

پیکربندی صدای چند منطقه‌ای

شکل ۱. پیکربندی صدای چند منطقه‌ای.

محو شدن و تعادل صدا

کنترل صوتی HIDL نسخه ۱ HAL در اندروید ۹ معرفی شد تا از محو شدن و متعادل شدن صدا در موارد استفاده خودرو پشتیبانی کند. جدا از جلوه‌های صوتی عمومی که قبلاً در اندروید ارائه شده است، این مکانیسم به برنامه‌های سیستمی اجازه می‌دهد تا تعادل و محو شدن صدا را از طریق APIهای 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);
}

پس از فراخوانی این APIها، APIهای 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);
}

این API در تمام نسخه‌های کنترل صوتی HAL، از جمله رابط کاربری جدید AIDL HAL، موجود است.

درخواست فوکوس صوتی از HAL

AAOS، مشابه اندروید، برای مدیریت پخش صدا در خودروها، به مشارکت فعال برنامه‌ها در فوکوس صوتی متکی است. اطلاعات فوکوس برای مدیریت اینکه کدام جریان‌ها باید برای میزان صدا و کاهش نویز کنترل شوند، استفاده می‌شود. به همین ترتیب، برای گسترش بیشتر فوکوس صوتی و ارائه ادغام بهتر صداهای خاص خودرو در تجربه اندروید، ویژگی‌های صوتی زیر در اندروید ۱۱ معرفی شده‌اند:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

علاوه بر این تغییر، مکانیزمی برای صداهایی که از خارج از اندروید سرچشمه می‌گیرند، اضافه شد تا در درخواست‌های فوکوس صوتی شرکت کنند. بنابراین، کنترل صوتی HIDL HAL نسخه ۲ معرفی شد تا امکان درخواست‌های فوکوس که از خارج از اندروید سرچشمه می‌گیرند را فراهم کند:

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);
}

API های فوق می‌توانند به ترتیب برای درخواست و لغو فوکوس صوتی از HAL استفاده شوند. در پاسخ، سرویس صوتی خودرو درخواست فوکوس صوتی را در نظر می‌گیرد و نتایج را به صورت ناهمزمان به متد IAudioControl#onAudioFocusChange ارسال می‌کند.

این API همچنین می‌تواند برای نظارت بر تغییرات درخواست فوکوس صوتی که از کنترل صوتی HAL سرچشمه می‌گیرد، استفاده شود. به طور کلی، هر درخواست فوکوس صوتی دائمی از HAL فعال در نظر گرفته می‌شود، که با درخواست فوکوس صوتی از اندروید متفاوت است، که در آن فقط پخش آهنگ صوتی فعال مربوطه فعال در نظر گرفته می‌شود.

HIDL را به کنترل صوتی AIDL HAL منتقل کنید

با ظهور AIDL و مهاجرت مورد نیاز در اندروید ۱۲ (برای کسب اطلاعات بیشتر، به AIDL برای HALها مراجعه کنید)، کنترل صوتی HAL به AIDL منتقل شد. برای APIهای کنترل صوتی 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);
}

بی‌صدا کردن گروه صدا

اندروید ۱۲ قابلیت بی‌صدا کردن گروهی صدا را معرفی کرد تا امکان کنترل جامع‌تر بی‌صدا کردن صدا در طول تعاملات صوتی کاربر فراهم شود. این قابلیت به کنترل صوتی HAL اجازه می‌دهد تا رویدادهای بی‌صدا کردن را که توسط سرویس صوتی خودرو رهگیری می‌شوند، دریافت کند.

برای فعال کردن این ویژگی، تولیدکنندگان اصلی تجهیزات (OEM) باید پیکربندی audioUseCarVolumeGroupMuting را در سرویس car config.xml روی true تنظیم کنند:

<!-- 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>

قبل از اندروید ۱۳، پیکربندی باید با یک پوشش منبع زمان اجرا برای packages/services/Car/service/res/values/config.xml بازنویسی می‌شد (برای کسب اطلاعات بیشتر، به سفارشی‌سازی ساخت با پوشش‌های منبع مراجعه کنید). از اندروید ۱۳، می‌توانید از پوشش‌های منبع زمان اجرا برای تغییر مقدار پیکربندی استفاده کنید. برای کسب اطلاعات بیشتر، به تغییر مقدار منابع یک برنامه در زمان اجرا مراجعه کنید.

برنامه‌های سیستمی می‌توانند با استفاده از API مربوط به 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 می‌شوند.

سیستم صوتی ماشین را خاموش کنید

اندروید ۱۲ قابلیت «کاهش فاصله بین خطوط پخش صدا در خودرو» را برای بهینه‌سازی کنترل پخش همزمان جریان‌های صوتی معرفی کرد. این قابلیت به تولیدکنندگان اصلی تجهیزات (OEM) اجازه می‌دهد تا رفتار «کاهش فاصله بین خطوط پخش صدا» خود را بر اساس پیکربندی فیزیکی صدا در خودرو و وضعیت پخش فعلی، همانطور که توسط سرویس پخش صدا در خودرو تعیین می‌شود، پیاده‌سازی کنند.

مکانیزم کم کردن فاصله بین دو بلندگو (ducking) بر اساس تغییرات پشته فوکوس صوتی است. هر زمان که تغییری در فوکوس رخ دهد (چه درخواست فوکوس و چه رها کردن فوکوس)، کنترل صوتی 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 HAL باید منطق مربوطه را با سیگنال دریافتی از سرویس صوتی خودرو پیاده‌سازی کند:

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 با HAL 2.0

برای به‌روزرسانی APIها و تسهیل قابلیت‌های جدید، کنترل صوتی AIDL HAL در اندروید ۱۳ به نسخه ۲.۰ به‌روزرسانی شد:

  • فوکوس صوتی با PlaybackTrackMetadata
  • صدا قابلیت فراخوانی مجدد را به دست می‌آورد

فراداده‌های پخش در android.hardware.audio.common به شرح زیر تعریف می‌شوند:

parcelable PlaybackTrackMetadata {
       AudioUsage usage = INVALID;
       AudioContentType contentType = UNKNOWN;
       float gain;
       AudioChannelLayout channelMask;
       AudioDevice sourceDevice;
       String[] tags;
}

تمام قابلیت‌های دیگر از نسخه ۱.۰ کنترل صوتی 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 می‌تواند به استفاده از روش‌های قبلی ادامه دهد.

اگر توسعه‌دهندگان HAL تصمیم بگیرند که IAudioControl#onAudioFocusChangeWithMetaData پشتیبانی نکنند، این متد باید نتایجی با خطای UNKNOWN_TRANSACTION مطابق آنچه در Using Versioned Interface Methods توضیح داده شده است، برگرداند.

سرویس صوتی ابتدا متد onAudioFocusChangeWithMetaData را فراخوانی می‌کند و سپس در صورت بروز خطای UNKNOWN_TRANSACTION با متد onAudioFocusChange دوباره تلاش می‌کند.

کاهش نویز صدای ماشین با استفاده از فراداده آهنگ در حال پخش

نسخه ۲.۰ کنترل صوتی AIDL 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 برای تعیین میزان استفاده از ویژگی audio و سایر اطلاعات صوتی استفاده کنند. با این اوصاف، پارامتر usagesHoldingFocus تا زمانی که این گزینه رسماً حذف شود، همچنان حاوی اطلاعات مورد نیاز است.

فراخوانی مجدد بهره صوتی

برای اینکه تغییرات صوتی زیر HAL برای AAOS در اندروید ۱۳ قابل مشاهده‌تر باشد، مکانیزمی اضافه کرده‌ایم که می‌توانید از آن برای انتقال تغییرات بهره صوتی از سیستم صوتی خودرو به سرویس صوتی خودرو استفاده کنید. این مکانیزم، تغییرات شاخص حجم بهره صوتی را به همراه دلیل تغییر بهره نمایش می‌دهد:

  • محدودیت‌های مسدود شده یا بی‌صدا
  • محدودیت‌ها
  • محدودیت‌های میرایی

این تغییرات، این محدودیت‌ها را از پایین HAL به سرویس صوتی خودرو و در نهایت، به یک برنامه رابط کاربری سیستم برای اطلاع‌رسانی به کاربر، اعمال می‌کند. بخش دوم، یعنی قرار گرفتن در معرض یک رابط کاربری سیستم احتمالی، در اندروید ۱۴ بیشتر گسترش یافته است تا به برنامه‌های رابط کاربری سیستم اجازه دهد تا این اطلاعات را از طریق مکانیسم فراخوانی اطلاعات گروه صدا، راحت‌تر دریافت کنند.

رابط برنامه‌نویسی کاربردی کنترل صدا HAL، تابع فراخوانی gain را به صورت زیر ثبت می‌کند:

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);
}

همانطور که در مستندات API مشخص شده است، فراخوانی gain توسط سرویس صوتی خودرو در کنترل صوتی HAL ثبت می‌شود. هنگامی که API از کنترل صوتی HAL فراخوانی می‌شود، سرویس صوتی خودرو با یک اقدام مربوطه (مانند مسدود کردن، محدود کردن یا کاهش شاخص gain) پاسخ می‌دهد.

HAL زمان فراخوانی API را تعیین می‌کند، که در درجه اول برای گزارش تغییرات در وضعیت شاخص بهره است. سیستم صوتی خودرو، به طور خاص برای الزامات نظارتی، باید اقدامات لازم را انجام دهد و از فراخوانی برای گزارش اطلاعات به سرویس صوتی خودرو استفاده کند تا امکان استفاده کاربر فراهم شود. به عنوان مثال، برای نمایش یک رابط کاربری به کاربر.

کنترل صوتی AIDL با HAL 3.0

نسخه HAL کنترل صوتی AIDL اندروید ۱۴ به نسخه ۳.۰ به‌روزرسانی شده است تا APIها به‌روزرسانی شوند و عملکرد شاخص افزایش صدای قوی‌تری را ارائه دهند. API کنترل صوتی 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 کنترل صوتی باید هنگام فراخوانی API، جایگزین هرگونه فراخوانی تغییر ماژول موجود شود.

برای API clearModuleChangeCallback ، پیاده‌سازی باید callback موجود را پاک کند یا اگر وجود ندارد، هیچ کاری انجام ندهد. این یک روش خوب برای پیاده‌سازی کنترل صدا است که یک ناظر مرگ برای callback ثبت کند و سپس در صورت فعال شدن مرگ on binder، callback را پاک کند.

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);
}

وقتی فراخوانی تغییر ماژول توسط سرویس صوتی خودرو ثبت می‌شود، آماده دریافت تغییرات پورت صوتی از طریق API onAudioPortChanged است. این API می‌تواند به محض ثبت فراخوانی، برای مقداردهی اولیه افزایش صدا برای سیستم صوتی استفاده شود. برای سایر تغییرات پویا در افزایش صدا، API را می‌توان در هر زمان فراخوانی کرد. تغییرات مربوطه اعمال می‌شوند و سرویس صوتی خودرو بر اساس آن به‌روزرسانی می‌شود.