একটি লজিক্যাল স্ট্রিম শুরু করার আগে, অ্যাপটি সেই লজিক্যাল স্ট্রিমের জন্য ব্যবহৃত একই অডিও অ্যাট্রিবিউট ব্যবহার করে অডিও ফোকাসের জন্য অনুরোধ করে। অটোমোটিভ ব্যবহারের ক্ষেত্রে প্রত্যাশিতভাবে কাজ করার জন্য অ্যাপটিকে অবশ্যই ফোকাস হারানোর বিষয়টি মেনে চলতে হবে।
যদিও ফোকাস রিকোয়েস্ট পাঠানো বাঞ্ছনীয়, সিস্টেম এটি বাধ্যতামূলক করে না। তাই, ফোকাসকে প্রাথমিক অডিও কন্ট্রোল ব্যবস্থা হিসেবে না দেখে, প্লেব্যাকের সময় পরোক্ষভাবে নিয়ন্ত্রণ এবং দ্বন্দ্ব এড়ানোর একটি উপায় হিসেবে বিবেচনা করুন। অডিও সাবসিস্টেম পরিচালনার জন্য যানবাহনটির ফোকাস সিস্টেমের উপর নির্ভর করা উচিত নয়।
ফোকাস মিথস্ক্রিয়া
AAOS সমর্থন করার জন্য, অডিও ফোকাস অনুরোধগুলি অনুরোধের CarAudioContext এবং বর্তমান ফোকাস হোল্ডারদের CarAudioContext-এর মধ্যে পূর্বনির্ধারিত মিথস্ক্রিয়ার উপর ভিত্তি করে পরিচালনা করা হয়। এই মিথস্ক্রিয়া তিন প্রকারের হয়ে থাকে:
- একচেটিয়া
- প্রত্যাখ্যান করুন
- একই সময়ে
একচেটিয়া মিথস্ক্রিয়া
এটিই অ্যান্ড্রয়েডের সাথে সবচেয়ে বেশি ব্যবহৃত ইন্টারঅ্যাকশন মডেল।
এক্সক্লুসিভ ইন্টারঅ্যাকশনের ক্ষেত্রে, একবারে শুধুমাত্র একটি অ্যাপই ফোকাস ধরে রাখতে পারে। তাই, একটি নতুন ফোকাস রিকোয়েস্টকে ফোকাস দেওয়া হয় এবং বিদ্যমান ফোকাস হোল্ডার ফোকাস হারায়। যেহেতু উভয় অ্যাপই মিডিয়া প্লে করে, তাই শুধুমাত্র একটি অ্যাপই ফোকাস ধরে রাখতে পারে। ফলস্বরূপ, নতুন চালু হওয়া অ্যাপটির ফোকাস রিকোয়েস্ট AUDIOFOCUS_REQUEST_GRANTED সহ ফেরত আসে, এবং বর্তমানে প্লে হওয়া মিউজিক অ্যাপটি একটি লস স্ট্যাটাস সহ ফোকাস পরিবর্তনের ইভেন্ট পায়, যা করা রিকোয়েস্টের ধরনের সাথে সামঞ্জস্যপূর্ণ।
মিথস্ক্রিয়া প্রত্যাখ্যান করুন
রিজেক্ট ইন্টারঅ্যাকশনের ক্ষেত্রে, আগত অনুরোধটি সর্বদা প্রত্যাখ্যাত হয়। উদাহরণস্বরূপ, কল চলাকালীন গান চালানোর চেষ্টা করার সময়। এক্ষেত্রে, যদি ডায়ালার একটি কলের জন্য অডিও ফোকাস ধরে রাখে এবং দ্বিতীয় কোনো অ্যাপ গান চালানোর জন্য ফোকাসের অনুরোধ করে, তাহলে অনুরোধটির জবাবে মিউজিক অ্যাপটি AUDIOFOCUS_REQUEST_FAILED বার্তাটি পায়। যেহেতু ফোকাসের অনুরোধটি প্রত্যাখ্যাত হয়, তাই বর্তমান ফোকাসধারীর কাছে কোনো ফোকাস হারানোর বার্তা পাঠানো হয় না।
যুগপৎ মিথস্ক্রিয়া
AAOS-এর একটি অনন্য বৈশিষ্ট্য হলো যুগপৎ মিথস্ক্রিয়া। এর ফলে, গাড়িতে অডিও ফোকাসের জন্য অনুরোধকারী অ্যাপগুলো অন্যান্য অ্যাপের সাথে একই সময়ে ফোকাস ধরে রাখতে পারে। একটি যুগপৎ মিথস্ক্রিয়া ঘটার জন্য নিম্নলিখিত শর্তগুলো অবশ্যই পূরণ করতে হবে:
আগত ফোকাস অনুরোধে অবশ্যই AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK- এর জন্য অনুরোধ করতে হবে।
বর্তমান ফোকাস হোল্ডার setPauseWhenDucked(true) সেট করে না।
বর্তমান ফোকাস হোল্ডার হাঁসের ইভেন্টগুলি গ্রহণ না করার সিদ্ধান্ত নিয়েছেন।
যদি এই শর্তগুলো পূরণ হয়, তাহলে ফোকাস অনুরোধটি AUDIOFOCUS_REQUEST_GRANTED সহ ফেরত আসে, কিন্তু বর্তমান ফোকাসধারীর ফোকাসে কোনো পরিবর্তন হয় না। তবে, যদি বর্তমান ফোকাসধারী ডাক ইভেন্ট গ্রহণ করতে বা ডাক করার সময় বিরতি নিতে পছন্দ করেন, তাহলে তিনি ফোকাস হারান, যেমনটি একটি এক্সক্লুসিভ ইন্টারঅ্যাকশনের ক্ষেত্রে ঘটে থাকে।
একই সাথে একাধিক স্ট্রিম পরিচালনা করুন
যদিও যুগপৎ ইন্টারঅ্যাকশনের বহুবিধ ব্যবহার রয়েছে, আউটপুট ডিভাইসগুলোর মধ্যে হার্ডওয়্যার পর্যায়ে মিক্সিং এবং ডাকিং-এর ক্ষেত্রে সতর্ক থাকুন। আমরা দৃঢ়ভাবে সুপারিশ করি যে, CarAudioContext এর যে ইনস্ট্যান্সগুলোকে যুগপৎভাবে প্লে করার অনুমতি দেওয়া হয়, সেগুলোকে ভিন্ন ভিন্ন আউটপুট ডিভাইসে রাউট করা উচিত।
একই সাথে একাধিক স্ট্রিমের জন্য আলাদা আউটপুট ডিভাইস থাকায়, HAL সেগুলোকে মিক্স করার আগে যেকোনো একটি স্ট্রিমকে থামিয়ে দিতে পারে, অথবা ফিজিক্যাল স্ট্রিমগুলোকে গাড়ির বিভিন্ন স্পিকারে পাঠাতে পারে। যদি লজিক্যাল স্ট্রিমগুলো অ্যান্ড্রয়েডের মধ্যেই মিক্স করা হয়, তাহলে গেইন অপরিবর্তিত থাকে এবং একই ফিজিক্যাল স্ট্রিমের অংশ হিসেবেই সরবরাহ করা হয়।
উদাহরণস্বরূপ, যখন নেভিগেশন এবং মিডিয়া একই সাথে পরিবেশিত হয়, তখন মিডিয়া স্ট্রিমের গেইন সাময়িকভাবে কমিয়ে আনা (বা, সংকুচিত করা) যেতে পারে, যাতে নেভিগেশনের নির্দেশনাগুলো আরও স্পষ্টভাবে শোনা যায়। বিকল্পভাবে, নেভিগেশন স্ট্রিমটি ড্রাইভারের দিকের স্পিকারগুলোতে পাঠানো যেতে পারে, এবং একই সাথে কেবিনের বাকি অংশে মিডিয়া চলতে থাকতে পারে।
মিথস্ক্রিয়া ম্যাট্রিক্স
এই সারণিটি CarAudioService দ্বারা সংজ্ঞায়িত ইন্টারঅ্যাকশন ম্যাট্রিক্সটি দেখায়। প্রতিটি সারি বর্তমান ফোকাস হোল্ডারের CarAudioContext এবং প্রতিটি কলাম আগত অনুরোধের CarAudioContext-কে উপস্থাপন করে।
উদাহরণস্বরূপ, যখন একটি নেভিগেশন অ্যাপ ফোকাসের জন্য অনুরোধ করার সময় একটি মিউজিক মিডিয়া অ্যাপ ফোকাস ধরে রাখে, তখন ম্যাট্রিক্সটি নির্দেশ করে যে দুটি ইন্টারঅ্যাকশন একই সাথে চলতে পারে, যদি যুগপৎ ইন্টারঅ্যাকশনের জন্য অন্যান্য শর্তগুলো পূরণ হয়।
যুগপৎ ইন্টারঅ্যাকশনের কারণে একাধিক ফোকাস হোল্ডার থাকা সম্ভব। এক্ষেত্রে, কোন ইন্টারঅ্যাকশনটি প্রয়োগ করা হবে তা নির্ধারণ করার আগে, আগত ফোকাস অনুরোধটিকে বর্তমান প্রত্যেক ফোকাস হোল্ডারের সাথে তুলনা করা হয়। এক্ষেত্রে, সবচেয়ে রক্ষণশীল ইন্টারঅ্যাকশনটিই প্রাধান্য পায়। প্রথমে রিজেক্ট, তারপর এক্সক্লুসিভ এবং সবশেষে কনকারেন্ট।
চিত্র ১. অডিও ফোকাস ইন্টারঅ্যাকশন ম্যাট্রিক্স।
ফোন কলের সময় নেভিগেশন
অ্যান্ড্রয়েড ১১-এ একটি নতুন ইউজার সেটিং চালু করা হয়েছে, যা ব্যবহারকারীদের নেভিগেশন এবং ফোন কলের মধ্যেকার ইন্টারঅ্যাকশন আচরণ পরিবর্তন করার সুযোগ দেয়। এই সেটিংটি সেট করা হলে, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL নামক সেটিংটি আগত NAVIGATION ফোকাস রিকোয়েস্ট এবং বর্তমান CALL ফোকাস হোল্ডারদের মধ্যেকার ইন্টারঅ্যাকশনকে 'কনকারেন্ট ' থেকে ' রিজেক্টস' -এ পরিবর্তন করে দেয়। যদি কোনো ব্যবহারকারী চান যে নেভিগেশন নির্দেশনা যেন কলে বাধা না দেয়, তবে তিনি এই সেটিংটি চালু করতে পারেন। এই পরিবর্তনটি ব্যবহারকারীর জন্য স্থায়ী থাকে এবং এটি ডাইনামিকভাবেও সেট করা যায়, যাতে পরবর্তী ফোকাস রিকোয়েস্টগুলো এই নতুন সেটিংটি মেনে চলে।
বিলম্বিত অডিও ফোকাস
অ্যান্ড্রয়েড ১১-এ, AAOS বিলম্বিত অডিও ফোকাসের জন্য অনুরোধ করার সুবিধা যোগ করেছে। এর ফলে, যখন কোনো নন-ট্রানজিয়েন্ট ফোকাস অনুরোধ বর্তমান ফোকাস হোল্ডারদের সাথে মিথস্ক্রিয়ার কারণে সাধারণত প্রত্যাখ্যাত হয়ে যায়, তখন সেটিকে বিলম্বিত করা যায়। ফোকাসের পরিবর্তনের ফলে যখন বিলম্বিত অনুরোধটি ফোকাস পাওয়ার মতো অবস্থায় আসে, তখন সেই অনুরোধটি মঞ্জুর করা হয়।
বিলম্বিত অডিও ফোকাস অনুরোধের নিয়মাবলী
শুধুমাত্র অ-ক্ষণস্থায়ী অনুরোধের জন্য। একটি ক্ষণস্থায়ী শব্দকে তার প্রাসঙ্গিকতা শেষ হওয়ার অনেক পরেও বাজতে দেওয়া এড়ানোর জন্য, শুধুমাত্র অ-ক্ষণস্থায়ী উৎসের ক্ষেত্রেই একটি বিলম্বিত অনুরোধ করা যেতে পারে।
একবারে কেবল একটি অনুরোধই বিলম্বিত করা যায়। যদি আগে থেকেই একটি বিলম্বিত অনুরোধ থাকা অবস্থায় একটি বিলম্বযোগ্য অনুরোধ করা হয়, তবে মূল বিলম্বিত অনুরোধটি একটি
AUDIOFOCUS_LOSSচেঞ্জ ইভেন্ট পায় এবং নতুন অনুরোধটিAUDIOFOCUS_REQUEST_DELAYEDএর একটি সিনক্রোনাস রেসপন্স পায়।বিলম্বযোগ্য অনুরোধগুলিতে অবশ্যই
OnAudioFocusChangeListenerথাকতে হবে। কোনো অনুরোধ বিলম্বিত হওয়ার পর, অনুরোধটি অবশেষে মঞ্জুর হলে (AUDIOFOCUS_GAIN), অথবা পরে প্রত্যাখ্যাত হলে (AUDIOFOCUS_LOSS) অনুরোধকারীকে জানানোর জন্য এই লিসেনারটি ব্যবহৃত হয়।
বিলম্বিত ফোকাসের জন্য অনুরোধ করুন
বিলম্বিত করা যায় এমন একটি অনুরোধ তৈরি করতে:
AudioFocusRequest.Builder#setAcceptsDelayedFocusGainব্যবহার করুন।mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();অনুরোধ করার সময়,
AUDIOFOCUS_REQUEST_DELAYEDপ্রতিক্রিয়াটি পরিচালনা করুন:int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest); if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // start audio playback return; } if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) { // audio playback delayed to audio focus listener return; }অনুরোধে বিলম্ব হলে, ফোকাস লিসেনার ফোকাসের পরিবর্তনগুলি পরিচালনা করে:
private final class MediaWithDelayedFocusListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { synchronized (mLock) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: … // Start focus playback case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: … // Pause media transiently case AudioManager.AUDIOFOCUS_LOSS: … // Stop media
সিস্টেম দ্বারা আরোপিত ফেড
অ্যান্ড্রয়েড ১৫-এ AAOS-এ সিস্টেম-নিয়ন্ত্রিত অডিও ফেড ফিচার চালু করা হয়েছে। অ্যান্ড্রয়েডে, অডিও ফোকাস সিস্টেম দ্বারা নিয়ন্ত্রিত হয় না। তাই, অ্যাপ ডেভেলপারদের অডিও ফোকাসের নির্দেশিকা মেনে চলতে উৎসাহিত করা হলেও, কোনো অ্যাপ অডিও ফোকাস হারানোর পরেও যদি উচ্চস্বরে বাজতে থাকে, তবে সিস্টেম তা আটকাতে পারে না।
নিরাপত্তামূলক যানবাহন পরিবেশে, চালকের মনোযোগের বিচ্যুতি কমাতে অডিও ফোকাস বজায় রাখা অত্যাবশ্যক। এই ফিচারের মাধ্যমে, অডিও ফ্রেমওয়ার্ক এখন স্বয়ংক্রিয়ভাবে সেইসব অ্যাপকে ফেড করে দেয় যেগুলো অডিও ফোকাস হারায়, ফলে আরও নিয়ন্ত্রিত এবং অনুমানযোগ্য অডিও অভিজ্ঞতা পাওয়া যায়।
এই উন্নয়নটি নিশ্চিত করে যে অ্যাপগুলি ইন্টারঅ্যাকশন ম্যাট্রিক্স দ্বারা সংজ্ঞায়িত অডিও ফোকাস হারানোর সিদ্ধান্ত মেনে চলে, যা অডিও প্লেব্যাকের দ্বন্দ্ব প্রতিরোধ করে।
উচ্চ-স্তরের ডিজাইন
নিম্নলিখিত চিত্রে গাড়িগুলিতে ফোকাস লস ফিচারের উচ্চ-স্তরের ডিজাইন এবং সাপোর্ট দেখানো হয়েছে:

চিত্র ২. সিস্টেম-প্রবর্তিত ফেড ফিচারের উচ্চ-স্তরের ডিজাইন।
- নির্দিষ্ট ফেডিং: অ্যান্ড্রয়েড ১৫-এ ফেডিং-এর সিস্টেম প্রয়োগ বিশেষভাবে এমন পরিস্থিতির জন্য ডিজাইন করা হয়েছে, যেখানে কোনো অ্যাপ অডিও ফোকাস হারালেও অডিও বাজতে থাকে।
- ফেড-আউট প্রক্রিয়া: যখন কোনো অ্যাপ নতুন অনুরোধকারী অ্যাপের কাছে তার অডিও ফোকাস হারায়:
- অডিও ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে হেরে যাওয়া অ্যাপের অডিওটি ধীরে ধীরে মিলিয়ে দেয়।
- ফেড-আউটের পর, সিস্টেম দ্বারা অডিও স্ট্রিমটি নীরব করে দেওয়া হয়।
- এরপর অ্যাপটি একটি অডিও ফোকাস হারানোর নোটিফিকেশন পায়।
- অসদাচরণকারী অ্যাপগুলো পুনরায় অডিও ফোকাসে না আসা পর্যন্ত নীরব করে রাখা হয়।
- ডিফল্ট লজিক হলো, যে অ্যাপগুলো ২ সেকেন্ড পর ফেড আউট হয়ে যায়, সেগুলোকে ফেড ইন করা। তবে, OEM-রা এটিকে যেকোনো টাইমআউট ভ্যালুতে কনফিগার করতে পারেন।
- অডিও ফ্রেমওয়ার্কটি ফেড-আউট এবং ফেড-ইন উভয় অপারেশনের জন্য OEM কনফিগ ব্যবহার করে।
OEM কনফিগারেশন ফাইল: Android 15-এ একটি নতুন কনফিগারেশন ফাইল অন্তর্ভুক্ত করা হয়েছে,
car_audio_fade_configuration.xml:- এই ফাইলটি OEM-দেরকে সেইসব মানদণ্ড নির্ধারণ করার সুযোগ দেয়, যার মাধ্যমে কোনো পরাজিত অ্যাপের ক্ষেত্রে সিস্টেমের অডিও ফোকাস এনফোর্সমেন্ট কখন প্রয়োগ করা হবে তা ঠিক করা যায়।
- অডিও ফ্রেমওয়ার্কটি ফেড-আউট এবং সাইলেন্সিং শুধুমাত্র তখনই প্রয়োগ করে, যখন পরাজিত অ্যাপটি এই XML ফাইলে থাকা OEM-নির্ধারিত নিয়মগুলোর সাথে মেলে।
- এটি OEM-দেরকে অ্যাপের বৈশিষ্ট্য বা অডিও ব্যবহারের ধরনের ওপর ভিত্তি করে ফিচারটির আচরণ কাস্টমাইজ করার একটি ব্যবস্থা প্রদান করে।
RRO-এর মাধ্যমে ফিচার নিয়ন্ত্রণ: এই ফিচারটি চালু বা বন্ধ করার জন্য
audioUseFadeManagerConfigurationনামে একটি নতুন রানটাইম রিসোর্স ওভারলে (RRO) ফিচার ফ্ল্যাগ চালু করা হয়েছে:- ফিচারটি ডিফল্টরূপে নিষ্ক্রিয় থাকে।
- সিস্টেম-প্রবর্তিত অডিও ফোকাস লস সক্রিয় করতে, OEM-দের অবশ্যই এই ফ্ল্যাগটি '
trueতে সেট করতে হবে। - যদিও ফ্ল্যাগটি সক্রিয় করা হলে কার অডিও ফ্রেমওয়ার্ক বৈধ ফেড কনফিগারেশন ডেফিনিশন আশা করে, এই ধরনের ডেফিনিশনের অনুপস্থিতি স্বয়ংক্রিয়ভাবে কোনো মারাত্মক ব্যতিক্রম ঘটায় না।
- ফেড কনফিগের সমস্ত অ্যাপে অবশ্যই মিল থাকা ফেড ডেফিনিশন থাকতে হবে। বৈধ ডেফিনিশন প্রদান না করে কার অডিও কনফিগারেশনের অংশ হিসেবে কোনো ফেড কনফিগকে (তার নাম ধরে) উল্লেখ করা একটি মারাত্মক ত্রুটি।
- যখন ফ্ল্যাগটি নিষ্ক্রিয় থাকে, তখন সমস্ত ফেড কনফিগারেশন সংজ্ঞা এবং যেকোনো কনফিগারেশন রেফারেন্স উপেক্ষা করা হয়।
ফেড ম্যানেজার কনফিগারেশন
অ্যান্ড্রয়েড ১৫ অডিও ফ্রেমওয়ার্ক একটি সমন্বিত FadeManagerConfiguration চালু করেছে, যা OEM-দের অডিও ফেডিং আচরণের উপর সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে। এই ফ্রেমওয়ার্কটি চিত্র ৩-এ দেখানো হয়েছে:

চিত্র ৩. ফেড ম্যানেজার কনফিগারেশন।
এই কনফিগারেশনে অন্তর্ভুক্ত রয়েছে:
- ফেড ট্রানজিশন প্রোপার্টিজ: ফেড-আউট এবং ফেড-ইন উভয়ের জন্য সেটিংস।
- নির্দিষ্ট অডিও ব্যবহার বা বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা যেতে পারে।
- নিজস্ব সময়কাল নির্ধারণের সুযোগ রয়েছে।
- এই সেটিংগুলো
VolumeShaper.Configurationতৈরি করতে ব্যবহৃত হয়।
- বিবর্ণতা নীতিমালা: কখন বিবর্ণতা ঘটবে তা নির্ধারণকারী নিয়মাবলী।
- ফেডিং চালু বা বন্ধ করার জন্য একটি গ্লোবাল টগল।
- ফেডেবল অডিও ব্যবহারের একটি কনফিগারযোগ্য তালিকা (ফোকাস হারালে যা ফেড-আউট হওয়ার যোগ্য)।
- বর্জন তালিকা (অপরিবর্তনীয়) গুরুত্বপূর্ণ বা নির্দিষ্ট অডিও উৎসগুলোকে ম্লান হওয়া থেকে বিরত রাখে। এই তালিকাগুলো নিম্নলিখিত বিষয়ের উপর ভিত্তি করে তৈরি হতে পারে:
- বিষয়বস্তুর প্রকার
- অডিও বৈশিষ্ট্য
- অ্যাপ ইউআইডি (শুধুমাত্র রানটাইমে সেট করা যাবে)
OEM কনফিগারেশন
এই অংশে, আমরা উপলব্ধ OEM কাস্টমাইজেশনগুলো নিয়ে আলোচনা করব।
গাড়ির অডিও ফেড কনফিগারেশন XML ফাইল
অ্যান্ড্রয়েড ১৫-এ car_audio_fade_configuration.xml নামে একটি নতুন কনফিগারেশন ফাইল যুক্ত করা হয়েছে, যা ফোকাস হারানোর সময় অডিও ফেড-আউট আচরণের ব্যাপক OEM কাস্টমাইজেশনের সুযোগ দেয়।
- এই XML ফাইলটি একাধিক স্বতন্ত্র ফেড কনফিগারেশন নির্ধারণের সুযোগ দেয়, যার প্রত্যেকটির জন্য
car_audio_configuration.xmlফাইলের মধ্যে পারস্পরিক তুলনা করার জন্য একটি অনন্য নামের প্রয়োজন হয়। - এই কনফিগারেশনগুলো বিভিন্ন অডিও জোন এবং জোন কনফিগারেশন জুড়ে সুবিধাজনকভাবে প্রয়োগ করা যেতে পারে।
- উল্লেখ্য, প্রতিটি ফেড কনফিগারেশন শুধুমাত্র মিলিসেকেন্ডে সময়কালের মান গ্রহণ করে, যা ব্যবহার করে সিস্টেম অভ্যন্তরীণভাবে সংশ্লিষ্ট
VolumeShaper.Configurationতৈরি করে।
বাস্তব প্রয়োগের নির্দেশনার জন্য, device/generic/car/emulator/audio/car_audio_fade_configuration.xml এ অবস্থিত এমুলেটরের জন্য প্রদত্ত উদাহরণ কনফিগারেশনগুলো দেখুন।
গাড়ির অডিও কনফিগারেশন XML ফাইল
অ্যান্ড্রয়েড ১৫-এ car_audio_configuration.xml ফাইলের একটি আপডেট আনা হয়েছে, যার ভার্সন এখন ৪। এতে নতুন applyFadeConfigs এবং fadeConfig ট্যাগ যুক্ত করা হয়েছে। applyFadeConfigs ট্যাগে একাধিক fadeConfig ডেফিনিশন থাকতে পারে, যা নমনীয় ফেড কনফিগারেশনের সুযোগ দেয়। প্রতিটি ডেফিনিশন:
- অবশ্যই একটি ডিফল্ট
fadeConfigঅন্তর্ভুক্ত করতে হবে, যাisDefault = trueদ্বারা নির্ধারিত। - এতে একাধিক ক্ষণস্থায়ী
fadeConfigসংজ্ঞা অন্তর্ভুক্ত থাকতে পারে। এই ক্ষণস্থায়ী কনফিগারেশনগুলি বিশেষভাবে অডিও ফোকাস হারানোর ইন্টারঅ্যাকশনের সময় প্রয়োগ করা হয়, এবং শুধুমাত্র তখনই যখন অডিও ফোকাস অর্জনকারী অ্যাপটি ক্ষণস্থায়ী কনফিগারেশনের মধ্যে সংজ্ঞায়িত মানদণ্ডের সাথে মেলে।
বাস্তব প্রয়োগের নির্দেশনার জন্য, device/generic/car/emulator/audio/car_audio_configuration.xml এ অবস্থিত এমুলেটরের জন্য প্রদত্ত উদাহরণ কনফিগারেশনগুলি দেখুন।
OEM অডিও ফোকাস পরিষেবা সম্প্রসারণ
যেসব OEM একটি কাস্টম কার অডিও ফোকাস সার্ভিস প্রয়োগ করে, তারা OemCarAudioFocusResult মধ্যে অডিও ফেড সেটিংস অন্তর্ভুক্ত করার মাধ্যমে তা কনফিগার করার সুবিধা পায়। এটি setAudioAttributesToCarAudioFadeConfigurationMap() বিল্ডার মেথড ব্যবহার করে করা যেতে পারে:
/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}
বিশেষভাবে উল্লেখ্য যে, OEM-রা আগে থেকে কনফিগার করা বুট-টাইম ফেড সেটিংস ব্যবহার করতে পারেন অথবা তাদের কাস্টম অডিও ফোকাস সার্ভিসের মাধ্যমে ডাইনামিকভাবে কনফিগারেশন প্রয়োগ করতে পারেন, যা অভিযোজনযোগ্য নিয়ন্ত্রণ প্রদান করে।
ক্রম চিত্র
এই সিকোয়েন্স ডায়াগ্রামটি App2 কে অডিও ফোকাস প্রদান এবং পরবর্তীতে App1 কর্তৃক অডিও ফোকাস হারানোর পরের আচরণটি চিত্রিত করে:
- গাড়ির অডিও পরিষেবা থেকে
App1এ অডিও ফোকাস লস সংকেত পাঠানো হলে, সক্রিয়FadeManagerConfigurationঅনুযায়ীApp1প্লেয়ারের প্লেব্যাক ধীরে ধীরে বন্ধ হয়ে যায়। ফেড-আউট প্রক্রিয়াটি সম্পন্ন হলে,App1সাধারণ অডিও ফোকাস লস কলব্যাকটি গ্রহণ করে। - ঐচ্ছিকভাবে, একটি কনফিগারযোগ্য সময়কালের পরে
App1-এর অডিও ধীরে ধীরে আবার চালু করা যেতে পারে। OEM-দের তাদের নির্দিষ্ট পণ্যের প্রয়োজনীয়তা অনুযায়ীBuilder#setFadeInDurationForUsage(int, long)এর মাধ্যমে এই সময়কাল নির্ধারণ করার স্বাধীনতা রয়েছে।

চিত্র ৪. গাড়ির অডিও ফেড ফিচারের সিকোয়েন্স ডায়াগ্রাম।
মাল্টি-জোন ফোকাস ম্যানেজমেন্ট
যেসব গাড়িতে একাধিক অডিও জোন থাকে, সেগুলোতে প্রতিটি জোনের জন্য অডিও ফোকাস স্বাধীনভাবে পরিচালিত হয়। ফলে, একটি জোনে ফোকাস পরিবর্তনের অনুরোধ অন্য জোনের ফোকাসকে বিবেচনায় নেয় না, এবং এর কারণে অন্য জোনের ফোকাসধারীরাও ফোকাস হারায় না। এর মাধ্যমে, পেছনের সিটের এন্টারটেইনমেন্ট সিস্টেম থেকে মূল কেবিনের ফোকাস আলাদাভাবে পরিচালনা করা যায়, ফলে এক জোনের ফোকাস পরিবর্তনের কারণে অন্য জোনের অডিও প্লেব্যাকে কোনো ব্যাঘাত ঘটে না।
সমস্ত অ্যাপের জন্য, CarAudioService স্বয়ংক্রিয়ভাবে ফোকাস পরিচালনা করে। একটি ফোকাস অনুরোধের অডিও জোন তার সংশ্লিষ্ট UserId বা UID দ্বারা নির্ধারিত হয় (বিস্তারিত জানার জন্য, মাল্টি-জোন অডিও রাউটিং দেখুন)।
একই সাথে একাধিক জোন থেকে অডিও অনুরোধ করুন
যদি কোনো অ্যাপ একই সাথে একাধিক জোনে অডিও চালাতে চায়, তবে তাকে অবশ্যই বান্ডেলে AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID অন্তর্ভুক্ত করে প্রতিটি জোনের জন্য ফোকাসের অনুরোধ করতে হবে:
//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
zoneId);
AudioAttributes attributesWithZone = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.addBundle(bundle)
.build();
//Create focus request using built attributesWithZone
এই বান্ডেল প্যারামিটারটি অনুরোধকারীকে স্বয়ংক্রিয় অডিও জোন ম্যাপিং উপেক্ষা করে নির্দিষ্ট জোন আইডি ব্যবহার করার সুযোগ দেয়। ফলে, একটি অ্যাপ বিভিন্ন অডিও জোনের জন্য আলাদা আলাদা অনুরোধ পাঠাতে পারে।
এইচএএল অডিও ফোকাস
অ্যান্ড্রয়েড ১১ থেকে, এক্সটার্নাল স্ট্রিমগুলোর পক্ষ থেকে ফোকাস অনুরোধ করার জন্য HAL-কে সক্ষম করা হয়েছে। যদিও এটি ঐচ্ছিক, অ্যান্ড্রয়েড ইকোসিস্টেমে এক্সটার্নাল সাউন্ডগুলোকে সর্বোত্তম অংশগ্রহণকারী হিসেবে কাজ করতে এবং একটি নির্বিঘ্ন ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য এই API-গুলোর ব্যবহারকে বিশেষভাবে উৎসাহিত করা হয়।
কোন শব্দগুলো অগ্রাধিকার পাবে, সে বিষয়ে HAL-ই চূড়ান্ত সিদ্ধান্ত নেয়। এই কারণে, HAL-কে অডিও ফোকাস দেওয়া হোক বা না হোক, জরুরি এবং নিরাপত্তাজনিত গুরুত্বপূর্ণ শব্দগুলো বাজানো উচিত এবং HAL অডিও ফোকাস হারালেও যথোপযুক্তভাবে সেগুলো বাজানো চালিয়ে যাওয়া উচিত। সরকারি বিধি দ্বারা প্রয়োজনীয় যেকোনো শব্দের ক্ষেত্রেও একই কথা প্রযোজ্য।
জরুরি বা নিরাপত্তাজনিত গুরুত্বপূর্ণ শব্দ বাজানোর সময়, সেগুলি যাতে স্পষ্টভাবে শোনা যায় তা নিশ্চিত করার জন্য, HAL-এর উচিত প্রয়োজন অনুযায়ী অ্যান্ড্রয়েড স্ট্রিমগুলিকে স্বয়ংক্রিয়ভাবে মিউট করে দেওয়া।
অডিওকন্ট্রোল@২.০
AudioControl HAL-এর ২.০ সংস্করণে এই নতুন API-গুলো যুক্ত করা হয়েছে:
| এপিআই | উদ্দেশ্য |
|---|---|
IAudioControl#registerFocusListener | AudioControl HAL-এর সাথে IFocusListener এর একটি ইনস্ট্যান্স রেজিস্টার করে। এই লিসেনারটি HAL-কে অডিও ফোকাসের জন্য অনুরোধ করতে এবং তা পরিত্যাগ করতে সক্ষম করে। HAL একটি ICloseHandle ইনস্ট্যান্স প্রদান করে, যা অ্যান্ড্রয়েড লিসেনারটিকে আনরেজিস্টার করার জন্য ব্যবহার করে। |
IAudioControl#onAudioFocusChange | IFocusListener এর মাধ্যমে HAL কর্তৃক করা ফোকাস অনুরোধগুলির অবস্থার পরিবর্তন সম্পর্কে HAL-কে অবহিত করে, যার মধ্যে প্রাথমিক ফোকাস অনুরোধের প্রতিক্রিয়াও অন্তর্ভুক্ত। |
IFocusListener#requestAudioFocus | HAL-এর পক্ষ থেকে একটি নির্দিষ্ট ব্যবহার, জোন আইডি এবং ফোকাস গেইন টাইপের জন্য ফোকাসের অনুরোধ করা হয়। |
IFocusListener#abandonAudioFocus | নির্দিষ্ট ব্যবহার এবং জোন আইডির জন্য বিদ্যমান HAL ফোকাস অনুরোধগুলি বাতিল করে। |
HAL একই সময়ে একাধিক ফোকাস অনুরোধ গ্রহণ করতে পারে, কিন্তু প্রতিটি ব্যবহার এবং জোন আইডি পেয়ারিং-এর জন্য এটি একটি অনুরোধের মধ্যে সীমাবদ্ধ। অ্যান্ড্রয়েড ধরে নেয় যে, অনুরোধ করা মাত্রই HAL ব্যবহারের জন্য শব্দ বাজানো শুরু করে এবং ফোকাস ত্যাগ না করা পর্যন্ত তা চালিয়ে যায়।
registerFocusListener ছাড়া, এই অনুরোধগুলো নিশ্চিত করার oneway যে, কোনো ফোকাস অনুরোধ প্রক্রিয়া করার সময় অ্যান্ড্রয়েড যেন HAL-কে বিলম্বিত না করে। নিরাপত্তাজনিত গুরুত্বপূর্ণ শব্দ বাজানোর আগে HAL-এর ফোকাস পাওয়ার জন্য অপেক্ষা করা উচিত নয় । IAudioControl#onAudioFocusChange এর মাধ্যমে অডিও ফোকাসের পরিবর্তন শোনা এবং তাতে সাড়া দেওয়া HAL-এর জন্য ঐচ্ছিক।
OEM গাড়ির অডিও ফোকাস পরিষেবা
অ্যান্ড্রয়েড ১৪-এ, AAOS গাড়ির কিছু যন্ত্রাংশের কনফিগারযোগ্যতা সক্ষম করার জন্য কার OEM প্লাগইন পরিষেবা চালু করেছে। কার অডিও প্লাগইন পরিষেবার ক্ষেত্রে, এই পরিষেবাটি OEM-দেরকে গাড়ির অডিও পরিষেবা দ্বারা গৃহীত ফোকাস অনুরোধগুলি পরিচালনা করার সুযোগ দেয়। এটি OEM-দেরকে নিয়মকানুন অনুযায়ী ফোকাস পরিচালনার ক্ষেত্রে আরও বেশি নমনীয়তা প্রদান করে। ফলস্বরূপ, অডিও ফোকাসের মিথস্ক্রিয়া নির্মাতাভেদে এবং অঞ্চলভেদে ভিন্ন হতে পারে। অডিও ফোকাসের মূল ধারণাটি এখনও অপরিবর্তিত রয়েছে, আর তা হলো ব্যবহারকারীর অভিজ্ঞতা উন্নত করার জন্য অডিওর আরও ভালো ব্যবস্থাপনার উদ্দেশ্যে অ্যাপগুলোর ফোকাসের জন্য অনুরোধ করা উচিত। সাধারণভাবে, অ্যাপগুলোর অডিও ফোকাস অনুরোধের ক্ষেত্রে কিছু নির্দিষ্ট নিয়ম এখনও প্রযোজ্য:
কোনো চলমান, উচ্চ অগ্রাধিকারের অডিও ফোকাস (যেমন ফোন কল, জরুরি সতর্কতা বা নিরাপত্তা বিজ্ঞপ্তি) না থাকলেও, অ্যাপগুলো ক্ষণস্থায়ীভাবে বা স্থায়ীভাবে অডিও ফোকাস অর্জন করতে সক্ষম হওয়া উচিত।
গণমাধ্যমের মনোযোগ সক্রিয় থাকাকালীন:
যেসব অ্যাপ কল ব্যবহারের ফোকাসের জন্য অনুরোধ করে, তাদের একই সাথে অথবা একচেটিয়াভাবে কলটি গ্রহণ করতে সক্ষম হওয়া উচিত।
যেসব অ্যাপ নেভিগেশন ব্যবহারের ফোকাসের জন্য অনুরোধ করে, তাদের একই সাথে অথবা একচেটিয়াভাবে নেভিগেশন ফোকাস গ্রহণ করার ক্ষমতা থাকা উচিত।
যেসব অ্যাপ অ্যাসিস্ট্যান্ট ব্যবহারের ফোকাসের জন্য অনুরোধ করে, সেগুলোকে একই সাথে অথবা একচেটিয়াভাবে ব্যবহারের ফোকাস গ্রহণ করতে সক্ষম হওয়া উচিত।
যখন উচ্চ অগ্রাধিকারের অডিও ফোকাস (যেমন ফোন কল, জরুরি সতর্কতা বা নিরাপত্তা বিজ্ঞপ্তি) অ্যাপগুলো সক্রিয় থাকে, তখন আগত যেকোনো বিলম্বিত অডিও ফোকাসের অনুরোধ প্রয়োজন অনুযায়ী মঞ্জুর বা বিলম্বিত করা উচিত।
যদিও এই পরামর্শগুলো সম্পূর্ণ নয়, তবে কোনো সক্রিয় উচ্চ অগ্রাধিকারের সাউন্ড না থাকলে ফোকাসের জন্য অনুরোধকারী অ্যাপগুলোকে ফোকাস পেতে এগুলো সাহায্য করতে পারে। এমনকি উচ্চ অগ্রাধিকারের সাউন্ড সক্রিয় থাকা অবস্থাতেও, বিলম্বিত ফোকাসের অনুরোধগুলোকে সম্মান করা উচিত এবং উচ্চ অগ্রাধিকারের সাউন্ডটি বন্ধ হয়ে গেলে সেগুলোর ফোকাস পাওয়ার সক্ষমতা থাকা উচিত।