অডিও নীতি কনফিগার করা

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

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

Android 7.0-এ আপনার অডিও টপোলজি বর্ণনা করার জন্য অডিও নীতি কনফিগারেশন ফাইল ফর্ম্যাট (XML) চালু করা হয়েছে।

আগের Android রিলিজে আপনার প্রোডাক্টে থাকা অডিও ডিভাইস ঘোষণা করার জন্য device/<company>/<device>/audio/audio_policy.conf ব্যবহার করতে হত (আপনি device/samsung/tuna/audio/audio_policy.conf-এ Galaxy Nexus অডিও হার্ডওয়্যারের জন্য এই ফাইলের একটি উদাহরণ দেখতে পারেন)। তবে, CONF হল একটি সহজ, মালিকানাধীন ফর্ম্যাট যা টেলিভিশন এবং অটোমোবাইলের মতো ভার্টিক্যালের জন্য জটিল টপোলজি বর্ণনা করার ক্ষেত্রে খুব সীমিত।

Android 7.0 audio_policy.conf সরিয়ে দিয়েছে এবং XML ফাইল ফর্ম্যাট ব্যবহার করে অডিও টপোলজি সংজ্ঞায়িত করার জন্য সহায়তা যোগ করেছে যা আরও মানুষ-পাঠযোগ্য, এতে এডিটিং ও পার্সিং টুলের একটি বিস্তৃত পরিসর রয়েছে এবং এটি জটিল অডিও টপোলজি বর্ণনা করার জন্য যথেষ্ট নমনীয়। Android 7.0, কনফিগারেশন ফাইলের XML ফর্ম্যাট বেছে নেওয়ার জন্য USE_XML_AUDIO_POLICY_CONF বিল্ড ফ্ল্যাগ ব্যবহার করে।

XML ফর্ম্যাটের সুবিধা

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

  • Android 10-এ, একাধিক অ্যাক্টিভ রেকর্ডিং অ্যাপ একসাথে অনুমতিপ্রাপ্ত।
    • কনকারেন্সি পরিস্থিতির কারণে রেকর্ডিং শুরু করার অনুরোধ কখনও বাতিল করা হয় না।
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) কলব্যাক ক্যাপচার পাথ পরিবর্তন সম্পর্কে ক্লায়েন্টদের বিজ্ঞপ্তি পাঠায়।
  • নিম্নলিখিত পরিস্থিতিতে, ক্লায়েন্ট সাইলেন্ট অডিও স্যাম্পেল পায়:
    • গোপনীয়তা সংক্রান্ত সংবেদনশীল ব্যবহারের কেস (যেমন, VOICE_COMMUNICATION) অ্যাক্টিভ আছে।
    • ক্লায়েন্টের কোনও ফোরগ্রাউন্ড সার্ভিস বা ফোরগ্রাউন্ড UI নেই।
    • নীতি অনুযায়ী বিশেষ ভূমিকাগুলি শনাক্ত করা হয়:
      • অ্যাক্সেসিবিলিটি পরিষেবা: গোপনীয়তা-সংবেদনশীল ব্যবহারের কেস চালু থাকলেও রেকর্ড করতে পারে।
      • Assistant: UI উপরে থাকলে গোপনীয়তা সংবেদনশীল হিসেবে বিবেচনা করা হয়।
  • অডিও প্রোফাইলের স্ট্রাকচার HDMI সিম্পল অডিও ডেসক্রিপ্টরের মতো, যা প্রতিটি অডিও ফর্ম্যাটের জন্য স্যাম্পলিং রেট/চ্যানেল মাস্কের আলাদা সেট চালু করে।
  • ডিভাইস ও স্ট্রিমের মধ্যে সম্ভাব্য সব কানেকশনের জন্য স্পষ্ট সংজ্ঞা আছে। আগে, একটি অন্তর্নিহিত নিয়মের কারণে একই HAL মডিউলের সাথে সংযুক্ত সমস্ত ডিভাইস কানেক্ট করা সম্ভব ছিল, যা অডিও প্যাচ API-এর মাধ্যমে অনুরোধ করা কানেকশনকে অডিও নীতি দ্বারা নিয়ন্ত্রণ করা থেকে বাধা দেয়। XML ফর্ম্যাটে, টপোলজি বিবরণ কানেকশন সংক্রান্ত সীমাবদ্ধতা নির্ধারণ করে।
  • এর মধ্যে কাজ করে এমন আইটেমগুলি স্ট্যান্ডার্ড A2DP, USB বা রিডাইরেক্ট জমা দেওয়ার সংজ্ঞাগুলি রিপিট করা এড়িয়ে যায়।
  • ভলিউম কার্ভ কাস্টমাইজ করা যায়। আগে, ভলিউম টেবিল হার্ডকোড করা থাকত। XML ফর্ম্যাটে, ভলিউম টেবিলের বিবরণ দেওয়া হয় এবং এটি কাস্টমাইজ করা যায়।

frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml টেমপ্লেটে এইসব ফিচারের অনেকগুলির ব্যবহার দেখানো হয়েছে।

ফাইল ফর্ম্যাট ও লোকেশন

নতুন অডিও নীতি কনফিগারেশন ফাইলটি হল audio_policy_configuration.xml এবং এটি /system/etc-এ অবস্থিত। Android 12 এবং Android 12-এর আগের যেকোনও ভার্সনের জন্য XML ফাইল ফর্ম্যাটে নিচের উদাহরণে একটি সাধারণ অডিও নীতি কনফিগারেশন দেখানো হয়েছে।

টপ-লেভেল স্ট্রাকচারে এমন মডিউল থাকে যা প্রতিটি অডিও HAL হার্ডওয়্যার মডিউলের সাথে সম্পর্কিত, যেখানে প্রতিটি মডিউলে মিক্স পোর্ট, ডিভাইস পোর্ট ও রাউটের তালিকা থাকে:

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

ভলিউম টেবিল হল পয়েন্টের একটি সাধারণ তালিকা যা UI ইনডেক্স থেকে dB-তে ভলিউম ট্রান্সলেট করার জন্য ব্যবহৃত কার্ভকে সংজ্ঞায়িত করে। একটি আলাদা ইনক্লুড ফাইল ডিফল্ট কার্ভ প্রদান করে, তবে প্রদত্ত ব্যবহারিক ক্ষেত্র এবং ডিভাইস বিভাগের জন্য প্রতিটি কার্ভ ওভাররাইট করা যেতে পারে।

ফাইল অন্তর্ভুক্ত করা

অন্যান্য XML ফাইলে থাকা অডিও নীতি কনফিগারেশন সংক্রান্ত তথ্য অন্তর্ভুক্ত করতে XML ইনক্লুশন (XInclude) পদ্ধতি ব্যবহার করা যেতে পারে। অন্তর্ভুক্ত সব ফাইলকে অবশ্যই উপরে বর্ণিত স্ট্রাকচার মেনে চলতে হবে এবং নিম্নলিখিত বিধিনিষেধ মেনে চলতে হবে:

  • ফাইলে শুধুমাত্র টপ-লেভেল এলিমেন্ট থাকতে পারে।
  • ফাইলে XInclude এলিমেন্ট থাকতে পারে না।

সব অডিও নীতি কনফিগারেশন ফাইলে (যেখানে ভুল হওয়ার সম্ভাবনা থাকে) স্ট্যান্ডার্ড Android ওপেন সোর্স প্রজেক্ট (AOSP) অডিও HAL মডিউল কনফিগারেশন সংক্রান্ত তথ্য কপি করা এড়াতে include ব্যবহার করুন। নিম্নলিখিত অডিও HAL-এর জন্য একটি স্ট্যান্ডার্ড অডিও নীতি কনফিগারেশন XML ফাইল প্রদান করা হয়েছে:

  • A2DP: a2dp_audio_policy_configuration.xml
  • সাবমিক্স রি-রুট করুন: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

অডিও নীতি কোড সংস্থা

AudioPolicyManager.cpp-কে একাধিক মডিউলে ভাগ করা হয়েছে যাতে এটি সহজে ম্যানেজ ও কনফিগার করা যায়। frameworks/av/services/audiopolicy-এর সংগঠন নিম্নলিখিত মডিউল অন্তর্ভুক্ত করে।

মডিউল বর্ণনা
/managerdefault সব অ্যাপের জন্য সাধারণ ইন্টারফেস এবং আচরণ বাস্তবায়ন অন্তর্ভুক্ত করে। AudioPolicyManager.cpp-এর মতো, তবে এতে ইঞ্জিন ফাংশনালিটি ও সাধারণ কনসেপ্ট অ্যাবস্ট্রাক্ট করা হয়েছে।
/common বেস ক্লাস (যেমন, ইনপুট আউটপুট অডিও স্ট্রিম প্রোফাইল, অডিও ডিভাইস ডেসক্রিপ্টর, অডিও প্যাচ ও অডিও পোর্টের জন্য ডেটা স্ট্রাকচার) নির্ধারণ করে। এটি আগে AudioPolicyManager.cpp-এর মধ্যে সংজ্ঞায়িত করা হয়েছিল।
/engine

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

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

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

প্যারামিটার ফ্রেমওয়ার্ক ব্যবহার করে কনফিগারেশন

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

কনফিগার করা যায় এমন অডিও নীতি ব্যবহার করলে ভেন্ডর OEM এগুলি করতে পারে:

  • XML-এ কোনও সিস্টেমের গঠন ও তার প্যারামিটার বর্ণনা করো।
  • উল্লেখ করা প্যারামিটার অ্যাক্সেস করার জন্য একটি ব্যাকএন্ড (প্লাগ-ইন) লিখুন (C++-এ) বা আবার ব্যবহার করুন।
  • XML বা ডোমেন-নির্দিষ্ট ভাষায় এমন শর্ত/নিয়ম সংজ্ঞায়িত করুন যার ভিত্তিতে কোনও প্রদত্ত প্যারামিটারকে অবশ্যই কোনও প্রদত্ত মান নিতে হবে।

AOSP-তে অডিও নীতি কনফিগারেশন ফাইলের একটি উদাহরণ অন্তর্ভুক্ত থাকে যা Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml-এ প্যারামিটার ফ্রেমওয়ার্ক ব্যবহার করে। বিবরণের জন্য, Intel ডকুমেন্টেশনে প্যারামিটার ফ্রেমওয়ার্ক দেখুন।

Android 10 বা এর আগের যেকোনও ভার্সনে, কনফিগার করা যায় এমন অডিও নীতি বিল্ড বিকল্প USE_CONFIGURABLE_AUDIO_POLICY ব্যবহার করে বেছে নেওয়া হয়। Android 11 বা এর পরের যেকোনও ভার্সনে, অডিও নীতি ইঞ্জিনের ভার্সন audio_policy_configuration.xml ফাইলে বেছে নেওয়া হয়। কনফিগার করা যায় এমন অডিও নীতি ইঞ্জিন বেছে নিতে, নিম্নলিখিত উদাহরণে দেখানো engine_library অ্যাট্রিবিউটের ভ্যালু globalConfiguration এলিমেন্টে configurable হিসেবে সেট করুন:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

অডিও নীতি রাউটিং API

Android 6.0 একটি পাবলিক এনুমেরেশন ও সিলেকশন API নিয়ে এসেছে যা অডিও প্যাচ/অডিও পোর্ট ইনফ্রাস্ট্রাকচারের উপরে থাকে এবং কানেক্ট করা অডিও রেকর্ড বা ট্র্যাকের জন্য নির্দিষ্ট ডিভাইস আউটপুট বা ইনপুটের ব্যাপারে পছন্দ নির্দেশ করতে অ্যাপ ডেভেলপারদের অনুমতি দেয়।

Android 7.0-এ, Enumeration ও Selection API, CTS টেস্টের মাধ্যমে যাচাই করা হয় এবং নেটিভ C/C++ (OpenSL ES) অডিও স্ট্রিমের জন্য রাউটিং অন্তর্ভুক্ত করতে এটি এক্সটেন্ড করা হয়। নেটিভ স্ট্রিমের রাউটিং Java-তে করা চালিয়ে যাওয়া হয়, এর সাথে একটি AudioRouting ইন্টারফেস যোগ করা হয় যা AudioTrack এবং AudioRecord ক্লাসের জন্য নির্দিষ্ট করা এক্সপ্লিসিট রাউটিং পদ্ধতিকে সুপারসিড, একত্রিত ও বাতিল করে দেয়।

Enumeration ও Selection API-এর বিবরণ পেতে, Android কনফিগারেশন ইন্টারফেস ও OpenSLES_AndroidConfiguration.h দেখুন। অডিও রাউটিংয়ের বিবরণ পেতে, AudioRouting দেখুন।

মাল্টি-চ্যানেল সহায়তা

আপনার হার্ডওয়্যার ও ড্রাইভার HDMI-এর মাধ্যমে মাল্টিচ্যানেল অডিও সাপোর্ট করলে, আপনি অডিও স্ট্রিম সরাসরি অডিও হার্ডওয়্যারে আউটপুট করতে পারবেন (এটি AudioFlinger মিক্সারকে বাইপাস করে, তাই এটি দুটি চ্যানেলে ডাউনমিক্স হয় না।) আউটপুট স্ট্রিম প্রোফাইল মাল্টিচ্যানেল অডিও ক্ষমতা সাপোর্ট করে কিনা তা অডিও HAL -কে অবশ্যই প্রকাশ করতে হবে। HAL তার ক্ষমতা প্রকাশ করলে, ডিফল্ট নীতি ম্যানেজার HDMI-এর মাধ্যমে মাল্টিচ্যানেল প্লেব্যাকের অনুমতি দেয়। প্রয়োগ করার বিবরণ জানতে, device/samsung/tuna/audio/audio_hw.c দেখুন।

আপনার প্রোডাক্টে মাল্টিচ্যানেল অডিও আউটপুট আছে তা নির্দিষ্ট করতে, আপনার প্রোডাক্টের জন্য মাল্টিচ্যানেল আউটপুট বর্ণনা করতে অডিও নীতি কনফিগারেশন ফাইল এডিট করুন। frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml থেকে নেওয়া নিম্নলিখিত উদাহরণে একটি ডায়নামিক চ্যানেল মাস্ক দেখানো হয়েছে, যার অর্থ হল কানেকশন হওয়ার পরে অডিও পলিসি ম্যানেজার HDMI সিঙ্ক দ্বারা সমর্থিত চ্যানেল মাস্ক কোয়েরি করে।

এছাড়াও, আপনি AUDIO_CHANNEL_OUT_5POINT1-এর মতো কোনও স্ট্যাটিক চ্যানেল মাস্ক নির্দিষ্ট করতে পারেন। মাল্টিচ্যানেল অডিও কাজ করে না এমন অডিও ডিভাইসে কন্টেন্ট পাঠানো হলে, AudioFlinger-এর মিক্সার অটোমেটিক সেটিকে স্টেরিওতে ডাউনমিক্স করে দেয়।

মিডিয়া কোডেক

আপনার প্রোডাক্টের জন্য হার্ডওয়্যার ও ড্রাইভারের সাথে মানানসই অডিও কোডেক সঠিকভাবে ঘোষিত হয়েছে কিনা তা নিশ্চিত করুন। আরও তথ্যের জন্য, ফ্রেমওয়ার্কে কোডেক এক্সপোজ করা দেখুন।