অটোমোটিভ অডিও

Android Automotive OS (AAOS) একটি গাড়িতে ইনফোটেইনমেন্ট সিস্টেম হিসাবে কাজ করার ক্ষেত্রে ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য মূল Android অডিও স্ট্যাকের উপর তৈরি করে। AAOS ইনফোটেইনমেন্ট সাউন্ডের জন্য দায়ী (অর্থাৎ মিডিয়া, নেভিগেশন এবং যোগাযোগ) কিন্তু চীম এবং সতর্কতার জন্য সরাসরি দায়ী নয় যেগুলির জন্য কঠোর উপলব্ধতা এবং সময়ের প্রয়োজনীয়তা রয়েছে৷ যদিও AAOS গাড়িটিকে অডিও পরিচালনা করতে সাহায্য করার জন্য সংকেত এবং প্রক্রিয়া সরবরাহ করে, শেষ পর্যন্ত এটি গাড়ির উপর নির্ভর করে যে চালক এবং যাত্রীদের জন্য কোন শব্দগুলি বাজানো উচিত, নিরাপত্তার সমালোচনামূলক শব্দ এবং নিয়ন্ত্রক শব্দগুলি ছাড়াই সঠিকভাবে শোনা যায় তা নিশ্চিত করে বাধা.

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

Android 11 স্বয়ংচালিত-সম্পর্কিত অডিও সমর্থনে নিম্নলিখিত পরিবর্তনগুলি অন্তর্ভুক্ত করে:

অ্যান্ড্রয়েড সাউন্ড এবং স্ট্রিম

স্বয়ংচালিত অডিও সিস্টেম নিম্নলিখিত শব্দ এবং প্রবাহ পরিচালনা করে:

স্ট্রিম-কেন্দ্রিক আর্কিটেকচার ডায়াগ্রাম

চিত্র 1. স্ট্রীম-কেন্দ্রিক আর্কিটেকচার ডায়াগ্রাম

অ্যান্ড্রয়েড অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলি থেকে আসা শব্দগুলি পরিচালনা করে, সেই অ্যাপগুলিকে নিয়ন্ত্রণ করে এবং শব্দের প্রকারের উপর ভিত্তি করে HAL-এ আউটপুট ডিভাইসগুলিতে তাদের শব্দগুলিকে রাউট করে:

  • মূল অডিও নামকরণে উৎস হিসেবে পরিচিত লজিক্যাল স্ট্রিমগুলিকে অডিও অ্যাট্রিবিউটের সাথে ট্যাগ করা হয়।
  • আসল অডিও নামকরণে ডিভাইস হিসাবে পরিচিত শারীরিক স্ট্রীম , মিশ্রিত করার পরে কোনও প্রসঙ্গ তথ্য থাকে না।

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

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

অ্যান্ড্রয়েড শব্দ

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

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

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

বাহ্যিক প্রবাহ

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

যদি বাহ্যিক স্ট্রীমগুলি মিডিয়া উত্স হয় যেগুলি Android যে শব্দ পরিবেশ তৈরি করছে তার সাথে ইন্টারঅ্যাক্ট করা উচিত (উদাহরণস্বরূপ, একটি বাহ্যিক টিউনার চালু হলে MP3 প্লেব্যাক বন্ধ করুন), সেই বাহ্যিক স্ট্রিমগুলিকে একটি Android অ্যাপ দ্বারা উপস্থাপন করা উচিত৷ এই ধরনের একটি অ্যাপ HAL-এর পরিবর্তে মিডিয়া সোর্সের তরফে অডিও ফোকাসের অনুরোধ করবে এবং অ্যান্ড্রয়েড ফোকাস নীতিতে ফিট করার জন্য প্রয়োজনীয় বাহ্যিক উত্স শুরু/বন্ধ করে ফোকাস বিজ্ঞপ্তিগুলির প্রতিক্রিয়া জানাবে। প্লে/পজের মতো মিডিয়া কী ইভেন্টগুলি পরিচালনা করার জন্যও অ্যাপটি দায়ী। এই ধরনের বাহ্যিক ডিভাইসগুলিকে নিয়ন্ত্রণ করার জন্য একটি প্রস্তাবিত প্রক্রিয়া হল HwAudioSource .

প্রাপ্তফলাফল যন্ত্র

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

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

আউটপুট ডিভাইসে অডিও কনটেক্সট নিয়োগ করা হয় car_audio_configuration.xml এর মাধ্যমে।

মাইক্রোফোন ইনপুট

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

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

মাল্টি-চ্যানেল মাইক্রোফোন ইনপুট

দুটির বেশি চ্যানেল (স্টিরিও) সহ একটি ডিভাইস থেকে অডিও ক্যাপচার করতে, অবস্থানগত সূচক মাস্কের পরিবর্তে একটি চ্যানেল সূচক মাস্ক ব্যবহার করুন (যেমন CHANNEL_IN_LEFT )। উদাহরণ:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

যখন setChannelMask এবং setChannelIndexMask উভয়ই সেট করা থাকে, তখন AudioRecord শুধুমাত্র setChannelMask (সর্বোচ্চ দুটি চ্যানেল) দ্বারা সেট করা মান ব্যবহার করে।

সমবর্তী ক্যাপচার

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

AUDIO_DEVICE_IN_BUS ডিভাইস বা সেকেন্ডারি AUDIO_DEVICE_IN_FM_TUNER ডিভাইসগুলির সাথে কাজ করার জন্য ডিজাইন করা অ্যাপগুলিকে অবশ্যই সেই ডিভাইসগুলিকে স্পষ্টভাবে সনাক্ত করতে এবং Android ডিফল্ট সোর্স নির্বাচন লজিক বাইপাস করার জন্য AudioRecord.setPreferredDevice() ব্যবহার করার উপর নির্ভর করতে হবে৷

অডিও ব্যবহার

AAOS প্রাথমিকভাবে রাউটিং, ভলিউম সমন্বয় এবং ফোকাস পরিচালনার জন্য AudioAttributes.AttributeUsages ব্যবহার করে। ব্যবহারগুলি হল "কেন" স্ট্রীমটি চালানো হচ্ছে তার একটি উপস্থাপনা৷ অতএব, সমস্ত স্ট্রিম এবং অডিও ফোকাস অনুরোধগুলি তাদের অডিও প্লেব্যাকের জন্য একটি ব্যবহার নির্দিষ্ট করা উচিত। একটি AudioAttributes অবজেক্ট তৈরি করার সময় নির্দিষ্টভাবে সেট না হলে, ব্যবহারটি USAGE_UNKNOWN এ ডিফল্ট হবে। যদিও এটি বর্তমানে USAGE_MEDIA এর মতই বিবেচিত হয়, এই আচরণটি মিডিয়া প্লেব্যাকের জন্য নির্ভর করা উচিত নয়৷

সিস্টেম ব্যবহার

অ্যান্ড্রয়েড 11-এ, সিস্টেম ব্যবহার চালু করা হয়েছিল। android.permission.MODIFY_AUDIO_ROUTING এর পাশাপাশি সিস্টেম API-এর প্রয়োজন ছাড়া এই ব্যবহারগুলি পূর্বে প্রতিষ্ঠিত ব্যবহারের মতোই আচরণ করে। নতুন সিস্টেম ব্যবহার হল:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

একটি সিস্টেম ব্যবহারের সাথে একটি AudioAttributes তৈরি করতে, setUsage এর পরিবর্তে AudioAttributes.Builder#setSystemUsage ব্যবহার করুন। একটি নন-সিস্টেম ব্যবহারের সাথে এই পদ্ধতিতে কল করার ফলে একটি IllegalArgumentException নিক্ষেপ করা হবে। এছাড়াও, যদি একটি সিস্টেমের ব্যবহার এবং ব্যবহার উভয়ই একজন নির্মাতার উপর সেট করা থাকে, তবে এটি নির্মাণের সময় একটি IllegalArgumentException নিক্ষেপ করবে।

একটি AudioAttributes উদাহরণের সাথে কোন ব্যবহার যুক্ত তা পরীক্ষা করতে, AudioAttributes#getSystemUsage কল করুন। এটি সংশ্লিষ্ট ব্যবহার বা সিস্টেম ব্যবহার প্রদান করে।

অডিও প্রসঙ্গ

AAOS অডিওর কনফিগারেশন সহজ করার জন্য, অনুরূপ ব্যবহারগুলিকে CarAudioContext এ গোষ্ঠীভুক্ত করা হয়েছে। রাউটিং, ভলিউম গ্রুপ এবং অডিও ফোকাস ম্যানেজমেন্ট সংজ্ঞায়িত করতে এই অডিও প্রসঙ্গগুলি CarAudioService জুড়ে ব্যবহৃত হয়।

অ্যান্ড্রয়েড 11-এ অডিও প্রসঙ্গগুলি হল:

CarAudio Context সংযুক্ত বৈশিষ্ট্য ব্যবহার
MUSIC UNKNOWN, GAME, MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT, ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION, NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

অডিও প্রসঙ্গ এবং ব্যবহারের মধ্যে ম্যাপিং। হাইলাইট করা সারিগুলি নতুন সিস্টেম ব্যবহারের জন্য।

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

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

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

জোনগুলিকে car_audio_configuration.xml এর অংশ হিসাবে সংজ্ঞায়িত করা হয়েছে। CarAudioService তারপর কনফিগারেশন পড়ে এবং অডিওসার্ভিসকে তাদের সংশ্লিষ্ট জোনের উপর ভিত্তি করে অডিও স্ট্রীম রুট করতে সাহায্য করে। প্রতিটি জোন এখনও প্রসঙ্গ এবং অ্যাপ্লিকেশন uid-এর উপর ভিত্তি করে রাউটিং-এর নিয়ম নির্ধারণ করে। যখন একটি প্লেয়ার তৈরি করা হয়, তখন CarAudioService নির্ধারণ করে যে প্লেয়ারটি কোন জোনের সাথে যুক্ত, এবং তারপর ব্যবহারের উপর ভিত্তি করে, AudioFlinger কোন ডিভাইসে অডিওটি রুট করবে।

প্রতিটি অডিও জোনের জন্য ফোকাস স্বাধীনভাবে রক্ষণাবেক্ষণ করা হয়। এটি বিভিন্ন অঞ্চলের অ্যাপ্লিকেশনগুলিকে একে অপরের সাথে হস্তক্ষেপ না করে স্বাধীনভাবে অডিও তৈরি করতে সক্ষম করে যখন অ্যাপ্লিকেশনগুলি এখনও তাদের জোনের মধ্যে ফোকাসের পরিবর্তনগুলিকে সম্মান করে৷ CarAudioService এর মধ্যে CarZonesAudioFocus প্রতিটি জোনের জন্য ফোকাস পরিচালনার জন্য দায়ী।

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

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

অডিও HAL

স্বয়ংচালিত অডিও বাস্তবায়ন স্ট্যান্ডার্ড অ্যান্ড্রয়েড অডিও HAL-এর উপর নির্ভর করে, যার মধ্যে নিম্নলিখিতগুলি রয়েছে:

  • IDevice.hal . ইনপুট এবং আউটপুট স্ট্রীম তৈরি করে, প্রধান ভলিউম এবং নিঃশব্দ পরিচালনা করে এবং ব্যবহার করে:
    • createAudioPatch । ডিভাইসের মধ্যে বাহ্যিক-বাহ্যিক প্যাচ তৈরি করতে।
    • IDevice.setAudioPortConfig() প্রতিটি শারীরিক স্ট্রিমের জন্য ভলিউম প্রদান করতে।
  • IStream.hal ইনপুট এবং আউটপুট ভেরিয়েন্টের সাথে, হার্ডওয়্যারে এবং থেকে অডিও নমুনার স্ট্রিমিং পরিচালনা করে।

স্বয়ংচালিত ডিভাইসের প্রকার

স্বয়ংচালিত প্ল্যাটফর্মগুলির জন্য নিম্নলিখিত ডিভাইসের ধরনগুলি প্রাসঙ্গিক৷

ডিভাইসের ধরন বর্ণনা
AUDIO_DEVICE_OUT_BUS অ্যান্ড্রয়েড থেকে প্রাথমিক আউটপুট (এভাবে অ্যান্ড্রয়েড থেকে সমস্ত অডিও গাড়িতে বিতরণ করা হয়)। প্রতিটি প্রসঙ্গের জন্য স্ট্রীম দ্ব্যর্থহীন করার ঠিকানা হিসাবে ব্যবহৃত হয়।
AUDIO_DEVICE_OUT_TELEPHONY_TX ট্রান্সমিশনের জন্য সেলুলার রেডিওতে রাউট করা অডিওর জন্য ব্যবহৃত হয়।
AUDIO_DEVICE_IN_BUS অন্যথায় শ্রেণীবদ্ধ না ইনপুট জন্য ব্যবহৃত.
AUDIO_DEVICE_IN_FM_TUNER শুধুমাত্র সম্প্রচার রেডিও ইনপুট জন্য ব্যবহৃত.
AUDIO_DEVICE_IN_TV_TUNER উপস্থিত থাকলে একটি টিভি ডিভাইসের জন্য ব্যবহৃত হয়।
AUDIO_DEVICE_IN_LINE AUX ইনপুট জ্যাকের জন্য ব্যবহৃত হয়।
AUDIO_DEVICE_IN_BLUETOOTH_A2DP ব্লুটুথের মাধ্যমে মিউজিক পাওয়া গেছে।
AUDIO_DEVICE_IN_TELEPHONY_RX একটি ফোন কলের সাথে যুক্ত সেলুলার রেডিও থেকে প্রাপ্ত অডিওর জন্য ব্যবহৃত হয়।

অডিও ডিভাইস কনফিগার করা হচ্ছে

Android-এ দৃশ্যমান অডিও ডিভাইসগুলিকে অবশ্যই /audio_policy_configuration.xml এ সংজ্ঞায়িত করতে হবে, যার মধ্যে নিম্নলিখিত উপাদানগুলি অন্তর্ভুক্ত রয়েছে:

  • মডিউল নাম। "প্রাথমিক" (অটোমোটিভ ব্যবহারের ক্ষেত্রে ব্যবহৃত হয়), "A2DP", "remote_submix" এবং "USB" সমর্থন করে। মডিউলের নাম এবং সংশ্লিষ্ট অডিও ড্রাইভারটি audio.primary.$(variant).so এ কম্পাইল করা উচিত।
  • ডিভাইস পোর্ট। এই মডিউল থেকে অ্যাক্সেস করা যেতে পারে এমন সমস্ত ইনপুট এবং আউটপুট ডিভাইসের (স্থায়ীভাবে সংযুক্ত ডিভাইস এবং অপসারণযোগ্য ডিভাইসগুলি সহ) ডিভাইস বর্ণনাকারীর একটি তালিকা রয়েছে।
    • প্রতিটি আউটপুট ডিভাইসের জন্য, আপনি লাভ নিয়ন্ত্রণ নির্ধারণ করতে পারেন যা মিলিবেলে ন্যূনতম/সর্বোচ্চ/ডিফল্ট/পদক্ষেপ মান নিয়ে গঠিত (1 মিলিবেল = 1/100 ডিবি = 1/1000 বেল)।
    • AUDIO_DEVICE_OUT_BUS এর মতো একই ধরনের ডিভাইসের একাধিক ডিভাইস থাকলেও ডিভাইসটি খুঁজে পেতে ডিভাইসপোর্ট ইনস্ট্যান্সে অ্যাড্রেস অ্যাট্রিবিউট ব্যবহার করা যেতে পারে।
  • mixports. অডিও HAL দ্বারা প্রকাশিত সমস্ত আউটপুট এবং ইনপুট স্ট্রিমগুলির একটি তালিকা রয়েছে৷ প্রতিটি মিক্সপোর্ট দৃষ্টান্তকে অ্যান্ড্রয়েড অডিওসার্ভিসের একটি শারীরিক স্ট্রিম হিসাবে বিবেচনা করা যেতে পারে।
  • রুট ইনপুট এবং আউটপুট ডিভাইসের মধ্যে বা স্ট্রিম এবং ডিভাইসের মধ্যে সম্ভাব্য সংযোগের একটি তালিকা সংজ্ঞায়িত করে।

নিম্নলিখিত উদাহরণটি একটি আউটপুট ডিভাইস bus0_phone_out সংজ্ঞায়িত করে যেখানে সমস্ত Android অডিও স্ট্রীম mixer_bus0_phone_out দ্বারা মিশ্রিত হয়৷ রুটটি mixer_bus0_phone_out এর আউটপুট স্ট্রীমকে ডিভাইস bus0_phone_out এ নিয়ে যায়।

<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_phone_out</item>
<defaultOutputDevice>bus0_phone_out</defaultOutputDevice>
            <mixPorts>
                <mixPort name="mixport_bus0_phone_out"
                         role="source"
                         flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_phone_out"
                            role="sink"
                            type="AUDIO_DEVICE_OUT_BUS"
                            address="BUS00_PHONE">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400"
                                maxValueMB="4000"
                                defaultValueMB="0"
                                stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_phone_out"
                       sources="mixport_bus0_phone_out"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>