অডিও নিয়ন্ত্রণ HAL

অটোমোটিভ সম্পর্কিত অডিও ব্যবহারের ক্ষেত্রগুলোকে সমর্থন করার জন্য অ্যান্ড্রয়েড ৯-এ অডিও কন্ট্রোল এইচএএল (HAL) চালু করা হয়েছিল। অ্যান্ড্রয়েড ১৪ থেকে, অডিও কন্ট্রোল এইচএএল নিম্নলিখিত বিষয়গুলো সমর্থন করে:

  • ফেইড এবং ভারসাম্য
  • HAL অডিও ফোকাস অনুরোধ
  • ডিভাইস মিউট এবং ডাকিং
  • অডিও ডিভাইসের গেইন পরিবর্তন
  • অডিও পোর্ট কনফিগারেশন পরিবর্তন

চিত্র ১-এ গাড়ির অডিও পরিষেবা স্থাপত্যের একটি উচ্চ-স্তরের সংক্ষিপ্ত বিবরণ দেখানো হয়েছে, যেখানে গাড়ির অডিও পরিষেবাটি অডিও নিয়ন্ত্রণ HAL-এর সাথে যোগাযোগ করে।

মাল্টি-জোন অডিও কনফিগার করুন

চিত্র ১. মাল্টি-জোন অডিও কনফিগার করুন।

অডিও ফেড এবং ব্যালেন্স

গাড়ির ক্ষেত্রে অডিও ফেড এবং ব্যালেন্স সমর্থন করার জন্য অ্যান্ড্রয়েড ৯-এ HIDL অডিও কন্ট্রোল HAL ভার্সন ১ চালু করা হয়েছিল। অ্যান্ড্রয়েডে আগে থেকেই থাকা সাধারণ অডিও এফেক্টগুলো থেকে আলাদা এই পদ্ধতিটি, সিস্টেম অ্যাপগুলোকে CarAudioManager API-এর মাধ্যমে অডিও ব্যালেন্স এবং ফেড সেট করার সুযোগ দেয়।

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-গুলো কল করা হলে, গাড়ির অডিও পরিষেবা থেকে সংশ্লিষ্ট অডিও কন্ট্রোল HAL API-গুলো কল করা হয়:

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

নতুন AIDL HAL ইন্টারফেস সহ অডিও কন্ট্রোল HAL-এর সকল সংস্করণে API-টি উপলব্ধ।

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

উপরের এপিআইগুলো যথাক্রমে এইচএএল (HAL) থেকে অডিও ফোকাসের জন্য অনুরোধ করতে এবং তা বাতিল করতে ব্যবহার করা যেতে পারে। এর জবাবে, গাড়ির অডিও পরিষেবাটি অডিও ফোকাসের অনুরোধটি বিবেচনা করে এবং ফলাফলগুলো অ্যাসিঙ্ক্রোনাসভাবে IAudioControl#onAudioFocusChange মেথডে পাঠিয়ে দেয়।

এই API-টি অডিও কন্ট্রোল HAL থেকে আসা অডিও ফোকাস রিকোয়েস্টের পরিবর্তনগুলো নিরীক্ষণ করতেও ব্যবহার করা যায়। সাধারণত, HAL থেকে আসা যেকোনো চলমান অডিও ফোকাস রিকোয়েস্টকে সক্রিয় বলে গণ্য করা হয়, যা অ্যান্ড্রয়েড থেকে আসা অডিও ফোকাস রিকোয়েস্ট থেকে ভিন্ন, যেখানে শুধুমাত্র সংশ্লিষ্ট সক্রিয় অডিও ট্র্যাক প্লেব্যাককেই সক্রিয় বলে বিবেচনা করা হয়।

HIDL থেকে AIDL অডিও কন্ট্রোল HAL-এ স্থানান্তর করুন

AIDL-এর আবির্ভাব এবং Android 12-এ এর প্রয়োজনীয় মাইগ্রেশনের ফলে (আরও জানতে, AIDL for HALs দেখুন), অডিও কন্ট্রোল HAL-কে AIDL-এ মাইগ্রেট করা হয়েছিল। বিদ্যমান HIDL অডিও কন্ট্রোল ভার্সন 2 API-গুলোর জন্য, এই মাইগ্রেশনে বিদ্যমান মেথডগুলোতে সামান্য কিছু আপডেটের প্রয়োজন হয়েছিল:

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-দের অবশ্যই গাড়ির সার্ভিস config.xml ফাইলে audioUseCarVolumeGroupMuting কনফিগটি 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 জন্য কনফিগটি একটি রানটাইম রিসোর্স ওভারলে দিয়ে ওভাররাইট করতে হতো (আরও জানতে, রিসোর্স ওভারলে দিয়ে বিল্ড কাস্টমাইজ করা দেখুন)। অ্যান্ড্রয়েড ১৩ থেকে, আপনি একটি কনফিগারেশন ভ্যালু পরিবর্তন করতে রানটাইম রিসোর্স ওভারলে ব্যবহার করতে পারেন। আরও জানতে, রানটাইমে একটি অ্যাপের রিসোর্সের ভ্যালু পরিবর্তন করা দেখুন।

সিস্টেম অ্যাপগুলি CarAudioManager#isAudioFeatureEnabled API ব্যবহার করে ফিচারটি চালু আছে কিনা তা নির্ধারণ করতে পারে। পাস করা প্যারামিটারটি অবশ্যই 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-এ কল মিউট চালু করে।

গাড়ির অডিও ডাকিং

একই সাথে একাধিক অডিও স্ট্রিমের প্লেব্যাক নিয়ন্ত্রণকে অপ্টিমাইজ করার জন্য অ্যান্ড্রয়েড ১২-এ কার অডিও ডাকিং (ducking) ফিচারটি চালু করা হয়েছে। এর ফলে, ওইএম (OEM)-রা গাড়ির ফিজিক্যাল অডিও কনফিগারেশন এবং কার অডিও সার্ভিস দ্বারা নির্ধারিত বর্তমান প্লেব্যাক অবস্থার উপর ভিত্তি করে তাদের নিজস্ব ডাকিং আচরণ প্রয়োগ করতে পারে।

ডাকিং মেকানিজমটি অডিও ফোকাস স্ট্যাকের পরিবর্তনের উপর ভিত্তি করে কাজ করে। যখনই কোনো ফোকাস পরিবর্তন ঘটে (তা ফোকাস রিকোয়েস্ট হোক বা ফোকাস অ্যাবানডন), অডিও কন্ট্রোল 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

এপিআই আপডেট করতে এবং নতুন কার্যকারিতা সহজতর করার জন্য, অ্যান্ড্রয়েড ১৩-এ এআইডিএল অডিও কন্ট্রোল এইচএএল-কে ২.০ সংস্করণে আপডেট করা হয়েছে:

  • PlaybackTrackMetadata সহ অডিও ফোকাস
  • অডিও গেইনস কলব্যাক

android.hardware.audio.common এ প্লেব্যাক মেটাডেটা নিম্নরূপভাবে সংজ্ঞায়িত করা হয়েছে:

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

AIDL অডিও কন্ট্রোল সংস্করণ 1.0-এর অন্য সমস্ত কার্যকারিতা অপরিবর্তিত রয়েছে এবং ব্যবহার করা যাবে। এর একটি ব্যতিক্রম হলো অডিও ফোকাস পরিবর্তন পদ্ধতি, যা 'অডিও ফোকাস পরিবর্তন পদ্ধতি প্রসঙ্গে' অংশে বর্ণনা করা হয়েছে।

প্লেব্যাক ট্র্যাক মেটাডেটা সহ অডিও নিয়ন্ত্রণ ফোকাস

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 ত্রুটিসহ ফলাফল ফেরত দেওয়া উচিত।

অডিও সার্ভিসটি প্রথমে 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 ব্যবহার করা উচিত। তবে, এই অপশনটি আনুষ্ঠানিকভাবে সরিয়ে না দেওয়া পর্যন্ত usagesHoldingFocus প্যারামিটারটিতে প্রয়োজনীয় তথ্য থাকবে।

অডিও গেইন কলব্যাক

অ্যান্ড্রয়েড ১৩-এ AAOS-এর কাছে HAL-এর নিচের অডিও পরিবর্তনগুলো আরও দৃশ্যমান করার জন্য, আমরা এমন একটি পদ্ধতি যুক্ত করেছি যা ব্যবহার করে গাড়ির অডিও সিস্টেম থেকে গাড়ির অডিও সার্ভিসে অডিও গেইনের পরিবর্তনগুলো জানানো যায়। এই পদ্ধতিটি অডিও গেইন ভলিউম ইনডেক্সের পরিবর্তনগুলো প্রকাশ করে এবং সাথে গেইন পরিবর্তনের কারণও জানায়:

  • অবরুদ্ধ বা নীরব বিধিনিষেধ
  • সীমাবদ্ধতা বিধিনিষেধ
  • ক্ষয় সীমাবদ্ধতা

এই পরিবর্তনগুলো HAL-এর নীচের স্তর থেকে গাড়ির অডিও পরিষেবা এবং অবশেষে ব্যবহারকারীকে জানানোর জন্য একটি সিস্টেম UI অ্যাপের কাছে এই সীমাবদ্ধতাগুলো প্রকাশ করে। শেষের অংশটি, অর্থাৎ একটি সম্ভাব্য সিস্টেম UI-এর কাছে প্রকাশ করা, অ্যান্ড্রয়েড ১৪-এ আরও প্রসারিত করা হয়েছিল, যাতে সিস্টেম UI অ্যাপগুলো একটি ভলিউম গ্রুপ ইনফরমেশন কলব্যাক মেকানিজমের মাধ্যমে আরও সহজে এই তথ্য পেতে পারে।

অডিও কন্ট্রোল HAL API নিম্নলিখিতভাবে গেইন কলব্যাকটি রেজিস্টার করে:

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 নির্ধারণ করে কখন API কল করা হবে, যার প্রধান উদ্দেশ্য হলো গেইন ইনডেক্স স্ট্যাটাসের পরিবর্তনগুলো রিপোর্ট করা। প্রবিধানের প্রয়োজনীয়তা অনুসারে, গাড়ির অডিও সিস্টেমকে প্রয়োজনীয় পদক্ষেপ নিতে হবে এবং ব্যবহারকারীকে তথ্য গ্রহণের সুযোগ দেওয়ার জন্য কলব্যাক ব্যবহার করে গাড়ির অডিও পরিষেবাতে তথ্য রিপোর্ট করতে হবে। উদাহরণস্বরূপ, ব্যবহারকারীকে একটি UI দেখানোর জন্য।

AIDL অডিও নিয়ন্ত্রণ HAL 3.0

আরও শক্তিশালী অডিও গেইন ইনডেক্স কার্যকারিতা প্রদানের জন্য এপিআই (API) আপডেট করতে অ্যান্ড্রয়েড ১৪ এআইডিএল (AIDL) অডিও কন্ট্রোল এইচএএল (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 বাইন্ডার ডেথ নোটিফিকেশন পেলে। যখন এই API-টি কল করা হয়, তখন অডিও কন্ট্রোল HAL ইমপ্লিমেন্টেশনটির উচিত বিদ্যমান যেকোনো মডিউল চেঞ্জ কলব্যাককে প্রতিস্থাপন করা।

clearModuleChangeCallback API-এর ক্ষেত্রে, ইমপ্লিমেন্টেশনটির উচিত বিদ্যমান কলব্যাকটি ক্লিয়ার করে দেওয়া, অথবা কোনো কলব্যাক না থাকলে কিছুই না করা। অডিও কন্ট্রোল ইমপ্লিমেন্টেশনের জন্য এটি একটি ভালো অভ্যাস যে, কলব্যাকটির জন্য একটি ডেথ অবজারভার রেজিস্টার করা এবং তারপর '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 API-এর মাধ্যমে অডিও পোর্টের পরিবর্তন গ্রহণ করার জন্য প্রস্তুত থাকে। কলব্যাকটি রেজিস্টার হওয়ার সাথে সাথেই অডিও সিস্টেমের ভলিউম গেইন ইনিশিয়ালাইজ করার জন্য এই API-টি ব্যবহার করা যেতে পারে। অন্যান্য ডাইনামিক গেইন পরিবর্তনের জন্য, API-টি যেকোনো সময় কল করা যেতে পারে। সংশ্লিষ্ট পরিবর্তনগুলো প্রয়োগ করা হয় এবং সেই অনুযায়ী কার অডিও সার্ভিসটি আপডেট হয়ে যায়।