ভলিউম ব্যবস্থাপনা

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

স্থির পরিমাণ

AAOS ইমপ্লিমেন্টেশনগুলো সফটওয়্যার মিক্সারের পরিবর্তে ভলিউম নিয়ন্ত্রণের জন্য একটি হার্ডওয়্যার অ্যামপ্লিফায়ার ব্যবহার করে। সাইড এফেক্ট এড়াতে, config_useFixedVolume ফ্ল্যাগটিকে true তে সেট করুন (প্রয়োজন অনুযায়ী ওভারলে করুন):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

যখন config_useFixedVolume ফ্ল্যাগটি সেট করা থাকে না (অথবা false সেট করা থাকে), তখন অ্যাপগুলো সফটওয়্যার মিক্সারে স্ট্রিম টাইপ অনুযায়ী ভলিউম পরিবর্তন করার জন্য AudioManager.setStreamVolume() কল করতে পারে। এটি সবসময় কাম্য নাও হতে পারে, কারণ এর ফলে অন্যান্য অ্যাপের উপর সম্ভাব্য প্রভাব পড়তে পারে এবং সফটওয়্যার মিক্সারে ভলিউম কমে যাওয়ার ফলে হার্ডওয়্যার অ্যামপ্লিফায়ারে সিগন্যালটি গ্রহণ করার সময় তাতে কম সংখ্যক সিগনিফিক্যান্ট বিট উপলব্ধ থাকতে পারে।

ভলিউম গ্রুপ

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

ভলিউম গ্রুপ সংজ্ঞায়িত করুন

CarAudioService, car_audio_configuration.xml এ সংজ্ঞায়িত ভলিউম গ্রুপগুলি ব্যবহার করে:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <device address="bus0_media_out">
                            <context context="music"/>
                        </device>
                    </group>
                    <group>
                        <device address="bus1_navigation_out">
                            <context context="navigation"/>
                        </device>
                        <device address="bus2_voice_command_out">
                            <context context="voice_command"/>
                        </device>
                    </group>
                    ...
                </volumeGroups>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

প্রতিটি ভলিউম গ্রুপে সংশ্লিষ্ট অ্যাড্রেসসহ এক বা একাধিক আউটপুট ডিভাইস থাকা উচিত। অ্যাড্রেসগুলো audio_policy_configuration.xml ফাইলে সংজ্ঞায়িত আউটপুট ডিভাইসগুলোর সাথে সঙ্গতিপূর্ণ হতে হবে।

ভলিউম গ্রুপ লাভ কনফিগার করুন

প্রতিটি ভলিউম গ্রুপের সর্বনিম্ন, সর্বোচ্চ এবং ডিফল্ট গেইন মানের পাশাপাশি একটি স্টেপ সাইজও থাকে, যা ভলিউম গ্রুপের সাথে যুক্ত ডিভাইসগুলোর জন্য audio_policy_configuration.xml ফাইলে কনফিগার করা মানের উপর ভিত্তি করে নির্ধারিত হয়।

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

প্রারম্ভিকীকরণের সময়, ভলিউম গ্রুপ সংশ্লিষ্ট ডিভাইসগুলির গেইন মান যাচাই করে এবং গ্রুপটিকে নিম্নরূপে কনফিগার করে:

  • ধাপের আকার। ভলিউম গ্রুপ দ্বারা নিয়ন্ত্রিত সমস্ত ডিভাইসের জন্য এটি অবশ্যই একই হতে হবে।
  • সর্বনিম্ন গেইন। গ্রুপের ডিভাইসগুলোর মধ্যে সবচেয়ে কম সর্বনিম্ন গেইন।
  • সর্বোচ্চ গেইন। এই গ্রুপের ডিভাইসগুলোর মধ্যে সর্বোচ্চ সর্বোচ্চ গেইন।
  • ডিফল্ট গেইন। গ্রুপের ডিভাইসগুলোর মধ্যে সর্বোচ্চ ডিফল্ট গেইন।

এই মানগুলি যেভাবে কনফিগার করা আছে, তাতে কোনো ডিভাইসের জন্য সেই ভলিউম গ্রুপের গেইনকে সমর্থিত সীমার বাইরে সেট করা সম্ভব। এক্ষেত্রে, ভলিউম গ্রুপের মানটি সীমার নিচে বা উপরে থাকার উপর ভিত্তি করে, সেই ডিভাইসটির জন্য গেইনটি তার সর্বনিম্ন বা সর্বোচ্চ মানে সেট করা হয়।

ভলিউম গ্রুপ শনাক্তকারী

XML ফাইলে সংজ্ঞায়িত ক্রম অনুসারে রানটাইমে ভলিউম গ্রুপগুলি শনাক্ত করা হয়। একটি অডিও জোনের মধ্যে আইডি-র পরিসর 0 থেকে N-1 পর্যন্ত হতে পারে, যেখানে N হলো সেই জোনের ভলিউম গ্রুপের সংখ্যা। এই কারণে, বিভিন্ন জোনের মধ্যে ভলিউম গ্রুপ আইডিগুলো অনন্য হয় না। এই আইডেন্টিফায়ারগুলো ভলিউম গ্রুপের সাথে যুক্ত CarAudioManager API-গুলোর জন্য ব্যবহৃত হয়। যে কোনো API যা zoneId ছাড়া groupId গ্রহণ করে, সেটি ডিফল্ট হিসেবে প্রাইমারি অডিও জোনকে ব্যবহার করে।

মাল্টি-জোন ভলিউম ম্যানেজমেন্ট

প্রতিটি অডিও জোনে এক বা একাধিক ভলিউম গ্রুপ থাকার কথা, এবং প্রতিটি ভলিউম গ্রুপ শুধুমাত্র একটি অডিও জোনের সাথেই যুক্ত থাকে। এই সম্পর্কটি car_audio_configuration.xml ফাইলের অংশ হিসেবে সংজ্ঞায়িত করা হয়। আরও জানতে, 'ভলিউম গ্রুপ সংজ্ঞায়িত করুন' অংশে উপরের উদাহরণটি দেখুন।

প্রতিটি জোনের বর্তমান ভলিউম লেভেল সেই জোনের সাথে যুক্ত ব্যবহারকারীর জন্য সংরক্ষিত থাকে। এই সেটিংসগুলো জোন-ভিত্তিক, অর্থাৎ, যদি কোনো ব্যবহারকারী প্রাথমিক জোনের সাথে যুক্ত কোনো ডিসপ্লেতে সাইন ইন করেন এবং পরে একটি দ্বিতীয় অডিও জোনের সাথে যুক্ত কোনো জোনে সাইন ইন করেন, তাহলে প্রথম জোনের জন্য লোড ও সংরক্ষিত ভলিউম লেভেলগুলো দ্বিতীয় জোনের ভলিউম লেভেল থেকে ভিন্ন হবে।

সর্বনিম্ন এবং সর্বোচ্চ সক্রিয়করণ ভলিউম

অ্যান্ড্রয়েড ১৫ গাড়ির অডিও সিস্টেমে উন্নত সুরক্ষা এবং ব্যবহারকারীর সুবিধার জন্য ভলিউম গ্রুপ ইনডেক্স নিয়ন্ত্রণের সুবিধা নিয়ে এসেছে। এটি সর্বনিম্ন এবং সর্বোচ্চ অ্যাক্টিভেশন ভলিউম ব্যবহারের মাধ্যমে করা হয়, যা গাড়ির অডিও কনফিগারেশনের মধ্যে সেট করা যায় (দেখুন ভলিউম গ্রুপ সংজ্ঞায়িত করুন )। আপনি কার সার্ভিস RRO-তে audioUseMinMaxActivationVolume কে true সেট করে এই ফিচারটি চালু করতে পারেন।

আপনি activationVolumeConfigs এ একাধিক activationVolumeConfig এন্ট্রি সংজ্ঞায়িত করতে পারেন, যার প্রতিটি একটি ভিন্ন সর্বনিম্ন এবং সর্বোচ্চ অ্যাক্টিভেশন কনফিগারেশনকে প্রতিনিধিত্ব করে। প্রতিটি activationVolumeConfig :

  • গাড়ির অডিও কনফিগারেশন ফাইল জুড়ে এর একটি অনন্য name থাকতে হবে, যাতে পরবর্তীতে ভলিউম গ্রুপ ( group ) নির্ধারণের সময় এটিকে উল্লেখ করা যায়।
  • এতে অবশ্যই শুধুমাত্র একটি activationVolumeConfigEntry থাকতে হবে।

প্রতিটি activationVolumeConfig নিম্নলিখিত অ্যাট্রিবিউটগুলো থাকে:

  • minActivationVolumePercentage (পূর্ণসংখ্যা, ০-১০০, ঐচ্ছিক, ডিফল্ট: ০): সর্বনিম্ন অ্যাক্টিভেশন ভলিউম শতাংশ হিসাবে নির্দিষ্ট করে।
  • maxActivationVolumePercentage (পূর্ণসংখ্যা, ০-১০০, ঐচ্ছিক, ডিফল্ট: ১০০): সর্বোচ্চ অ্যাক্টিভেশন ভলিউম শতাংশ হিসাবে নির্দিষ্ট করে।
  • invocationType (স্ট্রিং, ঐচ্ছিক, ডিফল্ট: onPlaybackChanged ): সর্বনিম্ন এবং সর্বোচ্চ অ্যাক্টিভেশন ভলিউম কোন শর্তে প্রয়োগ করা হবে তা নির্ধারণ করে:

    • onBoot : বুট হওয়ার পর কোনো ভলিউম গ্রুপে শুধুমাত্র প্রথম নতুন সক্রিয় প্লেব্যাকের ক্ষেত্রে প্রযোজ্য।
    • onSourceChanged : শুধুমাত্র ভলিউম গ্রুপের পরিবর্তিত অ্যাপ বা UID সোর্স সহ নতুন সক্রিয় প্লেব্যাকের ক্ষেত্রে প্রযোজ্য।
    • onPlaybackChanged : একটি ভলিউম গ্রুপের প্রতিটি নতুন সক্রিয় প্লেব্যাকের ক্ষেত্রে প্রযোজ্য।

CarAudioService বর্তমানে সক্রিয় নিম্নলিখিত অডিও উপাংশগুলি পর্যবেক্ষণ করে সর্বনিম্ন এবং সর্বোচ্চ সক্রিয়করণ পরিচালনা করে:

  • বর্তমানে সক্রিয় প্লেব্যাক ট্র্যাকগুলি
  • বর্তমান কল অবস্থা
  • অডিও কন্ট্রোল HAL থেকে আসা বর্তমান অডিও ফোকাস অনুরোধটি নির্দেশ করে যে অ্যান্ড্রয়েডের বাইরে একটি সক্রিয় অডিও প্লেব্যাক চলছে।

নিম্নলিখিত চিত্রটিতে সর্বনিম্ন এবং সর্বোচ্চ অ্যাক্টিভেশন ভলিউম ব্যবস্থাপনার একটি উচ্চ-স্তরের সংক্ষিপ্ত বিবরণ দেখানো হয়েছে:

image

চিত্র ১। ভলিউম ব্যবস্থাপনার সক্রিয় অডিও ডেটা পাথসমূহের সর্বনিম্ন এবং সর্বোচ্চ অ্যাক্টিভেশন।

নির্দিষ্ট minActivationVolumePercentage , maxActivationVolumePercentage এবং সর্বনিম্ন ও সর্বোচ্চ ভলিউম গেইন ইনডেক্স ব্যবহার করে, আপনি প্রতিটি ভলিউম গ্রুপের জন্য সর্বনিম্ন ও সর্বোচ্চ অ্যাক্টিভেশন ভলিউম গেইন ইনডেক্স গণনা করতে পারেন। CarAudioService প্রতিটি নতুন সক্রিয় প্লেব্যাক পর্যবেক্ষণ করে এবং নিম্নলিখিত শর্ত সাপেক্ষে সর্বনিম্ন ও সর্বোচ্চ অ্যাক্টিভেশন ভলিউম প্রয়োগ করে:

  • আহ্বানের ধরনের মিল: প্লেব্যাকের সক্রিয়করণের ধরন (যা অডিও ম্যানেজার, অডিও কন্ট্রোল HAL, বা টেলিফোনি ম্যানেজার থেকে প্রাপ্ত) অবশ্যই ভলিউম গ্রুপের সাথে যুক্ত activationVolumeConfigEntry তে নির্দিষ্ট করা invocationType সাথে মিলতে হবে।
  • ভলিউম ইনডেক্স সীমার বাইরে: ভলিউম গ্রুপের বর্তমান ভলিউম গেইন ইনডেক্সকে অবশ্যই সংজ্ঞায়িত অ্যাক্টিভেশন ভলিউম গেইন ইনডেক্স সীমার বাইরে থাকতে হবে, বিশেষত, নিম্নলিখিতগুলির মধ্যে একটি সত্য:

    • সূচকটি গণনাকৃত সর্বনিম্ন অ্যাক্টিভেশন ভলিউম গেইন সূচকের চেয়ে কম।

      অথবা

    • সূচকটি গণনাকৃত সর্বোচ্চ অ্যাক্টিভেশন ভলিউম গেইন সূচকের চেয়ে বেশি।

অ্যাক্টিভেশন মিলে গেলে, ভলিউম গ্রুপের ভলিউম গেইন ইনডেক্স নিম্নলিখিতগুলির মধ্যে একটিতে সামঞ্জস্য করা হবে:

  • ন্যূনতম অ্যাক্টিভেশন ভলিউম গেইন ইনডেক্স যদি ন্যূনতম অ্যাক্টিভেশন ভলিউম গেইন ইনডেক্সের চেয়ে কম হয়

    অথবা

  • সর্বোচ্চ অ্যাক্টিভেশন ভলিউম গেইন ইনডেক্স যদি সর্বোচ্চ অ্যাক্টিভেশন ভলিউম গেইন ইনডেক্সের চেয়ে বেশি হয়

এছাড়াও, EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED ইভেন্ট টাইপের একটি কার ভলিউম গ্রুপ ইভেন্ট সমস্ত নিবন্ধিত ভলিউম গ্রুপ ইভেন্ট কলব্যাকে পাঠানো হয়।

ভলিউম কী ইভেন্টগুলি পরিচালনা করুন

অ্যান্ড্রয়েড ভলিউম নিয়ন্ত্রণের জন্য বেশ কয়েকটি কীকোড নির্ধারণ করেছে, যার মধ্যে রয়েছে:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

ডিফল্টরূপে, অ্যান্ড্রয়েড ভলিউম কী ইভেন্টগুলোকে অ্যাপে পাঠিয়ে দেয়। অটোমোটিভ ইমপ্লিমেন্টেশনগুলোতে এই কী ইভেন্টগুলোকে CarAudioService দ্বারা প্রসেস করতে বাধ্য করা উচিত, যা তখন প্রয়োজন অনুযায়ী setGroupVolume বা setMasterMute কল করে। এই আচরণটি নিশ্চিত করতে, config_handleVolumeKeysInWindowManager ফ্ল্যাগটিকে true তে সেট করুন:

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

ভলিউম কী ইভেন্টগুলো বর্তমানে কোন জোনের জন্য উদ্দিষ্ট, তা আলাদা করার কোনো উপায় নেই এবং ধরে নেওয়া হয় যে সবগুলোই প্রাইমারি অডিও জোনের সাথে সম্পর্কিত। যখন একটি ভলিউম কী ইভেন্ট পাওয়া যায়, তখন CarAudioService সক্রিয় প্লেয়ারগুলোর অডিও কনটেক্সট সংগ্রহ করে এবং তারপর সর্বোচ্চ অগ্রাধিকারের অডিও কনটেক্সটের সাথে যুক্ত আউটপুট ডিভাইস ধারণকারী ভলিউম গ্রুপটি অ্যাডজাস্ট করে। এই অগ্রাধিকার CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY তে সংজ্ঞায়িত একটি নির্দিষ্ট ক্রম অনুসারে নির্ধারিত হয়।

ফেইড এবং ভারসাম্য

AudioControl HAL-এর উভয় সংস্করণেই গাড়িতে ফেড এবং ব্যালেন্স সেট করার জন্য API অন্তর্ভুক্ত রয়েছে। CarAudioManager-এর সংশ্লিষ্ট সিস্টেম API-গুলো AudioControl HAL-এ মান প্রেরণ করে। এই API-গুলোর জন্য android.car.permission.CAR_CONTROL_AUDIO_VOLUME প্রয়োজন। AudioControl API-গুলো হলো:

  • setBalanceTowardRight(float value) গাড়ির ডান (+) বা বাম (-) দিকে স্পিকারের ভলিউম পরিবর্তন করে।

    • 0.0 কেন্দ্রিক
    • +১.০ পুরোপুরি সঠিক।
    • -১.০ সম্পূর্ণরূপে বামে
    • -১ থেকে ১ এর সীমার বাইরের কোনো মান একটি ত্রুটি।
  • setFadeTowardFront(float value) স্পিকারের ভলিউম গাড়ির সামনের (+) বা পেছনের (-) দিকে সরায়।

    • 0.0 কেন্দ্রিক
    • +১.০ মানে পুরোপুরি ফরোয়ার্ড
    • -১.০ সম্পূর্ণরূপে পিছনে
    • -১ থেকে ১ এর সীমার বাইরের কোনো মান একটি ত্রুটি।

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

অডিও ডাকিং

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

কখন মাথা নিচু করতে হবে

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

  • অ্যান্ড্রয়েডে একাধিক স্ট্রিম একসাথে চলার ঘটনাটি সাধারণত তখনই ঘটে যখন দুটি অ্যাপ বা পরিষেবা একই সাথে অডিও ফোকাস ধরে রাখে। অ্যান্ড্রয়েড কখন যুগপৎ ফোকাস প্রদান করতে পারে তা জানতে, ‘রেস্ট্রিকশন টাইপস’ -এর ইন্টারঅ্যাকশন ম্যাট্রিক্সটি দেখুন। কার অডিও প্লাগইন চালু হওয়ার পর, এটি আপনার অডিওফোকাস ব্যবস্থাপনার উপরও নির্ভর করে।

  • অ্যান্ড্রয়েড দ্বারা মিশ্রিত যেকোনো স্ট্রিম কোনো গেইন প্রয়োগ করার আগেই করা হয়। সেই কারণে, অন্য কোনো স্ট্রিমের সাথে একই সময়ে চালানোর সময় যেটিকে ডাকিং করা প্রয়োজন, সেটিকে আলাদা আউটপুট ডিভাইসে পাঠানো উচিত, যাতে HAL সেগুলোকে মেশানোর আগেই ডাকিং প্রয়োগ করতে পারে।

নিম্নলিখিত সম্ভাব্য যুগপৎ মিথস্ক্রিয়াগুলির ক্ষেত্রে মাথা নিচু করার পরামর্শ দেওয়া হয়।

মিথস্ক্রিয়া পদক্ষেপ
EMERGENCY SAFETY ছাড়া সবকিছুকে হয় নিচু করে অথবা নীরব করে দেয়।
SAFETY EMERGENCY ছাড়া সবকিছু হাঁস।
NAVIGATION SAFETYEMERGENCY ছাড়া সবকিছু এড়িয়ে চলে।
CALL SAFETY , EMERGENCY এবং NAVIGATION ছাড়া সবকিছু এড়িয়ে চলে।
VOICE হাঁস CALL_RING
VEHICLE_SOUNDS আপনি সক্রিয় শব্দটির গুরুত্ব এবং এটি অন্যান্য শব্দকে চাপা দেয় কি না, তা নির্ধারণ করেন।
MUSIC এবং ANNOUNCEMENT সবকিছু দ্বারাই এড়ানো যায়। ব্যতিক্রম হলো টাচ ইন্টারঅ্যাকশন টোন, যা SYSTEM_SOUND হিসেবে বাজানো হয়।

মাথা নিচু করার সময় বিবেচ্য বিষয়সমূহ

কিছু অ্যাপ এবং পরিষেবা, যেমন নেভিগেশন বা অ্যাসিস্ট্যান্ট, বিভিন্ন কাজ সম্পাদনের জন্য একাধিক প্লেয়ার ব্যবহার করতে পারে। আউটপুট ডিভাইসগুলির মাধ্যমে ডেটার প্রবাহ বন্ধ হয়ে গেলে দ্রুত আনডাকিং (unducking) করা থেকে বিরত থাকুন, যাতে নেভিগেশন বা অ্যাসিস্ট্যান্ট অ্যাপ থেকে পরবর্তী প্লেব্যাক শুরু হওয়ার আগে মিডিয়াটি পুনরায় পূর্ণ ভলিউমে ফিরে না আসে।

যেসব গাড়িতে যথেষ্ট ভালো আইসোলেশন সহ একাধিক সাউন্ড স্টেজ রয়েছে, সেগুলোতে আপনি অডিওকে নিচু না করে গাড়ির বিভিন্ন অংশে পাঠাতে পারেন। উদাহরণস্বরূপ, নেভিগেশন নির্দেশনা ড্রাইভারের হেডরেস্ট স্পিকারে পাঠানো যেতে পারে, এবং একই সাথে কেবিনের সর্বত্র স্বাভাবিক ভলিউমে গান বাজতে পারে।

নিরাপত্তাজনিত গুরুত্বপূর্ণ শব্দ

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

ভলিউম সেটিংস UI কনফিগার করুন

AAOS ভলিউম সেটিংস UI-কে ভলিউম গ্রুপ কনফিগারেশন থেকে পৃথক করে রাখে। ‘ভলিউম গ্রুপ গেইন কনফিগার করুন’ অংশে বর্ণিত পদ্ধতি অনুযায়ী এগুলোকে একটির উপর আরেকটি স্থাপন করা যায়। এই পৃথকীকরণ নিশ্চিত করে যে, ভলিউম গ্রুপগুলোর কনফিগারেশন পরিবর্তিত হলেও কোনো পরিবর্তনের প্রয়োজন হবে না।

গাড়ির সেটিংস UI-তে, packages/apps/Car/Settings/res/xml/car_volume_items.xml ফাইলটিতে প্রতিটি সংজ্ঞায়িত AudioAttributes.USAGE এর সাথে সম্পর্কিত UI উপাদানগুলো (শিরোনাম এবং আইকন রিসোর্স) থাকে। এই ফাইলটি প্রতিটি VolumeGroup মধ্যে থাকা প্রথম স্বীকৃত ব্যবহারের সাথে যুক্ত রিসোর্সগুলো ব্যবহার করে সংজ্ঞায়িত VolumeGroups গুলোর একটি যথাযথ রেন্ডারিং নিশ্চিত করে।

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণটি একটি VolumeGroup এমনভাবে সংজ্ঞায়িত করে যেখানে voice_communication এবং voice_communication_signalling অন্তর্ভুক্ত রয়েছে। গাড়ির সেটিংস UI-এর ডিফল্ট বাস্তবায়নটি VolumeGroup টিকে voice_communication সাথে যুক্ত রিসোর্সগুলি ব্যবহার করে রেন্ডার করে, কারণ ফাইলটিতে এটিই প্রথম matc।

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

উপরের কনফিগারেশনে ব্যবহৃত অ্যাট্রিবিউট এবং ভ্যালুগুলো packages/apps/Car/Settings/res/values/attrs.xml ফাইলে ডিক্লেয়ার করা আছে। ভলিউম সেটিংস UI নিম্নলিখিত VolumeGroup ভিত্তিক CarAudioManager API-গুলো ব্যবহার করে:

  • কতগুলো কন্ট্রোল আঁকা হবে তা জানতে getVolumeGroupCount() করুন।
  • নিম্ন ও উচ্চ সীমা পেতে getGroupMinVolume() এবং getGroupMaxVolume() ব্যবহার করুন।
  • বর্তমান ভলিউম পেতে getGroupVolume() ব্যবহার করুন।
  • ভলিউম পরিবর্তনের বিজ্ঞপ্তি পেতে registerVolumeChangeObserver() ব্যবহার করুন।

গাড়ির ভলিউম গ্রুপ ইভেন্ট

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

  • CarVolumeGroupInfo তথ্যের তালিকা
  • EventTypes (বিট-ম্যাপড)
  • ExtraInfos তালিকা

গাড়ির ভলিউম গ্রুপ তথ্য

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

ইভেন্টের প্রকার

CarVolumeGroupInfo এর কোন দিকটি পরিবর্তিত হয়েছে তা এটি নির্ধারণ করে। অ্যাপগুলো পরিবর্তন শনাক্ত করতে এবং প্রয়োজনীয় পদক্ষেপ নিতে এটি ব্যবহার করতে পারে। উদাহরণস্বরূপ, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED নির্দেশ করে যে সংশ্লিষ্ট CarVolumeGroups সর্বোচ্চ ভলিউম বৃদ্ধির সূচক পরিবর্তিত হয়েছে এবং এটি CarVolumeGroupInfo.getMaxVolumeGainIndex() ব্যবহার করে জানা যাবে।

নিম্নোক্ত সারণিতে EventType এবং CarVolumeGroupInfo মধ্যে সম্পর্ক দেখানো হয়েছে।

ইভেন্টের ধরণ গাড়ির ভলিউম গ্রুপ তথ্য
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

অতিরিক্ত তথ্য

CarVolumeGroup কেন পরিবর্তিত হয়েছে, সে সম্পর্কে অতিরিক্ত তথ্য প্রদান করে। অ্যাপগুলো এই তথ্য ব্যবহার করে ব্যবহারকারীকে কোনো পদক্ষেপ নিতে সতর্ক করতে বা অবহিত করতে পারে। উদাহরণস্বরূপ, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL একটি থার্মাল ওভারলোডের কারণে সক্রিয় ক্ষণস্থায়ী অ্যাটেন্যুয়েশন নির্দেশ করে। ব্যবহারকারী যদি ভলিউম বাড়ানোর চেষ্টা করেন, তবে অ্যাপটি তাকে জানাতে পারে।

আমরা ExtraInfos জন্য কোনো প্রক্রিয়া বাধ্যতামূলক করি না। ExtraInfos উপর ভিত্তি করে প্রক্রিয়াটি নির্ধারণ করা আপনার বিবেচনার উপর নির্ভর করে। উদাহরণস্বরূপ, যদি EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED এর কারণে অ্যাটেনুয়েশন সক্রিয় থাকে, তাহলে ব্যবহারকারীকে ভলিউম পরিবর্তন করা থেকে বিরত রাখতে আপনি প্রাথমিকভাবে ভলিউম বারের UI ফেড করার বিকল্পও বেছে নিতে পারেন। অন্যরা ডাকিং সক্রিয় থাকার বিষয়ে একটি টোস্ট দেখিয়ে ব্যবহারকারীকে ভলিউম পরিবর্তন করার সুযোগ দেওয়ার বিকল্প বেছে নিতে পারেন।

গাড়ির অডিও ফ্রেমওয়ার্কটি প্রস্তাবিত ExtraInfos সরবরাহ করার জন্য AudioControl HAL IAudioGainCallback উপর নির্ভর করে। আরও জানতে, Audio Gain Callback দেখুন।

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

গাড়ির ভলিউম গ্রুপ ইভেন্ট কলব্যাক

অ্যান্ড্রয়েড ১৪, প্রিভিলেজড এবং প্ল্যাটফর্ম অ্যাপগুলোকে CarVolumeGroupEvents এর জন্য রেজিস্টার করতে এবং বিজ্ঞপ্তি পেতে একটি নতুন কলব্যাক প্রদান করে।

  • কলব্যাকের জন্য নিবন্ধন করতে CarAudioManager#registerCarVolumeGroupEventCallback() ব্যবহার করুন।

  • কলব্যাকটি অনিবন্ধিত করতে, CarAudioManager#unregisterCarVolumeGroupEventCallback() ব্যবহার করুন।

যদি কোনো অ্যাপ নতুন CarVolumeGroupEventCallback এবং পুরোনো CarVolumeCallback সাথে রেজিস্টার করে, তাহলে CarVolumeGroupEventCallbacks ইভেন্টগুলোকে অগ্রাধিকার দেওয়া হয়। কার অডিও স্ট্যাক এখন আর CarVolumeCallback ট্রিগার করে না। এর ফলে একই ইভেন্টের জন্য একই অ্যাপে একাধিকবার ট্রিগার হওয়া প্রতিরোধ করা যায়।

গ্রুপ ভলিউম ও মিউট পরিবর্তন ব্যবস্থাপনার জন্য আমরা আপনাকে CarVolumeGroupEventCallback ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করছি।

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

অ্যান্ড্রয়েড ১৩ থেকে, গাড়ির অডিও সিস্টেমে পরিবর্তনের কারণে ভলিউম লেভেলের আপডেট পরিচালনা করার জন্য AudioControl HAL একটি অ্যাসিঙ্ক্রোনাস কলব্যাক ট্রিগার করতে পারে।

এইচএএল এপিআই

অডিওকন্ট্রোল @২.০ এআইডিএল

AudioControl AIDL HAL-এর ২.০ সংস্করণে নিম্নলিখিত API-টি যোগ করা হয়েছে:

এপিআই উদ্দেশ্য
IAudioControl#registerGainCallback AudioControl HAL-এর সাথে IAudioGainCallback এর একটি ইনস্ট্যান্স নিবন্ধন করে।
IAudioGainCallback#onAudioDeviceGainsChanged অডিও গেইন কনফিগারেশনে পরিবর্তন জানানোর জন্য অ্যাসিঙ্ক্রোনাস কলব্যাক।

AudioControl HAL কলব্যাকে কারণসমূহের তালিকা এবং সংশ্লিষ্ট AudioGainConfigInfo অন্তর্ভুক্ত থাকে, যা নিম্নলিখিত বিষয়গুলো নিয়ে গঠিত:

  • জোন আইডি
  • ডিভাইস পোর্ট ঠিকানা
  • ভলিউম ইনডেক্স একটি রেস্ট্রিকটেড ইনডেক্স অথবা একটি আপডেট ইনডেক্স হতে পারে।

কারণগুলোকে প্রধানত নিম্নোক্তভাবে শ্রেণীবদ্ধ করা যায়:

  • সীমাবদ্ধতার কারণ। ভলিউম এবং মিউট আচরণের ক্ষণস্থায়ী পরিবর্তন।
  • আপডেটের কারণ। ভলিউমের আচরণে স্থায়ী পরিবর্তন।

সীমাবদ্ধতার প্রকারভেদ

AudioControl HAL AIDL V3 অনুযায়ী, নিম্নলিখিত ধরনের বিধিনিষেধগুলো সমর্থিত:

  • মূক
  • ব্লকিং
  • সীমাবদ্ধতা
  • ক্ষয়
সক্রিয় সীমাবদ্ধতা ব্যবহারকারীর দ্বারা ভলিউম পরিবর্তন ব্যবহারকারী-চালিত মিউট টগল
মূক ❌ (আনমিউট)

✔ (নিঃশব্দ)
ব্লকিং
সীমাবদ্ধতা ❌ (সীমার অতিরিক্ত)

✔ (সীমার নিচে)
ক্ষয়

বিধিনিষেধের অগ্রাধিকার হলো নিঃশব্দ করা > বাধা দেওয়া > সীমাবদ্ধতা > হ্রাস।

নীরব বিধিনিষেধ

নীরবতার সীমাবদ্ধতাগুলো হলো:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

গাড়ির অডিও ফ্রেমওয়ার্ক অভ্যন্তরীণভাবে এই দুটি মিউট অবস্থা বজায় রাখে:

  • ব্যবহারকারী দ্বারা নিঃশব্দকরণ। ব্যবহারকারীর অনুরোধের ভিত্তিতে, CarAudioManager অথবা কী ইভেন্টের মাধ্যমে এটি চালু বা বন্ধ করা যায়।

  • HAL মিউট। AudioGain কলব্যাকের মাধ্যমে প্রাপ্ত মিউট সীমাবদ্ধতার উপর ভিত্তি করে এটি টগল করা হয়।

সেটিংস অ্যাপের মতো লিসেনারদের কাছে, ভলিউম-গ্রুপের সামগ্রিক মিউট ( CarVolumeGroupInfo.isMuted() ) অবস্থাটি নির্ভর করবে উপরের মিউটগুলোর কোনোটি সক্রিয় আছে কি না তার উপর।

যখন HAL মিউট সক্রিয় করা হয়, তখন এই নিষেধাজ্ঞার সময়কাল পর্যন্ত ভলিউম পরিবর্তন এবং গ্রুপ আনমিউটের সমস্ত আগত অনুরোধ উপেক্ষা করা হয়।

ইন্টারঅ্যাকশন কেস: HAL মিউট সক্রিয় আছে এবং ব্যবহারকারী মিউট টগল করার জন্য অনুরোধ করেন।

যখন HAL মিউট সক্রিয় থাকে এবং ইউজার মিউট নিষ্ক্রিয় থাকে:

  • ভলিউম গ্রুপের সামগ্রিক মিউট অবস্থা true -তে পরিবর্তন করা হয়েছে।
  • মিউট চালু করার জন্য ব্যবহারকারীর অনুরোধগুলো প্রক্রিয়া করা হবে।
    • কারণ: ব্যবহারকারীর গোপনীয়তা রক্ষার স্বার্থে তাকে মিউট করার অনুরোধ সর্বদা মেনে চলা উচিত।

যখন HAL মিউট এবং ইউজার মিউট উভয়ই সক্রিয় থাকে:

  • ভলিউম গ্রুপের সামগ্রিক মিউট অবস্থা true -তে পরিবর্তন করা হয়েছে।

  • মিউট নিষ্ক্রিয় করার জন্য ব্যবহারকারীর অনুরোধ প্রক্রিয়া করা হবে NOT । ব্যবহারকারীর ক্যাশ করা মিউট অবস্থা সক্রিয় থাকবে।

    • কারণ: ব্যবহারকারীর আনমিউট করার অনুরোধ কেবল তখনই গ্রহণ করা হবে, যখন কোনো সক্রিয় নিষেধাজ্ঞা থাকবে না।

    • কারণ: ক্যাশে থাকা ইউজার মিউট আন-মিউট করলে অনাকাঙ্ক্ষিত শব্দ বিস্ফোরণ ঘটতে পারে এবং তা ব্যবহারকারীর নিরাপত্তাকে বিপন্ন করতে পারে। এটি বিশেষভাবে সত্য যদি ইগনিশন চক্র জুড়ে মিউট অবস্থা সক্রিয় থাকে, যা শব্দের মাত্রা উপলব্ধির ক্ষেত্রে ব্যবহারকারীর সচেতনতা কমিয়ে দেয়।

ইন্টারঅ্যাকশন কেস: HAL মিউট সক্রিয় এবং নিষ্ক্রিয় করা হয়েছে, কিন্তু ইউজার মিউটে কোনো পরিবর্তন হয়নি।

HAL মিউট টগল করলে ভলিউম-গ্রুপের সামগ্রিক মিউট অবস্থা পরিবর্তিত হবে। তবে, এটি সরাসরি ইউজার মিউট অবস্থা আপডেট করে না। যখন ইউজার মিউট নিষ্ক্রিয় থাকে এবং সক্রিয় করার জন্য HAL মিউট কলব্যাক পাওয়া যায়:

  • ভলিউম গ্রুপের সামগ্রিক মিউট অবস্থা true -তে পরিবর্তন করা হয়েছে।
  • HAL মিউট চালু থাকা অবস্থায় ব্যবহারকারীর ভলিউম পরিবর্তনের অনুরোধ প্রক্রিয়া করা হবে NOT

    • কারণ: মিউট চালু থাকা অবস্থায় ব্যবহারকারী শব্দ শুনতে পান না। ভলিউম পরিবর্তনের অনুমতি দিলে শব্দ বিস্ফোরণ ঘটতে পারে এবং তা ব্যবহারকারীর নিরাপত্তাকে বিপন্ন করতে পারে।

    • কারণ: যদি OEM-এর পক্ষ থেকে এটিই প্রত্যাশিত আচরণ হয়, তবে ভলিউম অ্যাপগুলো ব্যবহারকারীর হস্তক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে কলব্যাকের জন্য রেজিস্টার করতে এবং আনমিউট চালু করতে পারে (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..))।

যখন ইউজার মিউট নিষ্ক্রিয় থাকা অবস্থায় এইচএএল মিউটও নিষ্ক্রিয় থাকে:

  • ভলিউম গ্রুপের মিউট অবস্থা false -এ পরিবর্তন করা হয়েছে।

    কারণ: মিউট অবস্থা স্থায়ী করে দেওয়া এবং ব্যবহারকারীকে আন-মিউট করতে অনুরোধ করা, যখন মিউট অবস্থা ঘন ঘন পরিবর্তিত হয়, তখন তা ব্যবহারকারীর কাজে অপ্রয়োজনীয়ভাবে ব্যাঘাত ঘটাতে পারে।

  • ব্যবহারকারীদের ভলিউম পরিবর্তনের অনুরোধ স্বাভাবিকভাবে প্রক্রিয়াজাত করা হবে।

ব্লকিং

ব্লক করার বিধিনিষেধগুলো হলো:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE

যখন ব্লকিং বিধিনিষেধ সক্রিয় থাকে, তখন ব্যবহারকারীদের কাছ থেকে আসা অনুরোধগুলি:

  • ভলিউম পরিবর্তনের অনুরোধ প্রক্রিয়া করা হবে না
  • মিউট টগল প্রক্রিয়া সম্পন্ন করা হয়।

সীমাবদ্ধতা

সীমাবদ্ধতাগুলো হলো:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

যখন সীমাবদ্ধতার বিধিনিষেধ সক্রিয় থাকে, তখন ব্যবহারকারীদের কাছ থেকে নিম্নলিখিত অনুরোধগুলি করা হয়:

  • ভলিউম পরিবর্তন করুন:

    • সীমাবদ্ধতার মধ্যে প্রক্রিয়াজাত করা হয়
    • উপরের সীমাগুলি প্রক্রিয়া করা হয় না।
  • মিউট টগল প্রক্রিয়া সম্পন্ন করা হয়।

ক্ষয়

অ্যাটেনুয়েশন সীমাবদ্ধতাগুলো হলো:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

যখন অ্যাটেনুয়েশন বিধিনিষেধ সক্রিয় থাকে, তখন ব্যবহারকারীদের কাছ থেকে নিম্নলিখিত অনুরোধগুলি করা হয়:

  • ভলিউম পরিবর্তনের প্রক্রিয়া সম্পন্ন হয়েছে। নতুন বর্তমান ভলিউম স্তরটি পূর্বের ভলিউমের পরিবর্তে হ্রাসকৃত ভলিউমে সেট করা হয়। ভবিষ্যতের ভলিউম পরিবর্তন এই স্তর থেকেই করা হবে।

  • মিউট টগল করার প্রক্রিয়া সম্পন্ন হয়েছে।

সূচীতে আপডেট করুন

নিম্নলিখিতটিকে অ্যাসিঙ্ক্রোনাস ভলিউম ইনডেক্স আপডেট হিসেবে বিবেচনা করা হয়: Reasons.EXTERNAL_AMP_VOL_FEEDBACK

এই কারণে, AudioControl HAL ভলিউম গ্রুপের বর্তমান ইনডেক্সকে নির্দিষ্ট ইনডেক্সে আপডেট করতে পারে। এটি মূলত কার অডিও ফ্রেমওয়ার্ক থেকে আসা ভলিউম পরিবর্তনের অনুরোধের জন্য অডিও সিস্টেমের পক্ষ থেকে ফিডব্যাক হিসেবে ব্যবহৃত হয়। ইনডেক্স সিঙ্ক্রোনাইজ করার জন্য এই ইনডেক্স আপডেটের বিষয়টি একটি CarVolumeGroupEvent কলব্যাক হিসেবে অ্যাপস-এর সাথেও যোগাযোগ করা হয়।

উদাহরণ

ব্যবহারের ক্ষেত্র: ব্যবহারকারী ভলিউম ইনডেক্স ৩০-এ আপডেট করেন।

  • ব্যবহারকারী ভলিউম অ্যাপ ব্যবহার করে ভলিউম ইনডেক্স ৩০-এ পরিবর্তন করেন।

  • এই সূচকটিকে ভলিউম গেইনে রূপান্তরিত করে Audio HAL-এ পাঠানো হয়।

  • Audio HAL এর ভেন্ডর ইমপ্লিমেন্টেশনগুলো নতুন ভলিউম গেইন গ্রহণ করে এবং অডিও সিস্টেমকে (যেমন এক্সটার্নাল অ্যাম্প) আপডেট করে।

  • অডিও সিস্টেম জানাচ্ছে যে, ভলিউম লেভেল শুধুমাত্র ১৫ নম্বর ইনডেক্স পর্যন্ত আপডেট করা হয়েছে (অ্যান্ড্রয়েডের কাছে অজানা কারণে)।

  • AudioControl HAL ট্রিগারের বিক্রেতা-প্রবর্তনসমূহ:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • গাড়ির অডিও পরিষেবা ডেটা সংরক্ষণ এবং ভলিউম অ্যাপে কলব্যাকের জন্য ব্যবহৃত কলব্যাক থেকে নতুন ইনডেক্সটি গ্রহণ করে। ব্যবহারকারীর অনুরোধ করা ইনডেক্সটি হলো ৩০। তবে, অডিও সিস্টেমের অ্যাসিঙ্ক্রোনাস ফিডব্যাক ইনডেক্সটিকে ১৫-তে আপডেট করে দেয়।

ব্যবহারের ক্ষেত্র: সাসপেন্ড থেকে বের হওয়ার পর প্রথম অডিও প্লেব্যাক।

  • সাসপেন্ড করার আগে ভলিউম ইনডেক্স ৯৫-এর উচ্চ স্তরে সেট করা হয়েছে (পরিসর: [০-৯৯])।

  • অ্যান্ড্রয়েড সাসপেন্ড অবস্থায় প্রবেশ করে।

  • একবার অ্যান্ড্রয়েড থেকে বেরিয়ে গেলে সাসপেন্ড করুন (উদাহরণস্বরূপ, রিজুম করুন):

    • ভেন্ডর Audio HAL/AudioControl HAL স্থানীয়ভাবে অডিও সিস্টেমে ৩০-এর একটি নিরাপদ সূচক প্রয়োগ করে।

    • ভেন্ডর AudioControl HAL সেফ ইনডেক্সের জন্য কলব্যাকটিও ট্রিগার করে:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • গাড়ির অডিও পরিষেবাটি একটি কলব্যাক থেকে নতুন ইনডেক্স গ্রহণ করে, যা ডেটা সংরক্ষণের জন্য এবং ইনডেক্স সিঙ্ক্রোনাইজ করার জন্য ভলিউম অ্যাপে নিজস্ব কলব্যাক পাঠানোর কাজে ব্যবহৃত হয়। সাসপেন্ড করার আগে ভলিউম ইনডেক্স থাকে ৯৫। তবে, রিজুম করার পরে, AudioControl HAL ইমপ্লিমেন্টর এই ইনডেক্সটিকে ৩০-এর একটি নিরাপদ ভলিউম লেভেলে সেট করে দেয়।

ডায়নামিক ভলিউম কনফিগারেশন

এই ফিচারের জন্য আমরা নিম্নলিখিত প্রধান ব্যবহারের ক্ষেত্রগুলো বিবেচনা করি:

  1. যানবাহনের শেষ-পর্যায়ের (EOL) কনফিগারেশন।

    • গাড়ি নির্মাতারা গাড়ির অডিও সিস্টেম সেটআপের উপর ভিত্তি করে EOL (এন্ড অফ লাইফ)-এ ভলিউম কনফিগারেশন আপডেট করতে পছন্দ করেন। সাধারণত, এটি অ্যান্ড্রয়েড সফটওয়্যার ইমেজ আপডেট না করেই একটি সাইডলোড হিসেবে করা হয়।

    • সার্ভিস শিডিউল চলাকালীন গাড়ি প্রস্তুতকারকদের ভলিউম কনফিগারেশন আপডেট করার প্রয়োজন হতে পারে।

  2. রানটাইম কনফিগারেশন। অটোমোটিভ অডিও সিস্টেমগুলো এক্সটার্নাল অ্যামপ্লিফায়ার কনফিগারেশন সমর্থন করে এবং এই ECU-গুলো ভলিউম রেঞ্জের কনফিগারেশন ধারণ করতে পারে, যা বুট টাইমের সময় কোয়েরি করা হয়।

  3. চাহিদা-ভিত্তিক কনফিগারেশন। চাহিদা-ভিত্তিক অডিও ফিচারের ক্রমবর্ধমান প্রয়োজন মেটাতে এটি প্রদান করা হয়, যেখানে ব্যবহারকারীরা একটি নির্দিষ্ট সময়ের জন্য উন্নত সিগন্যাল প্রসেসিংয়ের সাবস্ক্রিপশন নেন। নতুন ভলিউম রেঞ্জ কনফিগারেশনগুলো সাবস্ক্রিপশনের পুরো সময়কাল জুড়ে কার্যকর থাকবে।

ডিজাইন

ডায়নামিক ভলিউম কনফিগারেশন তিনটি পর্যায়ে সম্পন্ন করা হয়:

  • আবিষ্কার। ভেন্ডরের AudioControl HAL ইমপ্লিমেন্টেশনটি ভেন্ডরের নিজস্ব একটি কাস্টম IPC মেকানিজমের মাধ্যমে নতুন ভলিউম রেঞ্জ আপডেটগুলো আবিষ্কার করে।

    একবার শনাক্ত হলে, AudioControl::IModuleChangeCallback এর মাধ্যমে একটি কলব্যাক তৈরি হয়।

  • আপডেট। গাড়ির অডিও স্ট্যাকটি নতুন ভলিউম রেঞ্জ অনুযায়ী ভলিউম গ্রুপের অবস্থা আপডেট করে।

    ভলিউম রেঞ্জ আপডেটের পরেও ভলিউমের মাত্রা একই রাখার চেষ্টা করা হয়। তবে, যদি ইনডেক্সটি সীমার বাইরে চলে যায়, তাহলে বর্তমান ভলিউম ইনডেক্সকে একটি নিরাপদ মানে সেট করা হয়। উদাহরণস্বরূপ, কলব্যাকের সময় ভেন্ডরের দেওয়া ডিফল্ট লেভেল।

  • কলব্যাক।

    • ভলিউম গ্রুপ রেঞ্জ আপডেট হওয়ার পর, গাড়ির অডিও স্ট্যাক CarVolumeGroupEventCallback এর মাধ্যমে রেজিস্টার করা অ্যাপগুলিতে একটি কলব্যাক ট্রিগার করে।

    • CarVolumeGroupEvent হালনাগাদকৃত CarVolumeGroupInfo , Event-type (কী পরিবর্তিত হয়েছে) এবং Extra-info (কেন পরিবর্তিত হয়েছে) থাকে।

ছবি

চিত্র ২. ডাইনামিক ভলিউম কনফিগারেশন।

এইচএএল এপিআই

অডিওকন্ট্রোল @ 3.0 AIDL

AudioControl AIDL HAL-এর ৩.০ সংস্করণে নিম্নলিখিত API-গুলো অন্তর্ভুক্ত করা হয়েছে:

এপিআই
IAudioControl#setModuleChangeCallback AudioControl HAL সহ IModuleChangeCallback-এর একটি ইনস্ট্যান্স সেট করে।
IAudioControl#clearModuleChangeCallback AudioControl HAL-এর মাধ্যমে পূর্বে সেট করা IModuleChangeCallback-এর ইনস্ট্যান্সটি মুছে ফেলে।
IModuleChangeCallback#onAudioPortsChanged অডিওপোর্টগুলিতে পরিবর্তন সম্পর্কে অবহিত করার জন্য কলব্যাক

ক্রম

ডায়নামিক ভলিউম কনফিগারেশনের সিকোয়েন্স ডায়াগ্রামটি নিচে দেখানো হলো।

ছবি

চিত্র ৩. ডায়নামিক ভলিউম কনফিগারেশনের সিকোয়েন্স ডায়াগ্রাম।

মূল দিকগুলি

এই ফিচারটি অপ্টিমাইজ করতে নিম্নলিখিত বিষয়গুলো বিবেচনা করুন।

  • কলব্যাকের অংশ হিসেবে সরবরাহ করা অডিওপোর্টগুলো অবশ্যই অটোমোটিভ বাস সংজ্ঞার সাথে মিলতে হবে:

    • ডিভাইস পোর্ট। IN_DEVICE , OUT_DEVICE
    • সংযোগ। BUS
    • ঠিকানা। অডিও এইচএএল সংজ্ঞায় সংজ্ঞায়িত।
    • গেইন মোড। JOINT
  • বিক্রেতাদের অবশ্যই অডিও HAL পলিসিতে ভলিউম রেঞ্জ সংজ্ঞার একটি সুপারসেট নির্ধারণ করতে হবে এবং গাড়ির বিভিন্ন সংস্করণের জন্য এটিকে কাস্টমাইজ করতে কলব্যাক ব্যবহার করতে হবে। আরও তথ্যের জন্য IModuleChangeCallbac AIDL সংজ্ঞাটি দেখুন।

  • যখন একাধিক অডিও বাস (BUS) একই ভলিউম গ্রুপের অন্তর্ভুক্ত থাকে, তখন প্রত্যেকটির ভলিউম রেঞ্জের সংজ্ঞা অবশ্যই অভিন্ন হতে হবে। তা করতে ব্যর্থ হলে গাড়ির অডিও ফ্রেমওয়ার্ক নতুন ভলিউম রেঞ্জের সংজ্ঞাটি প্রত্যাখ্যান করে।