অ্যান্ড্রয়েড অডিওতে, অডিও ডিভাইসের ধরন বোঝাতে audio_devices_t ব্যবহৃত হয়। এক বা একাধিক নির্দিষ্ট ডিভাইস ফিল্টার বা নির্বাচন করার জন্য এটি অডিও সোর্স কোডে একটি বিট ফিল্ড হিসেবে ব্যাপকভাবে ব্যবহৃত হয়। অ্যান্ড্রয়েড ১১-এর আগে, ৩০টি অডিও ইনপুট/আউটপুট ডিভাইসের ধরনের একটি সীমাবদ্ধতা ছিল এবং নতুন অডিও ডিভাইসের ধরন যোগ করার জন্য কোনো অতিরিক্ত স্থান ছিল না। আমরা অডিও ডিভাইসের ধরনের সংখ্যার উপর থেকে সীমাবদ্ধতাটি তুলে দিয়েছি, যাতে নতুন অডিও ডিভাইসের ধরন যোগ করা যায়।
অডিও ডিভাইস টাইপের সংখ্যার সীমাবদ্ধতা দূর করার জন্য, এখন অডিও ডিভাইস টাইপগুলো বিট মাস্কের পরিবর্তে এনুমারেটেড ভ্যালু হিসেবে গণ্য করা হয়।
বিদ্যমান সমস্ত অডিও ডিভাইসের ধরন অপরিবর্তিত রাখা হয়েছে। ইনপুট বা আউটপুট ডিভাইস আলাদা করার জন্য AUDIO_DEVICE_BIT_IN এখনও ব্যবহৃত হয়। নতুন অডিও ডিভাইসের ধরন যোগ করার সময়, বিদ্যমান মানগুলির মধ্যবর্তী ফাঁকা স্থানে সেগুলোকে গণনাকৃত মান হিসেবে বসানো হয়।
OEM-দের audio_devices_t বিট মাস্ক হিসেবে ব্যবহার করা উচিত নয়, কারণ নতুন এনুমারেটেড অডিও ডিভাইস টাইপ যোগ করার সময় এটি অপ্রত্যাশিত ফলাফল ঘটাতে পারে।
উদাহরণ এবং উৎস
অ্যান্ড্রয়েড ১১-এর আগে, বিট মাস্ক হিসেবে অডিও ডিভাইস টাইপের দুটি সাধারণ ব্যবহার ছিল।
- একাধিক অডিও ডিভাইস বোঝাতে
audio_devices_tভ্যালুটি ব্যবহার করা হয়। -
audio_devices_tভ্যালুটিতে একটি নির্দিষ্ট ক্যাটাগরির অডিও ডিভাইসের ধরন আছে কিনা তা যাচাই করা হচ্ছে।
একাধিক অডিও ডিভাইসের ধরন উপস্থাপন করার জন্য, /libaudiofoundation/include/media/AudioContainers.h এ থাকা DeviceTypeSet নামের একটি ক্লাস ব্যবহার করা হয়, যা audio_devices_t এর একটি std::set কন্টেইনার। ক্লাসটি ভেন্ডর-উপলব্ধ libaudiofoundation লাইব্রেরিতে ঘোষিত হয়েছে। C কোডে একাধিক অডিও ডিভাইসের ধরন উপস্থাপন করার জন্য, audio_devices_t এর একটি অ্যারে বা তালিকা ব্যবহার করা যেতে পারে।
কোনো একটি ডিভাইস টাইপ একটি নির্দিষ্ট ক্যাটাগরির কিনা তা পরীক্ষা করতে, /system/media/audio/include/system/audio.h এ থাকা audio_is_.*_device হেল্পার ফাংশনগুলো ব্যবহার করুন। একাধিক অডিও ডিভাইস টাইপের ক্ষেত্রে, libaudiofoundation এ থাকা হেল্পার ফাংশনগুলো ব্যবহার করুন। উদাহরণস্বরূপ, areAllOfSameDeviceType (DeviceTypeSet, std::function ব্যবহার করুন। areAllOfSameDeviceType (DeviceTypeSet, std::function প্রদত্ত সমস্ত অডিও ডিভাইসের ধরণ একই কিনা তা পরীক্ষা করার জন্য AudioContainers.h এ areAllOfSameDeviceType (DeviceTypeSet, std::function ব্যবহার করুন।
বাস্তবায়ন
OEM-দের অডিও HAL ইমপ্লিমেন্টেশন থেকে অডিও ডিভাইস টাইপ বিট ফিল্ড রিপ্রেজেন্টেশন অপসারণ করতে হবে।
- একটি বিট ফিল্ডে থাকা ডিভাইসগুলোর সমস্ত স্টোরেজ মুছে ফেলুন।
একাধিক অডিও ডিভাইসের ধরন বোঝাতে
audio_devices_tব্যবহার করা উচিত নয়। এর পরিবর্তে একটি লিস্ট বা ভেক্টর ব্যবহার করুন। - ডিভাইসের প্রকারভেদ তুলনা করার জন্য বিট অপারেশন ব্যবহার বন্ধ করুন।
অ্যান্ড্রয়েড ১১-এর আগে, অডিও ডিভাইসের ধরনগুলো বিটফিল্ড হিসেবে ব্যবহার করা যেত। সেক্ষেত্রে, ডিভাইসের ধরন তুলনা করার জন্য বিট অপারেশন ব্যবহার করা হতো। যখন নতুন, এনুমারেটেড অডিও ডিভাইসের ধরন যোগ করা হয়, তখন বিট অপারেশনগুলো অপ্রত্যাশিত ফলাফল তৈরি করতে পারে। এর পরিবর্তে, বিকল্প হিসেবে হেল্পার ফাংশন ব্যবহার করুন। যদি একটিমাত্র অডিও ডিভাইসের ধরন থাকে, তাহলে দুটি মান তুলনা করার জন্য সরাসরি তুলনা পদ্ধতি ব্যবহার করুন। কোনো অডিও ডিভাইসের ধরন একটি নির্দিষ্ট ক্যাটাগরির কিনা তা পরীক্ষা করতে,
/system/media/audio/include/system/audio.hফাইলে থাকা হেল্পার ফাংশনগুলো ব্যবহার করুন। উদাহরণস্বরূপ,audio_is_output_device(audio_devices_t device)। - অডিও ডিভাইসের প্রকারভেদের গ্রুপগুলোর জন্য পূর্বনির্ধারিত মান ব্যবহার করা বন্ধ করুন।
system/media/audio/include/system/audio-base-utils.hফাইলেAUDIO_DEVICE_OUT_ALLমতো অডিও ডিভাইস টাইপের গ্রুপগুলোর জন্য কিছু পূর্বনির্ধারিত মান রয়েছে। এই সমস্ত মান সংরক্ষিত, কিন্তু নতুন গণনাকৃত অডিও ডিভাইস টাইপ যুক্ত হলে এগুলো সঠিক না হওয়ায় অপ্রচলিত হয়ে যেতে পারে।audio-base-utils.hফাইলে অডিও ডিভাইস টাইপের নতুন গ্রুপ সংজ্ঞায়িত করা হয়েছে, যেগুলো হলো অডিও ডিভাইস টাইপের অ্যারে, যেমনAUDIO_DEVICE_OUT_ALL_ARRAY। - রাউটিংয়ের জন্য
set_parametersপরিবর্তেcreate_audio_patch()এবংrelease_audio_patch()মেথডগুলো প্রয়োগ করুন।set_parametersমেথডটি অডিও ডিভাইসের প্রকারগুলোকে একটি বিটফিল্ড হিসেবে ব্যবহার করে, তাই নতুন গণনাকৃত অডিও ডিভাইসের প্রকার যোগ করা হলে অপ্রত্যাশিত ফলাফল হতে পারে।বর্তমানে দুই ধরনের অডিও প্যাচ প্রয়োজন:
- প্লেব্যাকের জন্য ডিভাইস প্যাচগুলিতে মিশ্রিত করুন
- রেকর্ডিংয়ের জন্য প্যাচ মিশ্রিত করার ডিভাইস
পরবর্তী আপডেটগুলিতে, ডিভাইসভেদে অতিরিক্ত প্যাচের প্রয়োজন হতে পারে।
অডিও প্যাচ তৈরি করার সময়, যদি প্যাচ হ্যান্ডেল নির্দিষ্ট করা না থাকে, তাহলে অডিও HAL-কে একটি অনন্য প্যাচ হ্যান্ডেল তৈরি করতে হবে যা অডিও প্যাচটিকে শনাক্ত করতে পারে। অন্যথায়, অডিও HAL প্রদত্ত অডিও প্যাচ হ্যান্ডেলটি ব্যবহার করে অডিও প্যাচটি আপডেট করবে।
যদি একটি লিগ্যাসি অডিও HAL এবং AOSP HIDL র্যাপার ব্যবহার করা হয়, তবে লিগ্যাসি অডিও HAL-এর প্রধান সংস্করণটি 3.0-এ সেট করতে হবে।
অডিও প্যাচ ফিচারটি সক্রিয় করতে, অডিও HAL-এর প্রধান সংস্করণটি 3.0 বা তার বেশি সেট করতে হবে। আরও তথ্যের জন্য ডিফল্ট HIDL ইমপ্লিমেন্টেশনে থাকা
Device::supportsAudioPatches()দেখুন, যা Cuttlefish-এর অডিও HAL-এও পাওয়া যাবে।
কাস্টমাইজেশন
এই ফিচারটি বন্ধ করা সম্ভব নয়, কিংবা ফ্রেমওয়ার্কের সেই অডিও ডিভাইস রিফ্যাক্টরিংটি পূর্বাবস্থায় ফিরিয়ে আনাও সম্ভব নয়, যার ফলে অডিও ডিভাইসের ধরন যোগ করা যায়।
যোগ করা সমস্ত অডিও ডিভাইসের ধরণ একটিমাত্র বিট সেট করেই ডিভাইসের ধরণ উপস্থাপন করার সুযোগ দেয়, ফলে বর্তমান HAL বাস্তবায়নগুলো এখনও কাজ করে।
যদি নতুন অডিও ডিভাইসের ধরন যোগ করা হয় এবং OEM-রা সেগুলি ব্যবহার করতে চায়, তবে তাদের অডিও HAL ইমপ্লিমেন্টেশন আপগ্রেড করতে হবে এবং HIDL সংস্করণ 6.0 বা তার উচ্চতর সংস্করণে যেতে হবে। প্রধান HAL সংস্করণ 3.0-এ আপগ্রেড করা এবং create_audio_patch ও release_audio_patch মেথডগুলি ইমপ্লিমেন্ট করা বাধ্যতামূলক, কারণ নতুন অডিও ডিভাইসের ধরন যোগ করা হলে স্ট্রিম রাউট করার জন্য set_parameters ব্যবহার করলে অপ্রত্যাশিত ফলাফল দেখা দিতে পারে।
বৈধতা
OEM-দের জন্য প্রয়োজনীয় কাজটি হলো তাদের HAL ইমপ্লিমেন্টেশনগুলো আপডেট করা। ইমপ্লিমেন্টেশনটি উদ্দেশ্য অনুযায়ী কাজ করছে কিনা তা যাচাই করার জন্য অডিও HAL-এর VTS ব্যবহার করা যেতে পারে। সমস্ত টেস্ট VTS ফাইলগুলোতে পাওয়া যাবে।