অডিও রাউটিং

Android 10-এ car_audio_configuration.xml car_volumes_groups.xml এবং IAudioControl.getBusForContext প্রতিস্থাপন করে। নতুন কনফিগারেশন ফাইলে, অঞ্চলগুলির একটি তালিকা সংজ্ঞায়িত করা হয়েছে। প্রতিটি জোনে তাদের সংশ্লিষ্ট ডিভাইসের সাথে এক বা একাধিক ভলিউম গ্রুপ রয়েছে এবং প্রতিটি ডিভাইসের প্রসঙ্গ রয়েছে যা সেই জোনের মধ্যে রাউট করা উচিত। এটি প্রয়োজনীয় যে সমস্ত প্রসঙ্গ প্রতিটি জোনের মধ্যে উপস্থাপন করা হয়।

অডিও রাউটিং কনফিগার করা হচ্ছে

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

AAOS রাউটিং সক্ষম করা হচ্ছে

AAOS-ভিত্তিক রাউটিং ব্যবহার করতে, আপনাকে অবশ্যই audioUseDynamicRouting ফ্ল্যাগ true সেট করতে হবে:

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

false হলে, রাউটিং এবং CarAudioService এর অনেক অংশ অক্ষম করা হবে এবং OS AudioService ডিফল্ট আচরণে ফিরে আসবে।

প্রাথমিক অঞ্চল

ডিফল্টরূপে, সমস্ত অডিও প্রাথমিক জোনে রাউট করা হবে। শুধুমাত্র একটি প্রাথমিক অঞ্চল থাকতে পারে, যা isPrimary="true" বৈশিষ্ট্য দ্বারা কনফিগারেশনে নির্দেশিত হয়।

নমুনা কনফিগারেশন

উদাহরণস্বরূপ, একটি গাড়ির দুটি জোন থাকতে পারে - একটি প্রাথমিক জোন এবং একটি পিছনের আসন বিনোদন ব্যবস্থা। এর সাথে, একটি সম্ভাব্য car_audio_configuration.xml নিম্নরূপ সংজ্ঞায়িত করা হবে:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

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

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

অকুপ্যান্ট জোন অডিও কনফিগারেশন

Android 11-এ car_audio_configuration.xml দুটি নতুন ক্ষেত্র, audioZoneId এবং occupantZoneId প্রবর্তনের জন্য আরও প্রসারিত করা হয়েছিল। প্রথম, audioZoneId জোন ব্যবস্থাপনাকে আরও ভালভাবে নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে। অন্যদিকে, ব্যবহারকারী আইডি-ভিত্তিক রাউটিং কনফিগার করতে occupantZoneId ব্যবহার করা যেতে পারে।

এই নতুন ক্ষেত্রগুলি ব্যবহার করতে, car_audio_configuration.xml এর V2 প্রয়োজন৷ উপরের অডিও কনফিগারেশনটি পুনরালোচনা করা কিন্তু অকুপ্যান্ট জোন আইডি এবং অডিও জোন আইডি ম্যাপিংয়ের জন্য নতুন ক্ষেত্র ব্যবহার করে, ভলিউম গ্রুপ সংজ্ঞা ছাড়াই নতুন কনফিগারেশনটি এইভাবে সেটআপ করা যেতে পারে:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

উপরের কনফিগারেশনটি প্রাইমারি জোন থেকে অকুপ্যান্ট জোন 0 এবং audioZoneId 1 থেকে occupantZoneId 1-এর জন্য একটি ম্যাপিং সংজ্ঞায়িত করে৷ সাধারণভাবে অকুপ্যান্ট জোন এবং অডিও জোনের মধ্যে যে কোনও ম্যাপিং কনফিগার করা যেতে পারে তবে ম্যাপিং অবশ্যই ওয়ান টু ওয়ান হতে হবে৷ দুটি নতুন ক্ষেত্র সংজ্ঞায়িত করার নিয়মগুলি এখানে রয়েছে:

  • প্রাথমিক জোনের জন্য audioZoneId সর্বদা শূন্য
  • audioZoneId এবং occupantZoneId সংখ্যা পুনরাবৃত্তি করা যাবে না
  • audioZoneId এবং occupantZoneId শুধুমাত্র এক থেকে এক ম্যাপিং থাকতে পারে

একটি অ্যাপ্লিকেশন UID মাধ্যমে রাউটিং

অ্যাপগুলিকে ক্যোয়ারী করতে এবং অডিও জোন সেট করতে এবং ফোকাস করার অনুমতি দেওয়ার জন্য 10 সালে গোপন APIগুলির একটি সিরিজ CarAudioManager এ চালু করা হয়েছিল।

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

উপরের APIগুলি একটি অ্যাপ্লিকেশনের UID এর উপর ভিত্তি করে অডিও রাউটিং পরিচালনা করার জন্য একটি প্রথম পক্ষের অ্যাপ্লিকেশনকে অনুমতি দেয়৷ যেমন, অডিও জোন আইডি এবং অ্যাপ্লিকেশনের ইউআইডি উভয়ই প্রয়োজন। সেই তথ্য হাতে নিয়ে, CarAudioManager#setZoneIdForUid API ব্যবহার করে অডিও রাউটিং সেট করা যেতে পারে।

একটি অ্যাপের জন্য জোন পরিবর্তন করা হচ্ছে

ডিফল্টরূপে, প্রাথমিক জোনে সমস্ত অডিও রুট। একটি ভিন্ন জোনে রাউট করার জন্য একটি অ্যাপ্লিকেশন আপডেট করতে, CarAudioManager#setZoneIdForUid ব্যবহার করুন:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

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

ইউজার আইডি দিয়ে রাউটিং

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

অ্যাপ্লিকেশন UID-ভিত্তিক রাউটিং এখনও ব্যবহার করা যেতে পারে কিন্তু ব্যবহারকারী আইডি রাউটিং স্বাধীনভাবে করা আবশ্যক। এর মানে হল যে যদি অকুপ্যান্ট জোন থেকে কার অডিও জোন ম্যাপিং সংজ্ঞায়িত করা হয়, তাহলে UID-ভিত্তিক রাউটিং অক্ষম করা হয় এবং CarAudioManager#setZoneidForUid কল করার চেষ্টা করলে একটি ত্রুটি হবে।

অডিও রাউটিং এবং ফোকাস ম্যানেজমেন্টকে অকুপ্যান্ট জোন ম্যানেজমেন্টের মাধ্যমে সরলীকৃত করা হয়েছে, তবুও ব্যবহারকারীকে অবশ্যই একটি অকুপ্যান্ট জোনে বরাদ্দ করতে হবে। এটি CarOccupantZoneManager#assignProfileUserToOccupantZone ব্যবহার করে করা যেতে পারে। এই API ব্যবহারকারীদের পরিচালনা করার অনুমতি প্রয়োজন. বর্তমান প্রত্যাশা হল OEM-এর জন্য কোনো ধরনের সিস্টেম UI এর মাধ্যমে ব্যবহারকারী থেকে দখলকারী জোন অ্যাসাইনমেন্ট পরিচালনা করা। এটি হয়ে গেলে অ্যাপ্লিকেশন লঞ্চ, অডিও রাউটিং, ফোকাস ম্যানেজমেন্ট সবই স্বয়ংক্রিয়ভাবে ব্যবহারকারীর জন্য কনফিগার হয়ে যাবে।

setPreferredDevice সহ রাউটিং

উপরের পরিবর্তনগুলির সাথে, Android 11-এ প্রতিটি জোনের সাথে যুক্ত আউটপুট ডিভাইসগুলিকে জিজ্ঞাসা করার জন্য একটি নতুন API রয়েছে, CarAudioManager#getOutputDeviceForUsage(int zoneId, int ব্যবহার)।

API একটি নির্দিষ্ট অঞ্চল এবং একটি অডিও বৈশিষ্ট্য ব্যবহারের জন্য একটি আউটপুট ডিভাইস অনুসন্ধান করতে ব্যবহার করা যেতে পারে। এই পদ্ধতিতে প্রথম পক্ষের অ্যাপ্লিকেশনগুলি প্লেয়ারের setPreferredDevice API ব্যবহার করে অডিওকে বিভিন্ন অঞ্চলে রুট করতে পারে। getOutputDeviceForUsage API-এর জন্য PERMISSION_CAR_CONTROL_AUDIO_SETTINGS প্রয়োজন এবং এটি একটি সিস্টেম API। নীচে একটি নির্দিষ্ট অঞ্চলের জন্য মিডিয়া ডিভাইস খুঁজে বের করার এবং setPreferredDevice API ব্যবহার করে সেই ডিভাইসে রাউটিং করার একটি উদাহরণ রয়েছে।

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);