অডিও লেটেন্সি কমাতে ভেন্ডররা দুটি গুরুত্বপূর্ণ ফিচার প্রয়োগ করতে পারেন:
- AudioFlinger-এ FAST মিক্সার: Android 4.1-এ চালু করা হয়েছে, এই ফিচার Java AudioTrack ও AAudio ব্যবহার করা অ্যাপে কাজ করে। FAST মিক্সারে খুব কম পাবলিক ক্লায়েন্ট API বা HAL API পরিবর্তন করা হয়।
- AAudio MMAP: Android 8.1-এ চালু করা হয়েছে, এই ফিচারের মাধ্যমে নেটিভ অ্যাপগুলি AAudio-এর মাধ্যমে আরও কম লেটেন্সি অর্জন করতে পারে। আরও তথ্যের জন্য AAudio ও MMAP দেখুন।
এই পৃষ্ঠায় প্রাথমিক অডিও লেটেন্সি ডিজাইন সম্পর্কে বর্ণনা করা হয়েছে, যা সময়ের সাথে সাথে আরও উন্নত হয়েছে। ডিভাইস OEM এবং SoC ভেন্ডরদের জন্য এই ডিজাইনটি ভালোভাবে বোঝা অত্যন্ত গুরুত্বপূর্ণ যাতে তারা তাদের নির্দিষ্ট ডিভাইস এবং চিপসেটে সঠিক বাস্তবায়ন নিশ্চিত করতে পারে। এই পৃষ্ঠাটি অ্যাপ ডেভেলপারদের জন্য তৈরি করা হয়নি।
ট্র্যাক তৈরি করা
ক্লায়েন্ট ঐচ্ছিকভাবে AudioTrack C++ কনস্ট্রাক্টর বা
AudioTrack::set()-এর
audio_output_flags_t প্যারামিটারে বিট AUDIO_OUTPUT_FLAG_FAST সেট করতে পারে। বর্তমানে, শুধুমাত্র এইসব ক্লায়েন্টই এটি করে:
- OpenSL ES বা AAudio-এর উপর ভিত্তি করে Android নেটিভ অডিও
android.media.SoundPoolandroid.media.ToneGenerator
AudioTrack C++ ইমপ্লিমেন্টেশন AUDIO_OUTPUT_FLAG_FAST
অনুরোধ পর্যালোচনা করে এবং ক্লায়েন্ট লেভেলে ঐচ্ছিকভাবে অনুরোধ প্রত্যাখ্যান করতে পারে। এটি যদি
অনুরোধটি পাস করার সিদ্ধান্ত নেয়, তাহলে এটি IAudioTrack ফ্যাক্টরি পদ্ধতির
IAudioFlinger::createTrack() TRACK_FAST বিট ব্যবহার করে তা করে।
track_flags_t
AudioFlinger অডিও সার্ভার TRACK_FAST অনুরোধ পর্যালোচনা করে এবং
ঐচ্ছিকভাবে সার্ভার লেভেলে অনুরোধ প্রত্যাখ্যান করতে পারে। শেয়ার করা মেমরি কন্ট্রোল ব্লকের
বিট CBLK_FAST-এর মাধ্যমে
অনুরোধটি গ্রহণ করা হয়েছে কিনা তা ক্লায়েন্টকে জানানো হয়।
সিদ্ধান্তের উপর প্রভাব বিস্তারকারী বিষয়গুলির মধ্যে রয়েছে:
- এই আউটপুটের জন্য একটি ফাস্ট মিক্সার থ্রেডের উপস্থিতি (নিচে দেখুন)
- ট্র্যাক স্যাম্পেল রেট
- এই ট্র্যাকের জন্য কলব্যাক হ্যান্ডলার এক্সিকিউট করতে ক্লায়েন্ট থ্রেডের উপস্থিতি
- ট্র্যাক বাফার সাইজ
- উপলভ্য ফাস্ট ট্র্যাক স্লট (নিচে দেখুন)
ক্লায়েন্টের অনুরোধ গ্রহণ করা হলে, এটিকে ফাস্ট ট্র্যাক বলা হয়। অন্যথায়, এটিকে সাধারণ ট্র্যাক বলা হয়।
মিক্সার থ্রেড
AudioFlinger যখন সাধারণ মিক্সার থ্রেড তৈরি করে, তখন এটি সিদ্ধান্ত নেয় যে ফাস্ট মিক্সার থ্রেডও তৈরি করা হবে কিনা। সাধারণ মিক্সার এবং ফাস্ট মিক্সার, কোনওটিই নির্দিষ্ট কোনও ট্র্যাকের সাথে যুক্ত নয়, বরং ট্র্যাকের একটি সেটের সাথে যুক্ত। সবসময় একটি সাধারণ মিক্সার থ্রেড থাকে। ফাস্ট মিক্সার থ্রেড, যদি থাকে, তাহলে তা সাধারণ মিক্সার থ্রেডের অধীনস্থ এবং তার নিয়ন্ত্রণে কাজ করে।
ফাস্ট মিক্সার
ফিচার
ফাস্ট মিক্সার থ্রেড এইসব ফিচার প্রদান করে:
- সাধারণ মিক্সারের সাব-মিক্স এবং সর্বাধিক সাতটি ক্লায়েন্ট ফাস্ট ট্র্যাকের মিক্সিং
- প্রতিটি ট্র্যাকের অ্যাটেন্যুয়েশন
বাদ দেওয়া ফিচার:
- প্রতি ট্র্যাকের স্যাম্পেল রেট কনভার্সন
- প্রতি ট্র্যাক এফেক্ট
- প্রতিটি মিক্সের এফেক্ট
সময়কাল
দ্রুত মিক্সারটি নির্দিষ্ট সময় অন্তর চলে, এর জন্য দুই থেকে তিন মিলিসেকেন্ডের সাজেশন দেওয়া সময়সীমা অথবা শিডিউল স্থিতিশীলতার জন্য প্রয়োজন হলে ৫ ms-এর সামান্য বেশি সময়সীমা সাজেস্ট করা হয়। এই সংখ্যাটি এমনভাবে বেছে নেওয়া হয়েছে যাতে সম্পূর্ণ বাফার পাইপলাইনকে বিবেচনা করলে, মোট লেটেন্সি ১০ মিলি সেকেন্ডের মতো হয়। এর থেকে ছোট মানও ব্যবহার করা যেতে পারে, তবে এর ফলে CPU শিডিউলিংয়ের পূর্বাভাসযোগ্যতার উপর নির্ভর করে বিদ্যুৎ খরচ বেড়ে যেতে পারে এবং গ্লিচ হওয়ার সম্ভাবনাও বেড়ে যেতে পারে। ২০ মিলিসেকেন্ড পর্যন্ত আরও বেশি মান সম্ভব, তবে এর ফলে মোট লেটেন্সি কমে যায় এবং তাই এটি এড়িয়ে যাওয়া উচিত।
সমস্ত সম্পদ সার্চ
ফাস্ট মিক্সার উন্নত SCHED_FIFO প্রায়োরিটিতে রান করে। এটির খুব
কম সিপিইউ (CPU) টাইম প্রয়োজন, কিন্তু এটি প্রায়ই এবং কম শিডিউলিং জিটার সহ চলতে হবে।
জিটার
সাইকেল টাইমের পরিবর্তনকে বোঝায়: এটি হল
প্রকৃত সাইকেল টাইম ও প্রত্যাশিত সাইকেল টাইমের মধ্যে পার্থক্য।
খুব দেরিতে চলার ফলে আন্ডাররানের কারণে সমস্যা হয়। ট্র্যাক ডেটা দেওয়ার আগেই
ফাস্ট ট্র্যাক থেকে ডেটা নেওয়ার ফলে
খুব তাড়াতাড়ি রান করালে গ্লিচ হয়।
ব্লক করা হচ্ছে
আদর্শভাবে, ফাস্ট মিক্সার থ্রেড HAL
write() ছাড়া অন্য কোথাও ব্লক হয় না। ফাস্ট মিক্সারের মধ্যে ব্লকিংয়ের অন্যান্য ঘটনাকে
সমস্যা হিসেবে বিবেচনা করা হয়। বিশেষ করে, মিউটেক্স এড়ানো হয়।
পরিবর্তে, নন-ব্লকিং অ্যালগরিদম
(লক-ফ্রি অ্যালগরিদম নামেও পরিচিত) ব্যবহার করা হয়।
এই বিষয়ে আরও জানতে অগ্রাধিকার ইনভার্সন এড়ানো দেখুন।
অন্যান্য কম্পোনেন্টের সাথে সম্পর্ক
দ্রুত মিক্সারের ক্লায়েন্টদের সাথে সরাসরি ইন্টার্যাকশন কম হয়। বিশেষ করে, এটি বাইন্ডার-লেভেল অপারেশন দেখতে পায় না, তবে এটি ক্লায়েন্টের শেয়ার করা মেমরি কন্ট্রোল ব্লক অ্যাক্সেস করে।
দ্রুত মিক্সার, স্টেট কোয়ের মাধ্যমে সাধারণ মিক্সারের থেকে কমান্ড পায়।
ট্র্যাক ডেটা পুল করা ছাড়াও, ক্লায়েন্টদের সাথে ইন্টারঅ্যাকশন সাধারণ মিক্সারের মাধ্যমে হয়।
দ্রুত মিক্সারের প্রাথমিক সিঙ্ক হল অডিও HAL।
সাধারণ মিক্সার
ফিচার
সব ফিচার চালু করা আছে:
- সর্বাধিক ৩২টি ট্র্যাক
- ট্র্যাক প্রতি অ্যাটেনুয়েশন
- প্রতি ট্র্যাকের স্যাম্পেল রেট কনভার্সন
- এফেক্ট প্রসেসিং
সময়কাল
এই সময়সীমাটি দ্রুত মিক্সার পিরিয়ডের প্রথম ইন্টিগ্রাল মাল্টিপল হিসেবে গণনা করা হয় যা >= ২০ ms হয়।
সমস্ত সম্পদ সার্চ
সাধারণ মিক্সার বেশি SCHED_OTHER অগ্রাধিকার নিয়ে রান করে।
ব্লক করা হচ্ছে
সাধারণ মিক্সারকে ব্লক করার অনুমতি দেওয়া হয় এবং এটি প্রায়শই বিভিন্ন মিউটেক্সের পাশাপাশি এর সাব-মিক্স লেখার জন্য একটি ব্লকিং পাইপে তা করে।
অন্যান্য কম্পোনেন্টের সাথে সম্পর্ক
সাধারণ মিক্সারটি বাইন্ডার থ্রেড, অডিও পলিসি ম্যানেজার, ফাস্ট মিক্সার থ্রেড এবং ক্লায়েন্ট ট্র্যাক সহ বাইরের জগতের সাথে ব্যাপকভাবে ইন্টার্যাক্ট করে।
সাধারণ মিক্সারের সিঙ্ক হল ফাস্ট মিক্সারের ট্র্যাক ০-এর একটি ব্লকিং পাইপ।
পতাকা
AUDIO_OUTPUT_FLAG_FAST বিট হল একটি ইঙ্গিত। অনুরোধ পূরণ করা হবে
এমন কোনও গ্যারান্টি নেই।
AUDIO_OUTPUT_FLAG_FAST হল ক্লায়েন্ট-লেভেল কনসেপ্ট। এটি সার্ভারে
দেখা যায় না।
TRACK_FAST হল ক্লায়েন্ট -> সার্ভার কনসেপ্ট।