মাল্টি-জোন অডিও রাউটিং

গাড়ির অডিও পরিষেবা গাড়িতে বিভিন্ন ব্যবহারের ক্ষেত্র সহজতর করতে কোর অডিও ডাইনামিক অডিও পলিসি ব্যবহার করে।

  • প্রতিটি যাত্রীর জন্য আলাদা অডিও প্লেব্যাকের ব্যবস্থা, যা মাল্টি-জোন অডিও নামে পরিচিত, যেখানে প্রতিটি জোনে একই সাথে শব্দ বাজানো যায়।

  • ডাইনামিক অডিও জোন কনফিগারেশন।

  • যাত্রীর প্রাথমিক অঞ্চলের অডিও কাস্ট।

  • যাত্রীর অডিও মিরর।

প্রতিটি ব্যবহারের ক্ষেত্রে, গাড়ির অডিও পরিষেবাটি ডাইনামিক অডিও পলিসি ব্যবহার করে স্বয়ংক্রিয়ভাবে অডিওকে নির্ধারিত আউটপুট ডিভাইসে প্রেরণ করে।

মাল্টি-জোন অডিও

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

মাল্টি-জোন অডিও আর্কিটেকচার

গাড়ির অডিও পরিষেবা স্থাপত্য

চিত্র ১. গাড়ির অডিও পরিষেবার কাঠামো।

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

গাড়ির অডিও কনফিগারেশন

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

<carAudioConfiguration version="3">
    <zones>
        <zone name="Zone0" audioZneId="0" occupantZoneId="0">
            <zoneConfigs>
                <zoneConfig name="config0" isDefault="true">
                   <volumeGoups>
                        <group>
                            <device address="bus_1">
                                <context context="music"/>
                            </device>
                        </group>
                        <group>
                            <device address="bus_2">
                                <context context="navigation"/>
                            </device>
                        </group>
                        ...
                    </volumeGroups>
                </zoneConfig>
            </zoneConfigs>
        </zone>
        <zone name="Zone1" audioZoneId="1" occupantZoneId="1">
            <zoneConfigs>
                <zoneConfig name="config0" isDefault="true">
                    <volumeGroups>
                        <group>
                            <device address="bus_6">
                                <context context="music"/>
                            </device>
                        </group>
                        <group>
                            <device address="bus_7">
                                <context context="navigation"/>
                           </device>
                       </group>
                       ...
                    </volumeGroups>
                </zoneConfig>
            </zoneConfigs>
        </zone>
        ...
    ...
   </zones>
</carAudioConfiguration>

occupantZoneId হলো একটি কার সার্ভিস ডেফিনিশন যা CarOccupantZoneManager দ্বারা পরিচালিত হয়। গাড়িতে থাকা কোনো ব্যবহারকারীকে একটি নির্দিষ্ট আসনের অবস্থানে ম্যাপ করার জন্য এটি ব্যবহৃত হয়। CarOccupantZoneService এছাড়াও অকুপ্যান্ট জোন থেকে ডিসপ্লে, অন্যান্য পেরিফেরাল এবং ব্যবহারকারী কোনো ডিসপ্লেতে লগ ইন করার পর তার সাথে ম্যাপ করার ব্যবস্থা করে। একটি অডিও জোনে রয়েছে:

  • একটি অডিও জোন আইডি এবং একটি অকুপ্যান্ট জোন আইডি।

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

    • ভলিউম পরিবর্তন করা হলে, একটি গ্রুপের সমস্ত অডিও ডিভাইস একইভাবে নিয়ন্ত্রিত হয়।

    • প্রতিটি অডিও ডিভাইসকে অডিও অ্যাট্রিবিউটের একটি তালিকা বরাদ্দ করা হয়। এই তথ্যটি ভিন্ন ভিন্ন অডিও অ্যাট্রিবিউট বরাদ্দ করে অডিও পলিসি মিক্স তৈরি করতে ব্যবহৃত হয়।

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

মাল্টি-জোন অডিও প্যাসেঞ্জার লগইন ওয়ার্কফ্লো

নিচের সিকোয়েন্স ডায়াগ্রামটি দেখায় যে, কোনো যাত্রী যখন তার নিজ নিজ ডিসপ্লেতে লগ ইন করেন, তখন অডিও রাউটিং সক্রিয় করার প্রক্রিয়াটি কীভাবে সম্পন্ন হয়:

ছবি

চিত্র ২।

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

  1. গাড়ির অডিও পরিষেবা (একটি নির্দিষ্ট অডিও জোনের জন্য) ব্যবহারকারীর ডিভাইস অ্যাফিনিটিগুলো অপসারণ করতে AudioPolicy#removeUserIdDeviceAffinity API-টি ব্যবহার করে। এই API-টি একটি ইউজার আইডি গ্রহণ করে। এক্ষেত্রে, এটি হলো পূর্ববর্তী জোনের ব্যবহারকারী।

  2. AudioPolicy#setUserIdDeviceAffinity API-টি নতুন ব্যবহারকারীকে একটি জোনে নিযুক্ত করে, যা একটি নির্দিষ্ট জোন কনফিগারেশনের জন্য ব্যবহারকারীর আইডি এবং সমস্ত ডিভাইস গ্রহণ করে।

গতিশীল অঞ্চল কনফিগারেশন

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

এক্ষেত্রে দুটি কনফিগারেশন প্রয়োজন। একটি পিছনের সিটের হেডরেস্টের জন্য এবং অন্যটি হেডফোন পেরিফেরালের জন্য। একজন নির্দিষ্ট ব্যবহারকারীর অডিও একবারে শুধুমাত্র একটি কনফিগারেশনে পাঠানো হয়।

গতিশীল জোন কনফিগারেশন ওয়ার্কফ্লো

চিত্র ৩. ডায়নামিক জোন কনফিগারেশন কার্যপ্রবাহ।

চিত্র ৩-এ ডাইনামিক জোন কনফিগারেশন ওয়ার্কফ্লো-এর আর্কিটেকচার দেখানো হয়েছে। অডিও জোন ১-এ দুটি কনফিগারেশন রয়েছে, Config 0 এবং Config 1 , যেগুলো যথাক্রমে আউটপুট ডিভাইস স্পিকার এবং হেডরেস্টের সাথে যুক্ত।

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

নিচের কোড স্নিপেটটিতে এই ডাইনামিক জোন কনফিগারেশনের সেটআপ দেখানো হয়েছে।

<carAudioConfiguration version="3">
    <zones>
        <zone name="Zone1" audioZoneId="1" occupantZoneId="1">
            <zoneConfigs>
                <zoneConfig name="Zone 1 Config 0" isDefault="true">
                    <volumeGroups>
                        <group>
                            <device address="bus_100">
                                <context context="music"/>
                                    ***
                            </device>
                        </group>
                    </volumeGroups>
                </zoneConfig>
                <zoneConfig name="Zone 1 Config 1">
                    <volumeGroups>
                        <group>
                            <device address="bus_101">
                                <context context="music"/>
                                    ***
                            </device>
                        </group>
                    </volumeGroups>
                </zoneConfig>
            </zoneConfigs>
        </zone>
    </zones>

অডিও কনফিগারেশনগুলির ব্যবস্থাপনা সহজ করার জন্য, গাড়ির অডিও ম্যানেজার কনফিগারেশনগুলি পরিচালনা করার জন্য এপিআই (API) প্রদান করে:

  • একটি জোনের জন্য উপলব্ধ কনফিগারেশনগুলো অনুসন্ধান করুন।
  • একটি জোনের জন্য বর্তমানে সেট করা কনফিগারেশন সম্পর্কে জিজ্ঞাসা করুন।
  • অন্য কনফিগারেশনে পরিবর্তন করুন।

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

গতিশীল জোন কনফিগারেশন ওয়ার্কফ্লো

চিত্র ৪. ডায়নামিক জোন কনফিগারেশন কার্যপ্রবাহ।

প্রাথমিক অঞ্চলের যাত্রীদের অডিও কাস্ট

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

নিচের চিত্রে প্রাথমিক জোনের যাত্রীদের জন্য মিডিয়া অডিও কাস্টের আর্কিটেকচারের একটি সরলীকৃত সংস্করণ দেখানো হয়েছে।

গতিশীল জোন কনফিগারেশন ওয়ার্কফ্লো

চিত্র ৫. ডায়নামিক জোন কনফিগারেশন কার্যপ্রবাহ।

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

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

AudioPolicy#setUserIdDeviceAffinity API-এর মাধ্যমে এই নতুন ডিভাইসের তালিকাটি যাত্রীকে বরাদ্দ করা হয়। API-তে পাঠানো প্যারামিটারগুলো হলো ডিভাইসের তালিকা এবং যাত্রীর ইউজার আইডি। যখন অডিও সিস্টেমের অডিও পলিসি সার্ভিস যাত্রীর সাথে যুক্ত কোনো মিডিয়া ট্র্যাকের জন্য কোন অডিও মিক্সটি নির্বাচন করা হবে তা জানতে চায়, তখন প্রাইমারি জোনের সাথে যুক্ত মিডিয়া অডিও মিক্সটি নির্বাচিত হয়।

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

যাত্রী অঞ্চলের অডিও মিরর

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

অডিও মিরর রাউটিং

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

নিচের চিত্রে দুজন যাত্রীর মধ্যে মাল্টি-জোন অডিও মিররিং-এর একটি সরলীকৃত ডায়াগ্রাম দেখানো হয়েছে। উভয় যাত্রীর অডিও একটি অডিও মিরর ডিভাইস, bus_1000 এ পাঠানো হয়। অডিও এইচএএল সিগন্যালটিকে সোর্স জোনগুলোতে প্রতিলিপি করে।

গতিশীল জোন কনফিগারেশন ওয়ার্কফ্লো

চিত্র ৬. ডায়নামিক জোন কনফিগারেশন কার্যপ্রবাহ।

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

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

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

অডিও মিরর ওয়ার্কফ্লো

চিত্র ৭. অডিও মিরর কার্যপ্রবাহ।

চিত্র ৭-এ, মিডিয়া সিস্টেম সার্ভিস থেকে অডিও মিররিং পরিচালনার জন্য কার অডিও ম্যানেজারের এপিআইগুলো কল করা হয়েছে। বিশেষত, ইউজার ১ এবং ইউজার ২-এর জন্য অডিও মিররিং চালু করার এপিআই, CarAudioManager#enableMirrorForAudioZones

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

উপরের ছবিতে, গাড়ির অডিও পরিষেবাটি mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20 পাঠাচ্ছে।

যেখানে,

bus_1000 হলো উৎস বাস এবং bus_10bus_20 হলো গন্তব্য বাস।

সিকোয়েন্স ডায়াগ্রামে AudioManager#setParameters API-এর মাধ্যমে প্রেরিত সিগন্যালটি দেখানো হয়নি, যা অডিও সার্ভিসের মাধ্যমে HAL-এ পৌঁছায়।

অডিও মিরর নিষ্ক্রিয় করার পর, mirroring_src=bus_1000;mirroring=off এই সিগন্যালটি পাঠানো হয়। অডিও মিররিং সক্রিয় না থাকলে, অডিও ডুপ্লিকেশন নিষ্ক্রিয় করার জন্য HAL এই সিগন্যালটি ব্যবহার করতে পারে। অডিও মিররিং ডিভাইসগুলো নির্ধারণ করার জন্য, গাড়ির অডিও কনফিগারেশন ফাইলে mirroringDevices নামের একটি সেকশন থাকে, যা নিচের কোড স্নিপেটে দেখানো হয়েছে।

এই কোড অংশে bus_1000 এবং bus_2000 নামে দুটি মিররিং ডিভাইস সংজ্ঞায়িত করা হয়েছে, যাতে চারজন যাত্রী অডিও মিররিং ব্যবহার করতে পারে।

<carAudioConfiguration version="3">
   <mirroringDevices>
       <mirroringDevice address="bus_1000"/>
       <mirroringDevice address="bus_2000"/>
   </mirroringDevices>
  <zones>
    ....
  </zones>
</carAudioConfiguration>