এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে অ্যান্ড্রয়েডের অডিও সিস্টেম অগ্রাধিকার পরিবর্তন এড়াতে চেষ্টা করে এবং আপনিও ব্যবহার করতে পারেন এমন কৌশলগুলি হাইলাইট করে।
এই কৌশলগুলি উচ্চ-পারফরম্যান্স অডিও অ্যাপস, OEM এবং SoC প্রদানকারীর বিকাশকারীদের জন্য উপযোগী হতে পারে যারা একটি অডিও HAL বাস্তবায়ন করছে। অনুগ্রহ করে মনে রাখবেন যে এই কৌশলগুলি প্রয়োগ করা ত্রুটি বা অন্যান্য ব্যর্থতা রোধ করার গ্যারান্টিযুক্ত নয়, বিশেষ করে যদি অডিও প্রসঙ্গের বাইরে ব্যবহার করা হয়। আপনার ফলাফল পরিবর্তিত হতে পারে, এবং আপনার নিজের মূল্যায়ন এবং পরীক্ষা পরিচালনা করা উচিত।
পটভূমি
লেটেন্সি কমাতে Android AudioFlinger অডিও সার্ভার এবং AudioTrack/AudioRecord ক্লায়েন্ট বাস্তবায়ন পুনরায় আর্কিটেক্ট করা হচ্ছে। এই কাজটি অ্যান্ড্রয়েড 4.1 এ শুরু হয়েছিল এবং 4.2, 4.3, 4.4 এবং 5.0 এ আরও উন্নতির সাথে চলতে থাকে।
এই কম লেটেন্সি অর্জনের জন্য, পুরো সিস্টেম জুড়ে অনেক পরিবর্তনের প্রয়োজন ছিল। একটি গুরুত্বপূর্ণ পরিবর্তন হল সময়-সমালোচনামূলক থ্রেডগুলিতে আরও অনুমানযোগ্য সময়সূচী নীতি সহ CPU সংস্থানগুলি বরাদ্দ করা। নির্ভরযোগ্য সময়সূচী অডিও বাফারের আকার এবং সংখ্যা হ্রাস করার অনুমতি দেয় এবং এখনও আন্ডাররান এবং ওভাররান এড়িয়ে যায়।
অগ্রাধিকার বিপরীত
প্রায়োরিটি ইনভার্সন হল রিয়েল-টাইম সিস্টেমের একটি ক্লাসিক ব্যর্থতা মোড, যেখানে একটি উচ্চ-অগ্রাধিকার টাস্ক একটি মিউটেক্সের মতো (শেয়ারড স্টেট দ্বারা সুরক্ষিত) একটি রিসোর্স রিলিজ করার জন্য একটি নিম্ন-অগ্রাধিকার টাস্কের জন্য অপেক্ষা করার জন্য একটি সীমাহীন সময়ের জন্য ব্লক করা হয়।
একটি অডিও সিস্টেমে, প্রায়োরিটি ইনভার্সন সাধারণত একটি ত্রুটি (ক্লিক, পপ, ড্রপআউট), বৃত্তাকার বাফার ব্যবহার করা হলে বারবার অডিও , বা কমান্ডের প্রতিক্রিয়া জানাতে বিলম্ব হিসাবে প্রকাশ পায়।
অগ্রাধিকার বিপরীতের জন্য একটি সাধারণ সমাধান হল অডিও বাফার আকার বৃদ্ধি করা। যাইহোক, এই পদ্ধতিটি লেটেন্সি বাড়ায় এবং সমস্যাটি সমাধান করার পরিবর্তে শুধুমাত্র লুকিয়ে রাখে। নীচের মত অগ্রাধিকার বিপরীতে বোঝা এবং প্রতিরোধ করা ভাল।
অ্যান্ড্রয়েড অডিও বাস্তবায়নে, এই জায়গাগুলিতে অগ্রাধিকার বিপরীত হওয়ার সম্ভাবনা সবচেয়ে বেশি। এবং তাই আপনার মনোযোগ এখানে ফোকাস করা উচিত:
- অডিওফ্লিংগারে সাধারণ মিক্সার থ্রেড এবং ফাস্ট মিক্সার থ্রেডের মধ্যে
- একটি দ্রুত অডিওট্র্যাক এবং দ্রুত মিক্সার থ্রেডের জন্য অ্যাপ্লিকেশন কলব্যাক থ্রেডের মধ্যে (তাদের উভয়ের অগ্রাধিকার উন্নত, কিন্তু সামান্য ভিন্ন অগ্রাধিকার)
- একটি দ্রুত অডিও রেকর্ডের জন্য অ্যাপ্লিকেশন কলব্যাক থ্রেড এবং দ্রুত ক্যাপচার থ্রেডের মধ্যে (আগের মতো)
- অডিও হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) বাস্তবায়নের মধ্যে, যেমন টেলিফোনি বা ইকো বাতিলকরণের জন্য
- কার্নেলের অডিও ড্রাইভারের মধ্যে
- AudioTrack বা AudioRecord কলব্যাক থ্রেড এবং অন্যান্য অ্যাপ থ্রেডের মধ্যে (এটি আমাদের নিয়ন্ত্রণের বাইরে)
সাধারণ সমাধান
সাধারণ সমাধানগুলির মধ্যে রয়েছে:
- বাধা নিষ্ক্রিয় করা
- অগ্রাধিকার উত্তরাধিকার mutexes
লিনাক্স ব্যবহারকারী স্পেসে বাধা নিষ্ক্রিয় করা সম্ভব নয় এবং সিমেট্রিক মাল্টি-প্রসেসরের (এসএমপি) জন্য কাজ করে না।
অগ্রাধিকার উত্তরাধিকার futexes (দ্রুত ব্যবহারকারী-স্পেস mutexes) অডিও সিস্টেমে ব্যবহার করা হয় না কারণ তারা তুলনামূলকভাবে হেভিওয়েট, এবং কারণ তারা একটি বিশ্বস্ত ক্লায়েন্টের উপর নির্ভর করে।
অ্যান্ড্রয়েড দ্বারা ব্যবহৃত কৌশল
পরীক্ষাগুলি "লক চেষ্টা করুন" এবং টাইমআউট সহ লক দিয়ে শুরু হয়েছে৷ এগুলি হল মিউটেক্স লক অপারেশনের নন-ব্লকিং এবং বাউন্ডেড ব্লকিং ভেরিয়েন্ট। টাইমআউটের সাথে লক এবং লক করার চেষ্টা করুন মোটামুটি ভাল কাজ করেছে কিন্তু কিছু অস্পষ্ট ব্যর্থতার মোডের জন্য সংবেদনশীল: ক্লায়েন্ট ব্যস্ত থাকলে সার্ভারটি শেয়ার করা অবস্থায় অ্যাক্সেস করতে সক্ষম হবে এমন গ্যারান্টি ছিল না এবং যদি ক্রমবর্ধমান সময়সীমা খুব দীর্ঘ হতে পারে সম্পর্কহীন তালাগুলির একটি দীর্ঘ ক্রম ছিল যা সব সময় শেষ হয়ে গেছে।
আমরা পারমাণবিক অপারেশনগুলিও ব্যবহার করি যেমন:
- বৃদ্ধি
- bitwise "বা"
- bitwise "এবং"
এই সমস্ত পূর্ববর্তী মান প্রদান করে এবং প্রয়োজনীয় SMP বাধা অন্তর্ভুক্ত করে। অসুবিধা হল তাদের সীমাহীন পুনরায় চেষ্টার প্রয়োজন হতে পারে। অনুশীলনে, আমরা খুঁজে পেয়েছি যে পুনঃপ্রচারগুলি কোনও সমস্যা নয়।
দ্রষ্টব্য: পারমাণবিক ক্রিয়াকলাপ এবং মেমরি বাধাগুলির সাথে তাদের মিথস্ক্রিয়াগুলি কুখ্যাতভাবে খারাপভাবে ভুল বোঝাবুঝি এবং ভুলভাবে ব্যবহার করা হয়। আমরা সম্পূর্ণতার জন্য এই পদ্ধতিগুলি এখানে অন্তর্ভুক্ত করি তবে আরও তথ্যের জন্য আপনাকে Android এর জন্য SMP প্রাইমার নিবন্ধটি পড়ার পরামর্শ দিই।
আমরা এখনও উপরের বেশিরভাগ সরঞ্জামগুলি ব্যবহার করি এবং ব্যবহার করি এবং সম্প্রতি এই কৌশলগুলি যুক্ত করেছি:
- ডেটার জন্য নন-ব্লকিং সিঙ্গেল-রিডার একক-রাইটার ফিফো সারি ব্যবহার করুন।
- উচ্চ- এবং নিম্ন-অগ্রাধিকার মডিউলগুলির মধ্যে রাজ্য ভাগ করার পরিবর্তে রাজ্য কপি করার চেষ্টা করুন।
- যখন রাষ্ট্রকে ভাগ করার প্রয়োজন হয়, তখন রাষ্ট্রটিকে সর্বাধিক আকারের শব্দে সীমাবদ্ধ করুন যা পুনরায় চেষ্টা ছাড়াই এক-বাস অপারেশনে পারমাণবিকভাবে অ্যাক্সেস করা যেতে পারে।
- জটিল বহু-শব্দ রাষ্ট্রের জন্য, একটি রাষ্ট্র সারি ব্যবহার করুন। একটি রাষ্ট্র সারি মূলত শুধুমাত্র একটি নন-ব্লকিং একক-পাঠক একক-লেখক FIFO সারি যা ডেটার পরিবর্তে রাষ্ট্রের জন্য ব্যবহৃত হয়, লেখক একটি একক ধাক্কায় সংলগ্ন পুশগুলিকে ভেঙে ফেলা ছাড়া।
- এসএমপি সঠিকতার জন্য মেমরি বাধাগুলিতে মনোযোগ দিন।
- বিশ্বাস কিন্তু যাচাই . প্রক্রিয়াগুলির মধ্যে রাষ্ট্র ভাগ করার সময়, অনুমান করবেন না যে রাষ্ট্রটি সুগঠিত। উদাহরণস্বরূপ, পরীক্ষা করুন যে সূচকগুলি সীমার মধ্যে রয়েছে। এই যাচাইকরণটি একই প্রক্রিয়ার থ্রেডগুলির মধ্যে, পারস্পরিক বিশ্বাসযোগ্য প্রক্রিয়াগুলির মধ্যে (যা সাধারণত একই UID থাকে) প্রয়োজন হয় না৷ এটি PCM অডিওর মতো ভাগ করা ডেটার জন্যও অপ্রয়োজনীয় যেখানে একটি দুর্নীতি অপ্রয়োজনীয়।
নন-ব্লকিং অ্যালগরিদম
নন-ব্লকিং অ্যালগরিদমগুলি সাম্প্রতিক গবেষণার একটি বিষয়। কিন্তু একক-পাঠক একক-লেখক ফিফো সারিগুলি বাদ দিয়ে, আমরা সেগুলিকে জটিল এবং ত্রুটি-প্রবণ বলে খুঁজে পেয়েছি।
Android 4.2 থেকে শুরু করে, আপনি এই অবস্থানগুলিতে আমাদের নন-ব্লকিং, একক-পাঠক/লেখকের ক্লাসগুলি খুঁজে পেতে পারেন:
- ফ্রেমওয়ার্ক/av/include/media/nbaio/
- ফ্রেমওয়ার্ক/av/media/libnbaio/
- ফ্রেমওয়ার্ক/এভি/সার্ভিস/অডিওফ্লিংগার/স্টেট সারি
এগুলি বিশেষভাবে অডিওফ্লিংগারের জন্য ডিজাইন করা হয়েছে এবং সাধারণ উদ্দেশ্য নয়৷ অ-ব্লকিং অ্যালগরিদমগুলি ডিবাগ করা কঠিন হওয়ার জন্য কুখ্যাত। আপনি একটি মডেল হিসাবে এই কোড দেখতে পারেন. তবে সচেতন থাকুন বাগ থাকতে পারে, এবং ক্লাসগুলি অন্যান্য উদ্দেশ্যে উপযুক্ত হওয়ার নিশ্চয়তা দেওয়া হয় না।
ডেভেলপারদের জন্য, নন-ব্লকিং অ্যালগরিদম ব্যবহার করতে বা একটি নন-অ্যান্ড্রয়েড ওপেন সোর্স লাইব্রেরি উল্লেখ করার জন্য কিছু নমুনা OpenSL ES অ্যাপ্লিকেশন কোড আপডেট করা উচিত।
আমরা একটি নন-ব্লকিং FIFO বাস্তবায়নের উদাহরণ প্রকাশ করেছি যা বিশেষভাবে অ্যাপ্লিকেশন কোডের জন্য ডিজাইন করা হয়েছে। প্ল্যাটফর্ম সোর্স ডিরেক্টরি frameworks/av/audio_utils
এ অবস্থিত এই ফাইলগুলি দেখুন:
টুলস
আমাদের সর্বোত্তম জ্ঞান অনুসারে, অগ্রাধিকার বিপরীত অনুসন্ধানের জন্য কোন স্বয়ংক্রিয় সরঞ্জাম নেই, বিশেষ করে এটি হওয়ার আগে। কিছু গবেষণা স্ট্যাটিক কোড বিশ্লেষণ সরঞ্জাম পুরো কোডবেস অ্যাক্সেস করতে সক্ষম হলে অগ্রাধিকার বিপর্যয় খুঁজে পেতে সক্ষম। অবশ্যই, যদি নির্বিচারে ব্যবহারকারী কোড জড়িত থাকে (যেমন এটি এখানে অ্যাপ্লিকেশনের জন্য) বা একটি বড় কোডবেস হয় (লিনাক্স কার্নেল এবং ডিভাইস ড্রাইভারগুলির জন্য), স্ট্যাটিক বিশ্লেষণ অব্যবহারিক হতে পারে। সবচেয়ে গুরুত্বপূর্ণ বিষয় হল কোডটি খুব সাবধানে পড়া এবং পুরো সিস্টেম এবং মিথস্ক্রিয়াগুলির উপর একটি ভাল উপলব্ধি করা। systrace এবং ps -t -p
এর মতো সরঞ্জামগুলি এটি হওয়ার পরে অগ্রাধিকার বিপরীত দেখার জন্য উপযোগী, তবে আপনাকে আগে থেকে বলবে না।
একটি চূড়ান্ত শব্দ
এই সব আলোচনার পরে, mutexes ভয় পাবেন না. Mutexes সাধারণ ব্যবহারের জন্য আপনার বন্ধু, যখন সাধারণ অ-সময়-সমালোচনা ক্ষেত্রে ব্যবহার করা হয় এবং সঠিকভাবে প্রয়োগ করা হয়। কিন্তু উচ্চ- এবং নিম্ন-প্রধান কাজগুলির মধ্যে এবং সময়-সংবেদনশীল সিস্টেমে মিউটেক্সগুলি সমস্যা সৃষ্টি করার সম্ভাবনা বেশি।