ডিভাইসের প্রকার সীমা

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

অডিও ডিভাইসের প্রকারের সংখ্যার সীমা অপসারণ করতে, অডিও ডিভাইসের প্রকারগুলি এখন বিট মাস্কের পরিবর্তে গণনাকৃত মান।

বিদ্যমান সমস্ত অডিও ডিভাইসের ধরনগুলি যেমন রয়েছে তেমনই রাখা হয়েছে। AUDIO_DEVICE_BIT_IN এখনও ইনপুট বা আউটপুট ডিভাইসগুলিকে আলাদা করতে ব্যবহৃত হয়৷ নতুন অডিও ডিভাইসের ধরন যোগ করার সময়, তারা বিদ্যমান মানগুলির মধ্যে ফাঁকের মধ্যে গণনা করা হয়।

OEMs-এর audio_devices_t একটি বিট মাস্ক হিসাবে ব্যবহার করা উচিত নয়, কারণ এটি অপ্রত্যাশিত ফলাফলের কারণ হতে পারে যখন নতুন গণনাকৃত অডিও ডিভাইস প্রকারগুলি যোগ করা হয়।

উদাহরণ এবং উৎস

অ্যান্ড্রয়েড 11-এর আগে, বিট মাস্ক হিসাবে অডিও ডিভাইসের দুটি সাধারণ ব্যবহার ছিল।

  • একাধিক অডিও ডিভাইস উপস্থাপন করতে audio_devices_t মান ব্যবহার করা।
  • audio_devices_t মানটিতে একটি নির্দিষ্ট বিভাগ থেকে অডিও ডিভাইসের ধরন রয়েছে কিনা তা পরীক্ষা করা হচ্ছে।

একাধিক অডিও ডিভাইসের ধরন উপস্থাপন করতে, /libaudiofoundation/include/media/AudioContainers.hDeviceTypeSet নামের একটি ক্লাস ব্যবহার করা হয়, যা audio_devices_t এর একটি std::set কন্টেইনার। ক্লাসটি বিক্রেতা-উপলব্ধ libaudiofoundation লাইব্রেরিতে ঘোষণা করা হয়েছে। সি কোডে একাধিক অডিও ডিভাইসের ধরন উপস্থাপন করতে, একটি অ্যারে বা audio_devices_t এর একটি তালিকা ব্যবহার করা যেতে পারে।

একটি একক ডিভাইস প্রকার একটি নির্দিষ্ট বিভাগের কিনা তা পরীক্ষা করতে, /system/media/audio/include/system/audio.h এ সহায়ক ফাংশন audio_is_.*_device ব্যবহার করুন। একাধিক অডিও ডিভাইস ধরনের ক্ষেত্রে, libaudiofoundation এ সহায়ক ফাংশন ব্যবহার করুন। উদাহরণস্বরূপ, areAllOfSameDeviceType (DeviceTypeSet, std::function ) প্রদত্ত সমস্ত অডিও ডিভাইসের ধরন একই ধরণের কিনা তা পরীক্ষা করতে areAllOfSameDeviceType (DeviceTypeSet, std::function ) AudioContainers.h

বাস্তবায়ন

OEMs অডিও HAL বাস্তবায়ন থেকে অডিও ডিভাইস টাইপ বিট ক্ষেত্র উপস্থাপনা অপসারণ করতে হবে।

  1. একটি বিট ক্ষেত্রে ডিভাইসের সব স্টোরেজ সরান.

    audio_devices_t একাধিক অডিও ডিভাইসের ধরন উপস্থাপন করতে ব্যবহার করা উচিত নয়। পরিবর্তে, একটি তালিকা বা ভেক্টর ব্যবহার করুন।

  2. ডিভাইসের প্রকারের তুলনার জন্য বিট অপারেশন ব্যবহার করা বন্ধ করুন।

    অ্যান্ড্রয়েড 11 এর আগে, অডিও ডিভাইসের ধরনগুলি বিটফিল্ড হিসাবে ব্যবহার করা যেতে পারে। সেই ক্ষেত্রে, ডিভাইসের প্রকারের তুলনার জন্য বিট অপারেশনগুলি ব্যবহার করা সাধারণ। যখন নতুন, গণনাকৃত অডিও ডিভাইস প্রকারগুলি যোগ করা হয়, বিট অপারেশনগুলি অপ্রত্যাশিত ফলাফলের কারণ হতে পারে। পরিবর্তে, বিকল্প হিসাবে সহায়ক ফাংশন ব্যবহার করুন। যদি একটি একক অডিও ডিভাইস প্রকার থাকে, তাহলে দুটি মান তুলনা করতে সরাসরি তুলনা ব্যবহার করুন। একটি অডিও ডিভাইসের ধরন একটি নির্দিষ্ট বিভাগের কিনা তা পরীক্ষা করতে, /system/media/audio/include/system/audio.h এ সহায়ক ফাংশন ব্যবহার করুন। উদাহরণস্বরূপ, audio_is_output_device(audio_devices_t device)

  3. অডিও ডিভাইস ধরনের গ্রুপের জন্য পূর্বনির্ধারিত মান ব্যবহার করা বন্ধ করুন।

    system/media/audio/include/system/audio-base-utils.h অডিও ডিভাইস প্রকারের গ্রুপগুলির জন্য কিছু পূর্বনির্ধারিত মান রয়েছে, AUDIO_DEVICE_OUT_ALL . এই সমস্ত মান সংরক্ষিত কিন্তু অবচয় হতে পারে কারণ নতুন গণনাকৃত অডিও ডিভাইসের প্রকারগুলি যোগ করা হলে সেগুলি সঠিক হবে না৷ audio-base-utils.h এ সংজ্ঞায়িত অডিও ডিভাইস প্রকারের নতুন গোষ্ঠী রয়েছে, যা অডিও ডিভাইস প্রকারের অ্যারে, যেমন AUDIO_DEVICE_OUT_ALL_ARRAY

  4. set_parameters পরিবর্তে রাউটিংয়ের জন্য create_audio_patch() এবং release_audio_patch() পদ্ধতি প্রয়োগ করুন।

    set_parameters পদ্ধতিটি একটি বিটফিল্ড হিসাবে অডিও ডিভাইসের ধরন ব্যবহার করে, তাই নতুন গণনা করা অডিও ডিভাইসের প্রকারগুলি যোগ করা হলে অপ্রত্যাশিত ফলাফল হতে পারে।

    বর্তমানে, দুটি ধরণের অডিও প্যাচ প্রয়োজন:

    • প্লেব্যাকের জন্য ডিভাইস প্যাচে মিশ্রিত করুন
    • প্যাচ মিশ্রিত ডিভাইস, রেকর্ডিং জন্য

    পরবর্তী আপডেটে, ডিভাইস থেকে ডিভাইসের জন্য অতিরিক্ত প্যাচের প্রয়োজন হতে পারে।

    একটি অডিও প্যাচ তৈরি করার সময়, যদি প্যাচ হ্যান্ডেলটি নির্দিষ্ট করা না থাকে, তাহলে অডিও HAL-কে একটি অনন্য প্যাচ হ্যান্ডেল তৈরি করতে হবে যা অডিও প্যাচ সনাক্ত করতে পারে। অন্যথায়, অডিও HAL অডিও প্যাচ আপডেট করতে প্রদত্ত অডিও প্যাচ হ্যান্ডেল ব্যবহার করা উচিত।

    যদি একটি লিগ্যাসি অডিও HAL এবং AOSP HIDL র্যাপার ব্যবহার করে, তাহলে লিগ্যাসি অডিও HAL-এর প্রধান HAL সংস্করণ 3.0-এ সেট করা উচিত।

    অডিও প্যাচ বৈশিষ্ট্য সক্রিয় করতে, অডিও HAL-এর প্রধান 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 ব্যবহার করা যেতে পারে যদি বাস্তবায়ন উদ্দেশ্য অনুযায়ী কাজ করে তাহলে যাচাই করতে। সমস্ত পরীক্ষা ভিটিএস ফাইলে পাওয়া যাবে।