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

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

স্থির ভলিউম ব্যবহার করে

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

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

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

ভলিউম গ্রুপ

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

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

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

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <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>
        </zone>
     </zones>
</audioZoneConfiguration>

উদাহরণ car_audio_configuration.xml বাস্তবায়ন।

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

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

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

Android ভলিউম নিয়ন্ত্রণের জন্য 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 এ সংজ্ঞায়িত একটি নির্দিষ্ট ক্রম অনুসারে অগ্রাধিকার নির্ধারণ করা হয়।

বিবর্ণ এবং ভারসাম্য

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

অডিও কন্ট্রোল এপিআইগুলি হল:

  • setBalanceTowardRight(float value) । গাড়ির ডানদিকে (+) বা বাম (-) দিকে স্পিকারের ভলিউম স্থানান্তর করে। 0.0 কেন্দ্রীভূত, +1.0 সম্পূর্ণ ডান, -1.0 সম্পূর্ণ বাম, এবং -1 থেকে 1-এর বাইরের একটি মান একটি ত্রুটি।
  • setFadeTowardFront(float value) - গাড়ির সামনের (+) বা পিছনে (-) দিকে স্পিকারের ভলিউম স্থানান্তর করে। 0.0 কেন্দ্রীভূত, +1.0 সম্পূর্ণভাবে এগিয়ে, -1.0 সম্পূর্ণরূপে পিছনের দিকে, এবং -1 থেকে 1 সীমার বাইরে একটি মান একটি ত্রুটি৷

এই মানগুলি কীভাবে প্রয়োগ করা উচিত এবং কীভাবে সেগুলি ব্যবহারকারীদের কাছে প্রকাশ করা হবে তা নির্ধারণ করা OEM-এর উপর নির্ভর করে৷ এগুলি মিডিয়াতে বা বোর্ড জুড়ে সমস্ত অ্যান্ড্রয়েড সাউন্ডে কঠোরভাবে প্রয়োগ করা যেতে পারে।

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

অডিও হাঁস

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

কখন হাঁস

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

মনে রাখবেন যে Android দ্বারা একসাথে মিশ্রিত যেকোন স্ট্রীমগুলি কোনও লাভ প্রয়োগ করার আগে তাই করা হবে৷ যেমন, যেকোন স্ট্রীম যা অন্যের সাথে একযোগে খেলার সময় হাঁস করা উচিত তাকে আলাদা আউটপুট ডিভাইসে রুট করা উচিত যাতে HAL তাদের একসাথে মিশ্রিত করার আগে হাঁস প্রয়োগ করতে পারে।

প্রস্তাবিত হাঁস আচরণ

নিম্নলিখিত সম্ভাব্য সমসাময়িক মিথস্ক্রিয়া যেখানে আমরা হাঁস প্রয়োগ করার পরামর্শ দিই:

  • EMERGENCY ড্রাইভার শব্দ শুনতে পায় তা নিশ্চিত করার জন্য SAFETY ছাড়া সবকিছু হাঁস বা নিঃশব্দ করুন
  • SAFETY ড্রাইভার শব্দ শুনেছে তা নিশ্চিত করার জন্য EMERGENCY বাদে সবকিছু হাঁস
  • NAVIGATION SAFETY এবং EMERGENCY ছাড়া সবকিছু হাঁস
  • CALLSAFETY , EMERGENCY , এবং NAVIGATION ছাড়া সবকিছু হাঁস
  • VOICE হাঁস CALL_RING
  • সক্রিয় VEHICLE_SOUNDS এর গুরুত্ব নির্ধারণ করা এবং ড্রাইভার সেগুলি শুনতে পাচ্ছে কিনা তা নিশ্চিত করার জন্য তাদের অন্য শব্দগুলি ডাকা উচিত কিনা তা নির্ধারণ করা OEMগুলির উপর নির্ভর করে৷
  • MUSIC এবং ANNOUNCEMENT সবকিছু দ্বারা duck করা উচিত. এর প্রধান ব্যতিক্রম হল টাচ ইন্টারঅ্যাকশন টোন যা বর্তমানে SYSTEM_SOUND হিসাবে বাজানো হয়

হাঁস পালন করার সময় অন্যান্য বিবেচনা

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

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

নিরাপত্তা সমালোচনামূলক শব্দ

যদিও Android 11 HAL অডিও ফোকাস APIs চালু করেছে, এটি এখনও HAL-এর উপর নির্ভর করছে নিরাপত্তার সমালোচনামূলক শব্দগুলিকে অন্যদের তুলনায় অগ্রাধিকার দেওয়া হয়েছে। এমনকি যদি HAL-এর কাছে USAGE_EMERGENCY এর জন্য অডিও ফোকাস থাকে, তবে এটি গ্যারান্টি দেয় না যে Android-এর মধ্যে থাকা অ্যাপ এবং পরিষেবাগুলি সাউন্ড বাজবে না৷ নিরাপত্তা সংক্রান্ত সমালোচনামূলক শব্দ বাজানোর কারণে অ্যান্ড্রয়েড থেকে কোন স্ট্রিমগুলি মিশ্রিত বা নিঃশব্দ করা উচিত তা নির্ধারণ করা HAL-এর উপর নির্ভর করে।

ভলিউম সেটিংস UI কনফিগার করা হচ্ছে

AAOS ভলিউম গ্রুপ কনফিগারেশন থেকে ভলিউম সেটিংস UI ডিকপল করে (যা ভলিউম গ্রুপ কনফিগারিং-এ বর্ণিত হিসাবে ওভারলেড করা যেতে পারে)। ভলিউম গ্রুপ কনফিগারেশন ভবিষ্যতে পরিবর্তন হলে এই বিচ্ছেদ নিশ্চিত করে যে কোনো পরিবর্তনের প্রয়োজন নেই।

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

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

<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 নিম্নলিখিত ভলিউমগ্রুপ-ভিত্তিক CarAudioManager API ব্যবহার করে:

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