অডিও ইনপুট সাধারণত বিল্ট-ইন মাইক, একটি বহিরাগত মাইক, অথবা ডিভাইসের সাথে সংযুক্ত একটি অডিও ইন্টারফেস থেকে আসে। অডিও ইনপুট একটি ফোন কথোপকথন থেকেও আসতে পারে।
কখনও কখনও দুই বা ততোধিক অ্যাপ একই অডিও ইনপুট "ক্যাপচার" করতে চাইতে পারে। তারা বিভিন্ন কাজ সম্পাদন করতে পারে। উদাহরণস্বরূপ, কিছু অ্যাপ যা অডিও গ্রহণ করে তারা "রেকর্ডিং" করতে পারে, যেমন একটি সাধারণ ভয়েস রেকর্ডার, অন্যদিকে অন্যান্য অ্যাপগুলি "শ্রবণ" করতে পারে, যেমন Google Assistant বা ভয়েস কমান্ডের প্রতিক্রিয়া জানাতে পারে এমন একটি অ্যাক্সেসিবিলিটি পরিষেবা।
যেকোনো ক্ষেত্রেই, এই অ্যাপগুলি অডিও ইনপুট পেতে চায়। এই পৃষ্ঠা জুড়ে, আমরা "ক্যাপচার" শব্দটি ব্যবহার করি, তা নির্বিশেষে যে কোনও অ্যাপ রেকর্ড করছে নাকি শুধু শুনছে।
যদি দুই বা ততোধিক অ্যাপ একই সময়ে অডিও ক্যাপচার করতে চায়, তাহলে একই উৎস থেকে সকলের কাছে অডিও সিগন্যাল পৌঁছে দিতে সমস্যা হতে পারে। এই পৃষ্ঠায় বর্ণনা করা হয়েছে যে অ্যান্ড্রয়েড সিস্টেম কীভাবে অডিও ক্যাপচারকারী একাধিক অ্যাপের মধ্যে অডিও ইনপুট শেয়ার করে।
অ্যান্ড্রয়েড ১০-এর আগের আচরণ
অ্যান্ড্রয়েড ১০ এর আগে ইনপুট অডিও স্ট্রিম একবারে কেবল একটি অ্যাপ দ্বারা ক্যাপচার করা যেত। যদি কোনও অ্যাপ ইতিমধ্যেই অডিও রেকর্ডিং বা শোনার কাজ করত, তাহলে আপনার অ্যাপটি একটি AudioRecord অবজেক্ট তৈরি করতে পারত, কিন্তু আপনি AudioRecord.startRecording() কল করলে একটি ত্রুটি ফিরে আসত এবং রেকর্ডিং শুরু হত না।
এই নিয়মের একটি ব্যতিক্রম ছিল যখন একটি বিশেষায়িত অ্যাপ (যেমন Google Assistant বা অ্যাক্সেসিবিলিটি পরিষেবা) android.permission.CAPTURE_AUDIO_HOTWORD অনুমতি পেত এবং HOTWORD ধরণের একটি অডিও উৎস ব্যবহার করত। এই ক্ষেত্রে অন্য একটি অ্যাপ রেকর্ডিং শুরু করতে পারে। যখন এটি ঘটে তখন বিশেষায়িত অ্যাপটি বন্ধ হয়ে যায় এবং নতুন অ্যাপ ইনপুট ক্যাপচার করে।
অ্যান্ড্রয়েড ৯-এ আরও একটি পরিবর্তন যোগ করা হয়েছে: শুধুমাত্র ফোরগ্রাউন্ডে (অথবা ফোরগ্রাউন্ড পরিষেবা) চলমান অ্যাপগুলিই অডিও ইনপুট ক্যাপচার করতে পারে। যখন ফোরগ্রাউন্ড পরিষেবা বা ফোরগ্রাউন্ড UI উপাদান ছাড়াই একটি অ্যাপ ক্যাপচার শুরু করে, তখন অ্যাপটি চলতে থাকে কিন্তু নীরবতা বজায় রাখে, এমনকি যদি সেই সময়ে এটিই একমাত্র অ্যাপ ছিল যা অডিও ক্যাপচার করে।
অ্যান্ড্রয়েড ১০ আচরণ
অ্যান্ড্রয়েড ১০-এর আগের আচরণ ছিল "আগে আসলে আগে পাবেন।" একবার কোনও অ্যাপ অডিও ক্যাপচার শুরু করলে, অডিও ক্যাপচার করা অ্যাপটি বন্ধ না হওয়া পর্যন্ত অন্য কোনও অ্যাপ অডিও ইনপুট অ্যাক্সেস করতে পারবে না।
অ্যান্ড্রয়েড ১০ একটি অগ্রাধিকার স্কিম আরোপ করে যা চলমান থাকাকালীন অ্যাপগুলির মধ্যে ইনপুট অডিও স্ট্রিম পরিবর্তন করতে পারে। বেশিরভাগ ক্ষেত্রে, যদি কোনও নতুন অ্যাপ অডিও ইনপুট অর্জন করে, তবে পূর্বে ক্যাপচার করা অ্যাপটি চলতে থাকে, তবে নীরবতা পায়। কিছু ক্ষেত্রে সিস্টেম উভয় অ্যাপেই অডিও সরবরাহ করা চালিয়ে যেতে পারে। বিভিন্ন শেয়ারিং পরিস্থিতি নীচে ব্যাখ্যা করা হয়েছে।
এই স্কিমটি অডিও ফোকাস যেভাবে অডিও আউটপুট ব্যবহারের জন্য প্রতিদ্বন্দ্বিতাকারী একাধিক অ্যাপ পরিচালনা করে তার অনুরূপ। যাইহোক, অডিও ফোকাস ফোকাস অর্জন এবং প্রকাশের জন্য প্রোগ্রাম্যাটিক অনুরোধ দ্বারা পরিচালিত হয়, যেখানে এখানে বর্ণিত ইনপুট স্যুইচিং স্কিমটি একটি অগ্রাধিকার নীতির উপর ভিত্তি করে তৈরি যা যখনই কোনও নতুন অ্যাপ অডিও ক্যাপচার শুরু করে তখন স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়।
অডিও ক্যাপচার করার উদ্দেশ্যে, অ্যান্ড্রয়েড দুই ধরণের অ্যাপকে আলাদা করে:
- "সাধারণ" অ্যাপগুলি ব্যবহারকারী দ্বারা ইনস্টল করা হয়।
- "সুবিধাপ্রাপ্ত" অ্যাপগুলি ডিভাইসে আগে থেকে ইনস্টল করা থাকে। এর মধ্যে রয়েছে গুগল অ্যাসিস্ট্যান্ট এবং সমস্ত অ্যাক্সেসিবিলিটি পরিষেবা।
এছাড়াও, যদি কোনও অ্যাপ "গোপনীয়তা-সংবেদনশীল" অডিও উৎস ব্যবহার করে: CAMCORDER অথবা VOICE_COMMUNICATION , তাহলে তাকে ভিন্নভাবে বিবেচনা করা হয়।
অডিও ইনপুট ব্যবহার এবং ভাগ করে নেওয়ার জন্য অগ্রাধিকারের নিয়মগুলি নিম্নরূপ:
- সাধারণ অ্যাপের তুলনায় সুবিধাপ্রাপ্ত অ্যাপগুলোর অগ্রাধিকার বেশি।
- দৃশ্যমান ফোরগ্রাউন্ড UI সহ অ্যাপগুলির অগ্রাধিকার ব্যাকগ্রাউন্ড অ্যাপগুলির চেয়ে বেশি।
- গোপনীয়তা-সংবেদনশীল উৎস থেকে অডিও ক্যাপচারকারী অ্যাপগুলির অগ্রাধিকার গোপনীয়তা-সংবেদনশীল উৎস থেকে নয় এমন অ্যাপগুলির তুলনায় বেশি।
- দুটি সাধারণ অ্যাপ কখনোই একই সময়ে অডিও ক্যাপচার করতে পারে না।
- কিছু পরিস্থিতিতে, একটি বিশেষাধিকারপ্রাপ্ত অ্যাপ অন্য অ্যাপের সাথে অডিও ইনপুট শেয়ার করতে পারে।
- যদি একই অগ্রাধিকারের দুটি ব্যাকগ্রাউন্ড অ্যাপ অডিও ক্যাপচার করে, তাহলে শেষ শুরু করা অ্যাপটির অগ্রাধিকার বেশি।
দৃশ্যপট ভাগ করে নেওয়া
যখন দুটি অ্যাপ অডিও ক্যাপচার করার চেষ্টা করে, তখন তারা উভয়ই ইনপুট সিগন্যাল গ্রহণ করতে সক্ষম হতে পারে, অথবা তাদের মধ্যে একটি নীরবতা পেতে পারে।
চারটি প্রধান পরিস্থিতি রয়েছে:
- সহকারী + সাধারণ অ্যাপ
- অ্যাক্সেসিবিলিটি পরিষেবা + সাধারণ অ্যাপ
- দুটি সাধারণ অ্যাপ
- ভয়েস কল + সাধারণ অ্যাপ
সহকারী + সাধারণ অ্যাপ
Assistant একটি বিশেষ সুবিধাপ্রাপ্ত অ্যাপ কারণ এটি আগে থেকে ইনস্টল করা থাকে এবং এটি RoleManager.ROLE_ASSISTANT ভূমিকা পালন করে। এই ভূমিকা সহ অন্য যেকোনো আগে থেকে ইনস্টল করা অ্যাপ একইভাবে ব্যবহার করা হয়।
অ্যান্ড্রয়েড এই নিয়ম অনুসারে ইনপুট অডিও শেয়ার করে:
অ্যাসিস্ট্যান্ট অডিও গ্রহণ করতে পারে (সেটি ফোরগ্রাউন্ডে হোক বা ব্যাকগ্রাউন্ডে) যদি না অন্য কোনও অ্যাপ গোপনীয়তা-সংবেদনশীল অডিও উৎস ব্যবহার করে ইতিমধ্যেই ক্যাপচার করছে।
স্ক্রিনের উপরে Assistant-এর দৃশ্যমান UI কম্পোনেন্ট না থাকলে অ্যাপটি অডিও গ্রহণ করে।
মনে রাখবেন যে উভয় অ্যাপই কেবল তখনই অডিও গ্রহণ করে যখন অ্যাসিস্ট্যান্ট ব্যাকগ্রাউন্ডে থাকে এবং অন্য অ্যাপটি গোপনীয়তা-সংবেদনশীল অডিও উৎস থেকে ক্যাপচার না করে।
অ্যাক্সেসিবিলিটি পরিষেবা + সাধারণ অ্যাপ
একটি AccessibilityService জন্য একটি কঠোর ঘোষণা প্রয়োজন।
অ্যান্ড্রয়েড এই নিয়ম অনুসারে ইনপুট অডিও শেয়ার করে:
যদি পরিষেবার UI উপরে থাকে, তাহলে পরিষেবা এবং অ্যাপ উভয়ই অডিও ইনপুট গ্রহণ করে। এই আচরণটি ভয়েস কমান্ডের মাধ্যমে ভয়েস কল বা ভিডিও ক্যাপচার নিয়ন্ত্রণ করার মতো কার্যকারিতা প্রদান করে।
যদি পরিষেবাটি উপরে না থাকে, তাহলে এই কেসটিকে নীচের সাধারণ টু-অ্যাপ কেসের মতোই বিবেচনা করা হবে।
দুটি সাধারণ অ্যাপ
যখন দুটি অ্যাপ একসাথে ক্যাপচার করছে, তখন কেবল একটি অ্যাপ অডিও গ্রহণ করে এবং অন্যটি নীরবতা পায়।
অ্যান্ড্রয়েড এই নিয়ম অনুসারে ইনপুট অডিও শেয়ার করে:
- যদি কোনও অ্যাপই গোপনীয়তা-সংবেদনশীল না হয়, তাহলে উপরে একটি UI সহ অ্যাপটি অডিও গ্রহণ করে। যদি কোনও অ্যাপেরই UI না থাকে, তাহলে যে অ্যাপটি সম্প্রতি ক্যাপচার শুরু করেছে সেটি অডিও গ্রহণ করে।
- যদি কোনও একটি অ্যাপ গোপনীয়তা-সংবেদনশীল হয়, তাহলে এটি অডিও গ্রহণ করে এবং অন্য অ্যাপটি নীরবতা পায়, এমনকি যদি এর উপরে একটি UI থাকে অথবা সম্প্রতি ক্যাপচার করা শুরু করে।
- যদি দুটি অ্যাপই গোপনীয়তা-সংবেদনশীল হয়, তাহলে যে অ্যাপটি সম্প্রতি ক্যাপচার করা শুরু করেছে সেটি অডিও গ্রহণ করবে এবং অন্যটি নীরবতা পাবে।
ভয়েস কল + সাধারণ অ্যাপ
AudioManager.getMode() দ্বারা ফেরত দেওয়া অডিও মোড যদি MODE_IN_CALL অথবা MODE_IN_COMMUNICATION হয়, তাহলে একটি ভয়েস কল সক্রিয় থাকে।
অ্যান্ড্রয়েড এই নিয়ম অনুসারে ইনপুট অডিও শেয়ার করে:
- কলটি সর্বদা অডিও গ্রহণ করে।
- অ্যাপটি যদি অ্যাক্সেসিবিলিটি পরিষেবা হয় তবে অডিও ক্যাপচার করতে পারে।
অ্যাপটি যদি
CAPTURE_AUDIO_OUTPUTঅনুমতি সহ একটি বিশেষাধিকারপ্রাপ্ত (পূর্ব-ইনস্টল করা) অ্যাপ হয় তবে ভয়েস কল ক্যাপচার করতে পারে।ভয়েস কলের আপলিংক (TX), ডাউনলিংক (RX), অথবা উভয়ই ক্যাপচার করতে, অ্যাপটিকে অবশ্যই অডিও সোর্স
MediaRecorder.AudioSource.VOICE_UPLINKঅথবাMediaRecorder.AudioSource.VOICE_DOWNLINKএবং/অথবা ডিভাইসAudioDeviceInfo.TYPE_TELEPHONYউল্লেখ করতে হবে।
অ্যান্ড্রয়েড ১১ আচরণ
অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) উপরে বর্ণিত অ্যান্ড্রয়েড ১০ অগ্রাধিকার স্কিম অনুসরণ করে। এটি AudioRecord , MediaRecorder এবং AAudioStream নতুন পদ্ধতিও সরবরাহ করে যা নির্বাচিত ব্যবহারের ক্ষেত্রে নির্বিশেষে একই সাথে অডিও ক্যাপচার করার ক্ষমতা সক্ষম এবং অক্ষম করে।
নতুন পদ্ধতিগুলি হল:
-
AudioRecord.Builder.setPrivacySensitive() -
AudioRecord.isPrivacySensitive() -
MediaRecorder.setPrivacySensitive() -
MediaRecorder.isPrivacySensitive() -
AAudioStreamBuilder_setPrivacySensitive() -
AAudioStream_isPrivacySensitive()
যখন setPrivacySensitive() true হয়, তখন ক্যাপচার ব্যবহারের ক্ষেত্রে ব্যক্তিগত থাকে এবং এমনকি একটি বিশেষাধিকারপ্রাপ্ত সহকারীও একই সাথে ক্যাপচার করতে পারে না। এই সেটিংটি অডিও উৎসের উপর নির্ভর করে ডিফল্ট আচরণকে ওভাররাইড করে। উদাহরণস্বরূপ, VOICE_COMMUNICATION ডিফল্টরূপে ব্যক্তিগত থাকে কিন্তু UNPROCESSED নয়।
কনফিগারেশন পরিবর্তন
যখন একাধিক অ্যাপ একসাথে অডিও ক্যাপচার করে, তখন কেবল একটি বা দুটি অ্যাপ "সক্রিয়" থাকে (অডিও গ্রহণ করে); অন্যগুলি নিঃশব্দ থাকে (নীরবতা গ্রহণ করে)। যখন সক্রিয় অ্যাপগুলি পরিবর্তিত হয়, তখন অডিও ফ্রেমওয়ার্ক এই নিয়ম অনুসারে অডিও পাথগুলিকে পুনরায় কনফিগার করতে পারে:
- প্রতিটি সক্রিয় অ্যাপের অডিও ইনপুট ডিভাইস পরিবর্তিত হতে পারে (উদাহরণস্বরূপ, অন্তর্নির্মিত মাইক্রোফোন থেকে সংযুক্ত ব্লুটুথ হেডসেটে)।
- সর্বোচ্চ-অগ্রাধিকার সক্রিয় অ্যাপের সাথে সম্পর্কিত প্রিপ্রসেসিং সক্ষম করা হয়েছে। অন্যান্য সমস্ত প্রিপ্রসেসিং উপেক্ষা করা হয়েছে।
যেহেতু একটি উচ্চ-অগ্রাধিকার অ্যাপ সক্রিয় হলে একটি সক্রিয় অ্যাপ নীরব হয়ে যেতে পারে, তাই কনফিগারেশন পরিবর্তন হলে বিজ্ঞপ্তি পাওয়ার জন্য আপনি AudioRecord বা MediaRecorder অবজেক্টে একটি AudioManager.AudioRecordingCallback নিবন্ধন করতে পারেন। সম্ভাব্য পরিবর্তনগুলি হতে পারে:
- নীরব বা নীরব না করে ক্যাপচার করুন
- ডিভাইস পরিবর্তন করা হয়েছে
- প্রি-প্রসেসিং পরিবর্তন করা হয়েছে
- স্ট্রিম বৈশিষ্ট্য পরিবর্তন করা হয়েছে (স্যাম্পলিং রেট, চ্যানেল মাস্ক, নমুনা বিন্যাস)
ক্যাপচার শুরু করার আগে আপনাকে অবশ্যই AudioRecord.registerAudioRecordingCallback() কল করতে হবে। কলব্যাকটি কেবল তখনই কার্যকর করা হয় যখন অ্যাপটি অডিও গ্রহণ করছে এবং কোনও পরিবর্তন ঘটছে।
onRecordingConfigChanged() পদ্ধতিটি বর্তমান অডিও ক্যাপচার অবস্থা ধারণকারী একটি AudioRecordingConfiguration প্রদান করে। পরিবর্তন সম্পর্কে জানতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করুন:
-
isClientSilenced() - যদি ক্লায়েন্টে ফেরত দেওয়া অডিওটি ক্যাপচার নীতির কারণে বর্তমানে নীরব থাকে, তাহলে true ফেরত পাঠায়।
-
getAudioDevice() - সক্রিয় অডিও ডিভাইসটি ফেরত পাঠায়।
-
getEffects() - সক্রিয় প্রিপ্রসেসিং এফেক্ট ফেরত পাঠায়। মনে রাখবেন যে ক্লায়েন্ট যদি সর্বোচ্চ-অগ্রাধিকার সক্রিয় অ্যাপ না হয় তবে সক্রিয় এফেক্ট
getClientEffects()দ্বারা ফেরত পাঠানো এফেক্টের মতো নাও হতে পারে। -
getFormat() - স্ট্রিম বৈশিষ্ট্যগুলি ফেরত দেয়। মনে রাখবেন যে ক্লায়েন্ট দ্বারা প্রাপ্ত প্রকৃত অডিও ডেটা সর্বদা
getClientFormat()দ্বারা প্রদত্ত প্রয়োজনীয় ফর্ম্যাটকে সম্মান করে। ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে হার্ডওয়্যার ইন্টারফেসে ব্যবহৃত ফর্ম্যাট থেকে ক্লায়েন্ট দ্বারা নির্দিষ্ট ফর্ম্যাটে প্রয়োজনীয় রিস্যাম্পলিং, চ্যানেল এবং ফর্ম্যাট রূপান্তর সম্পাদন করে। -
AudioRecord.getActiveRecordingConfiguration()। - সক্রিয় রেকর্ডিং কনফিগারেশন ফেরত পাঠায়।
আপনি AudioManager.getActiveRecordingConfigurations() কল করে ডিভাইসের সমস্ত সক্রিয় রেকর্ডিংয়ের একটি সাধারণ দৃশ্য পেতে পারেন।