লজিক্যাল স্ট্রীম শুরু করার আগে, একটি অ্যাপের লজিক্যাল স্ট্রিমের জন্য যেভাবে ব্যবহার করা হয় সেই একই অডিও অ্যাট্রিবিউট ব্যবহার করে অডিও ফোকাসের অনুরোধ করা উচিত। এই ধরনের ফোকাস অনুরোধ পাঠানোর সুপারিশ করা হয়, এটি সিস্টেম দ্বারা প্রয়োগ করা হয় না। কিছু অ্যাপ সুনির্দিষ্ট আচরণ (উদাহরণস্বরূপ, একটি ফোন কলের সময় ইচ্ছাকৃতভাবে শব্দ বাজানো) অর্জনের জন্য অনুরোধ পাঠানো স্পষ্টভাবে এড়িয়ে যেতে পারে।
এই কারণে, আপনার ফোকাসকে পরোক্ষভাবে প্লেব্যাক নিয়ন্ত্রণ এবং বিরোধিতা করার একটি উপায় হিসাবে বিবেচনা করা উচিত, এবং একটি প্রাথমিক অডিও নিয়ন্ত্রণ প্রক্রিয়া হিসাবে নয়; অডিও সাবসিস্টেম পরিচালনার জন্য গাড়ির ফোকাস সিস্টেমের উপর নির্ভর করা উচিত নয়।
মিথস্ক্রিয়া ফোকাস করুন
AAOS-এর চাহিদাগুলিকে সমর্থন করার জন্য, অনুরোধের CarAudioContext
এবং বর্তমান ফোকাস হোল্ডারদের মধ্যে পূর্বনির্ধারিত মিথস্ক্রিয়াগুলির উপর ভিত্তি করে অডিও ফোকাস অনুরোধগুলি পরিচালনা করা হয়। তিন ধরনের মিথস্ক্রিয়া আছে: একচেটিয়া, প্রত্যাখ্যান এবং সমসাময়িক।
একচেটিয়া মিথস্ক্রিয়া
একচেটিয়া মিথস্ক্রিয়ায় শুধুমাত্র একটি অ্যাপ্লিকেশন একবারে ফোকাস ধরে রাখার জন্য অনুমোদিত। তাই ইনকামিং ফোকাস অনুরোধ ফোকাস মঞ্জুর করা হয় যখন বিদ্যমান ফোকাস হোল্ডার ফোকাস হারায়। এর একটি উদাহরণ হতে পারে যখন একজন ব্যবহারকারী একটি নতুন মিউজিক অ্যাপ্লিকেশন শুরু করেন যখন মিউজিক ইতিমধ্যেই একটি বিদ্যমান অ্যাপ্লিকেশনে বাজছে। যেহেতু উভয়ই মিডিয়া চালাচ্ছে, শুধুমাত্র একটি অ্যাপ্লিকেশনকে একবারে ফোকাস ধরে রাখার অনুমতি দেওয়া হয়। ফলস্বরূপ, সদ্য শুরু হওয়া অ্যাপ্লিকেশনটির ফোকাস অনুরোধটি AUDIOFOCUS_REQUEST_GRANTED
সাথে ফিরে আসে এবং বর্তমানে সঙ্গীত বাজানো অ্যাপ্লিকেশনটি একটি ক্ষতির স্থিতি সহ একটি ফোকাস পরিবর্তন ইভেন্ট পায় যা অনুরোধের প্রকারের সাথে মিলে যায়। এটি অ্যান্ড্রয়েডের সাথে সর্বাধিক দেখা মিথস্ক্রিয়া মডেল।
মিথস্ক্রিয়া প্রত্যাখ্যান করুন
প্রত্যাখ্যান মিথস্ক্রিয়াগুলির সাথে, আগত অনুরোধটি সর্বদা প্রত্যাখ্যান করা হয়। একটি কল চলাকালীন সঙ্গীত বাজানোর চেষ্টা করা একটি প্রত্যাখ্যান মিথস্ক্রিয়ার একটি উদাহরণ৷ এই ক্ষেত্রে, যদি ডায়ালারটি বর্তমানে একটি কলের জন্য অডিও ফোকাস ধরে রাখে এবং সঙ্গীত চালানোর জন্য একটি দ্বিতীয় অ্যাপ্লিকেশন অনুরোধ ফোকাস করে, তবে সঙ্গীত অ্যাপ্লিকেশনটি তার অনুরোধের প্রতিক্রিয়া হিসাবে AUDIOFOCUS_REQUEST_FAILED
গ্রহণ করে। যেহেতু ফোকাস অনুরোধ প্রত্যাখ্যান করা হয়েছে, বর্তমান ফোকাস ধারকের কাছে কোনো ধরনের ফোকাস ক্ষতি পাঠানো হয় না।
সমসাময়িক মিথস্ক্রিয়া
AAOS-এর সবচেয়ে অনন্য হল সমসাময়িক মিথস্ক্রিয়া। এটি গাড়িতে অডিও ফোকাসের অনুরোধকারী অ্যাপ্লিকেশনগুলিকে অন্যান্য অ্যাপ্লিকেশনগুলির সাথে একযোগে ফোকাস ধরে রাখার ক্ষমতা দেয়। একটি সমসাময়িক মিথস্ক্রিয়া সঞ্চালনের জন্য, নিম্নলিখিত শর্তগুলি অবশ্যই পূরণ করতে হবে। দ্য:
- ইনকামিং ফোকাস অনুরোধ অবশ্যই
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
. - বর্তমান ফোকাস ধারক
setPauseWhenDucked(true)
করে না। - বর্তমান ফোকাস ধারক হাঁসের ইভেন্টগুলি গ্রহণ করতে পছন্দ করেন না।
যদি এই মানদণ্ডগুলি পূরণ করা হয়, তাহলে ফোকাস অনুরোধটি AUDIOFOCUS_REQUEST_GRANTED
সাথে ফিরে আসে যখন বর্তমান ফোকাস ধারকের ফোকাসে কোনো পরিবর্তন নেই৷ যাইহোক, যদি বর্তমান ফোকাস ধারক হাঁসের ইভেন্টগুলি গ্রহণ করতে বা হাঁসের সময় বিরতি দিতে বেছে নেয়, তবে বর্তমান ফোকাস ধারক একটি একচেটিয়া ইন্টারঅ্যাকশনের মতোই ফোকাস হারায়।
সমসাময়িক প্রবাহ পরিচালনা করা
যদিও সমসাময়িক মিথস্ক্রিয়াতে অনেকগুলি দরকারী অ্যাপ্লিকেশন রয়েছে, OEM গুলিকে অবশ্যই আউটপুট ডিভাইস জুড়ে হার্ডওয়্যার স্তরে মিশ্রণ এবং হাঁস করার যত্ন নিতে হবে। এই কারণে, এটি দৃঢ়ভাবে সুপারিশ করা হয় যে CarAudioContext
s কে শুধুমাত্র CarAudioContext
s এর মতো একই আউটপুট ডিভাইসে রাউট করা হবে যেটির সাথে তারা একসাথে খেলতে পারে না। সমসাময়িক স্ট্রীমগুলির জন্য পৃথক আউটপুট ডিভাইস থাকার দ্বারা, এটি HAL-কে একত্রে মিশ্রিত করার আগে স্ট্রীমগুলির একটিকে হাঁস করতে বা গাড়ির বিভিন্ন স্পিকারের কাছে শারীরিক স্ট্রিমগুলিকে রুট করতে সক্ষম করে। যদি লজিক্যাল স্ট্রীমগুলি অ্যান্ড্রয়েডের মধ্যে মিশ্রিত হয়, তবে তাদের লাভগুলি পরিবর্তন করা হয় না এবং একই শারীরিক স্ট্রিমের অংশ হিসাবে বিতরণ করা হয়।
উদাহরণস্বরূপ, যখন নেভিগেশন এবং মিডিয়া একই সাথে বিতরণ করা হয়, তখন মিডিয়া স্ট্রিমের জন্য লাভ সাময়িকভাবে হ্রাস করা যেতে পারে (ডাকড) যাতে নেভিগেশন নির্দেশাবলী আরও স্পষ্টভাবে শোনা যায়। বিকল্পভাবে, নেভিগেশন স্ট্রীমটি ড্রাইভার সাইড স্পীকারে রুট করা যেতে পারে যখন মিডিয়া বাকি কেবিন জুড়ে চলতে থাকে।
মিথস্ক্রিয়া ম্যাট্রিক্স
নীচের টেবিলটি CarAudioService
দ্বারা সংজ্ঞায়িত মিথস্ক্রিয়া ম্যাট্রিক্স দেখায়। সারিগুলি বর্তমান ফোকাস ধারকের CarAudioContext
এবং কলামগুলি আগত অনুরোধের প্রতিনিধিত্ব করে৷
একটি উদাহরণের দিকে তাকানো, যেখানে একটি মিউজিক মিডিয়া অ্যাপ বর্তমানে ফোকাস এবং একটি নেভিগেশন অ্যাপ্লিকেশন অনুরোধ ফোকাস ধরে রেখেছে, ম্যাট্রিক্স দেখায় যে দুটি মিথস্ক্রিয়া একসাথে চলতে পারে, অনুমান করে যে সমসাময়িক মিথস্ক্রিয়াগুলির অন্যান্য মানদণ্ড পূরণ করা হয়েছে।
সমসাময়িক মিথস্ক্রিয়াগুলির কারণে, একাধিক ফোকাস ধারক বিদ্যমান থাকা সম্ভব। এই ক্ষেত্রে, কোন ধরনের ইন্টারঅ্যাকশন প্রয়োগ করতে হবে তা সিদ্ধান্ত নেওয়ার আগে একটি ইনকামিং ফোকাস অনুরোধ বর্তমান ফোকাস ধারকদের প্রত্যেকের সাথে তুলনা করা হয়। এই ক্ষেত্রে, সবচেয়ে রক্ষণশীল মিথস্ক্রিয়া জয়ী হয় (প্রত্যাখ্যান, তারপর একচেটিয়া, এবং অবশেষে সমসাময়িক)।
নিম্নলিখিত সারণীতে, একটি ইনকামিং ফোকাস অনুরোধের (কলাম) জন্য CarAudioContext এবং বিদ্যমান ফোকাস হোল্ডারদের (সারি) প্রসঙ্গগুলির মধ্যে ফোকাস মিথস্ক্রিয়া প্রদান করা হয়েছে। প্রতিটি ঘর দুটি প্রসঙ্গের জন্য প্রত্যাশিত মিথস্ক্রিয়া প্রকারের প্রতিনিধিত্ব করে।
চিত্র 1. অডিও ফোকাস মিথস্ক্রিয়া
ফোন কলের সময় নেভিগেশন
অ্যান্ড্রয়েড 11-এ, ব্যবহারকারীদের নেভিগেশন এবং ফোন কলগুলির মধ্যে মিথস্ক্রিয়া আচরণ পরিবর্তন করার অনুমতি দেওয়ার জন্য একটি নতুন ব্যবহারকারী সেটিং চালু করা হয়েছে। সেট করা হলে, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
ইনকামিং NAVIGATION
ফোকাস অনুরোধ এবং বর্তমান CALL
ফোকাস হোল্ডারদের মধ্যে সমসাময়িক থেকে প্রত্যাখ্যানের মধ্যে মিথস্ক্রিয়া পরিবর্তন করে। তাই যদি একজন ব্যবহারকারী তাদের কলে বাধা সৃষ্টিকারী নেভিগেশন নির্দেশাবলী না পেতে পছন্দ করেন, তাহলে তারা এই সেটিংটি সক্ষম করতে পারেন। এটি ব্যবহারকারীর জন্য অব্যাহত থাকে, এবং গতিশীলভাবে সেট করা যেতে পারে যাতে পরবর্তী ফোকাস অনুরোধগুলি নতুন সেটিং মানকে সম্মান করে।
বিলম্বযোগ্য অডিও ফোকাস
অ্যান্ড্রয়েড 11-এ, 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
মাল্টি-জোন ফোকাস ব্যবস্থাপনা
একাধিক অডিও জোন সহ যানবাহনের জন্য, প্রতিটি জোনের জন্য অডিও ফোকাস স্বাধীনভাবে পরিচালিত হয়। যেমন, একটি জোনের কাছে অনুরোধ অন্য জোনে কী ফোকাস ধরে রেখেছে তা বিবেচনায় নেয় না, বা এটি অন্য জোনের ফোকাস হোল্ডারদের ফোকাস হারাতে দেয় না। এটির সাহায্যে, মূল কেবিনের ফোকাসটি পিছনের সিটের বিনোদন ব্যবস্থা থেকে আলাদাভাবে পরিচালনা করা যেতে পারে, এইভাবে অন্য জোনে ফোকাসের পরিবর্তনের মাধ্যমে অডিও প্লেব্যাককে বাধাগ্রস্ত করা এড়ানো যায়।
সমস্ত অ্যাপ্লিকেশনের জন্য ফোকাস ব্যবস্থাপনা 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 অডিও ফোকাস
অ্যান্ড্রয়েড 11 থেকে শুরু করে, এইচএএল এখন বহিরাগত স্ট্রিমগুলির পক্ষে ফোকাস করার অনুরোধ করতে সক্ষম হয়েছে। ঐচ্ছিক হলেও, এই APIগুলিকে Android ইকোসিস্টেমে আরও ভাল অংশগ্রহণকারী হতে এবং একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে বাহ্যিক শব্দগুলিকে সক্ষম করার জন্য অত্যন্ত উৎসাহিত করা হয়৷
মনে রাখবেন যে কোন শব্দগুলিকে অগ্রাধিকার দেওয়া উচিত তা নিয়ে চূড়ান্ত কল করার জন্য HAL এখনও দায়ী৷ এই পরিমাণে, HAL-কে অডিও ফোকাস দেওয়া হোক বা না হোক, জরুরী এবং নিরাপত্তা সংক্রান্ত সমালোচনামূলক শব্দ বাজানো উচিত, এবং HAL অডিও ফোকাস হারাতে পারলেও যথাযথভাবে বাজানো উচিত। প্রবিধান দ্বারা প্রয়োজনীয় যেকোনো শব্দের ক্ষেত্রেও একই কথা প্রযোজ্য।
একই লাইনে, HAL-এর উচিত এখনও সক্রিয়ভাবে Android স্ট্রীমগুলিকে যথাযথভাবে নিঃশব্দ করা উচিত যখন জরুরী বা নিরাপত্তা সংক্রান্ত সমালোচনামূলক শব্দগুলি বাজানো হয় যাতে সেগুলি স্পষ্টভাবে শোনা যায়।
অডিও কন্ট্রোল@2.0
অডিওকন্ট্রোল এইচএএল-এর সংস্করণ 2.0 বেশ কয়েকটি নতুন এপিআই প্রবর্তন করেছে:
API | উদ্দেশ্য |
---|---|
IAudioControl#registerFocusListener | অডিও কন্ট্রোল HAL-এর সাথে IFocusListener এর একটি উদাহরণ নিবন্ধন করে। এই শ্রোতা HAL কে অনুরোধ করতে এবং অডিও ফোকাস ত্যাগ করতে সক্ষম করে। HAL শ্রোতাকে নিবন্ধনমুক্ত করতে অ্যান্ড্রয়েড ব্যবহার করার জন্য একটি ICloseHandle উদাহরণ প্রদান করবে বলে আশা করা হচ্ছে। |
IAudioControl#onAudioFocusChange | IFocusListener এর মাধ্যমে HAL দ্বারা করা ফোকাস অনুরোধের জন্য স্ট্যাটাসে পরিবর্তনের HAL-কে অবহিত করে। এতে প্রাথমিক ফোকাস অনুরোধের প্রতিক্রিয়া অন্তর্ভুক্ত রয়েছে। |
IFocusListener#requestAudioFocus | HAL-এর পক্ষ থেকে একটি নির্দিষ্ট ব্যবহার, জোন আইডি এবং ফোকাস লাভ টাইপের জন্য ফোকাস করার অনুরোধ। |
IFocusListener#abandonAudioFocus | নির্দিষ্ট ব্যবহার এবং জোন আইডির জন্য বিদ্যমান HAL ফোকাস অনুরোধগুলি পরিত্যাগ করে৷ |
HAL-এর একই সময়ে একাধিক ফোকাস অনুরোধ থাকতে পারে, কিন্তু প্রতি ব্যবহার এবং জোন আইডি জোড়ার জন্য একটি অনুরোধের মধ্যে সীমাবদ্ধ। দ্রষ্টব্য যে Android অনুমান করে যে একবার অনুরোধ করা হলে HAL অবিলম্বে ব্যবহারের জন্য শব্দ বাজানো শুরু করে এবং এটি ফোকাস ত্যাগ না করা পর্যন্ত তা চালিয়ে যায়।
registerFocusListener
ব্যতীত, এই অনুরোধগুলি সবই নিশ্চিত করার জন্য oneway
যে Android একটি ফোকাস অনুরোধ প্রক্রিয়া করার সময় HAL দেরি না করে। নিরাপত্তা-সমালোচনামূলক শব্দ বাজানোর আগে HAL-এর ফোকাস পাওয়ার জন্য অপেক্ষা করা উচিত নয় । IAudioControl#onAudioFocusChange
এর মাধ্যমে অডিও ফোকাসের পরিবর্তনগুলি শুনতে এবং প্রতিক্রিয়া জানানো HAL-এর পক্ষে ঐচ্ছিক, যদিও উপযুক্ত হলে উৎসাহিত করা হয়।