সম্মিলিত অডিও ডিভাইস রাউটিং

কম্বাইন্ড অডিও ডিভাইস রাউটিং ফিচারটি একই সাথে একাধিক অডিও ডিভাইসে অডিও স্ট্রিমিং করার সুবিধা যোগ করে। এই ফিচারটি ব্যবহার করে, বিশেষ সুবিধাপ্রাপ্ত অ্যাপগুলো সিস্টেম এপিআই (API)-এর মাধ্যমে একটি নির্দিষ্ট কৌশলের জন্য একাধিক পছন্দের ডিভাইস নির্বাচন করতে পারে। এই ফিচার দ্বারা প্রদত্ত পাবলিক এপিআই ব্যবহার করে অ্যাপগুলো অডিও ডিভাইসগুলোর সক্ষমতা আরও নির্ভুলভাবে জানতে পারে। অ্যান্ড্রয়েড ভার্সন ১১ এবং তার নিচের সংস্করণগুলোর জন্য, অডিও ফ্রেমওয়ার্ক ইমপ্লিমেন্টেশনে একই ধরনের একাধিক অডিও ডিভাইস (উদাহরণস্বরূপ, ২টি ব্লুটুথ A2DP হেডসেট) একই সাথে সংযুক্ত করার ক্ষেত্রে সীমিত সমর্থন রয়েছে। ডিফল্ট অডিও রাউটিং নিয়মগুলোও ব্যবহারকারীদের একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে একই ধরনের একাধিক ডিভাইস নির্বাচন করার অনুমতি দেয় না।

অ্যান্ড্রয়েড ১২ থেকে এই সীমাবদ্ধতাগুলো দূর করা হয়েছে, যার ফলে অডিও ব্রডকাস্টিং, একাধিক BLE অডিও হেডফোনে মাল্টিকাস্টিং অথবা একই সাথে একাধিক USB সাউন্ড কার্ড নির্বাচন করার মতো নতুন ব্যবহারের সুযোগ তৈরি হয়েছে। একই সাথে একাধিক USB ডিভাইসে রাউটিং সমর্থিত নয়।

অ্যান্ড্রয়েড ১৪ থেকে শুরু করে, ইউএসবি ফ্রেমওয়ার্ক একাধিক ইউএসবি ডিভাইসে রাউটিং সমর্থন করে, তবে শর্ত হলো ডিভাইসগুলো ভিন্ন ভিন্ন অডিও ডিভাইসের ধরনের হতে হবে এবং একই সাথে একাধিক ইউএসবি ডিভাইস সংযোগ করার জন্য কার্নেল ও ভেন্ডর সমর্থন থাকতে হবে।

এই পৃষ্ঠায় একাধিক অডিও ডিভাইসে অডিও স্ট্রিমিংয়ের সুবিধা কীভাবে বাস্তবায়ন করতে হয় এবং এই ফিচারের বাস্তবায়ন কীভাবে যাচাই করতে হয়, তা আলোচনা করা হয়েছে।

একাধিক অডিও ডিভাইসে অডিও স্ট্রিমিং সমর্থন করে

অ্যান্ড্রয়েড ১২-এ দুই সেট এপিআই রয়েছে যা এই ফিচারটি সমর্থন করে:

  • সিস্টেম এপিআইগুলো একটি কৌশলের জন্য একাধিক পছন্দের ডিভাইস পরিচালনা করে।
  • বিক্রেতা কর্তৃক অডিও HAL-এর অংশ হিসেবে বাস্তবায়িত HIDL ইন্টারফেসটি ডিভাইসের সক্ষমতা সম্পর্কে প্রতিবেদন দেয়।

পরবর্তী বিভাগগুলিতে এই API গুলোর প্রত্যেকটি নিয়ে আরও বিস্তারিত আলোচনা করা হয়েছে।

একটি কৌশলের জন্য একাধিক পছন্দের ডিভাইস পরিচালনা করুন

অডিও পলিসি ম্যানেজার একই সাথে একাধিক অডিও ডিভাইসে অডিও স্ট্রিমিং আরও ভালোভাবে সমর্থন করার জন্য সিস্টেম এপিআই (API) প্রদান করে। এই সিস্টেম এপিআইগুলো একটি নির্দিষ্ট স্ট্র্যাটেজির জন্য একাধিক পছন্দের ডিভাইস সেট করা, পাওয়া এবং অপসারণ করার সুবিধা দেয়। অ্যান্ড্রয়েড ১২ আসার আগে পর্যন্ত, এই ফিচারটি শুধুমাত্র একটি ডিভাইসের জন্য সমর্থিত ছিল।

অডিও পলিসি ম্যানেজার ‘অ্যাক্টিভ মিডিয়া ডিভাইস’ ধারণাটি প্রবর্তন করে, যা মিডিয়া প্লেব্যাকের জন্য সর্বাধিক নির্বাচিত হওয়ার সম্ভাবনাযুক্ত ডিভাইসগুলোকে বর্ণনা করে। যখন একটি বিচ্ছিন্নযোগ্য ডিভাইস সংযুক্ত করা হয়, তখন এই ডিভাইসে রাউট করা যায় এমন অডিও HAL আউটপুট স্ট্রিমগুলো খুলে সেগুলোর সমর্থিত অ্যাট্রিবিউটগুলো যাচাই করার প্রয়োজন হতে পারে।

আউটপুট স্ট্রিম খোলার সময় একটি অডিও ডিভাইস অবশ্যই নির্দিষ্ট করতে হবে। এই প্রেক্ষাপটে আউটপুট স্ট্রিম খোলার সময় ব্যবহৃত ডিভাইসটিই হলো সক্রিয় মিডিয়া ডিভাইস।

প্রকৃত ডিভাইস সংযুক্ত বা বিচ্ছিন্ন হওয়ার উপর নির্ভর করে সক্রিয় মিডিয়া ডিভাইসের নির্বাচন পরিবর্তিত হতে পারে। অডিও পলিসি ম্যানেজার সক্রিয় মিডিয়া ডিভাইস বেছে নেওয়ার জন্য নিম্নলিখিত নিয়মাবলী ব্যবহার করে:

  1. মিডিয়ার জন্য পছন্দের সব ডিভাইস উপলব্ধ থাকলে, সেগুলোকে সক্রিয় ডিভাইস হিসেবে বেছে নেওয়া হয়।
  2. অন্যথায়, সর্বশেষ সংযুক্ত অপসারণযোগ্য ডিভাইসটি বেছে নেওয়া হয়।
  3. যদি কোনো অপসারণযোগ্য ডিভাইস সংযুক্ত না থাকে, তাহলে সক্রিয় ডিভাইসগুলো বেছে নেওয়ার জন্য আউটপুট ডিভাইস নির্বাচনের ডিফল্ট অডিও পলিসি নিয়মগুলো প্রয়োগ করা হয়।

প্লেব্যাকের জন্য সর্বোত্তম কনফিগারেশনটি বেছে নেওয়ার উদ্দেশ্যে, একটি আউটপুট স্ট্রিমকে পুনরায় চালু করে সক্রিয় ডিভাইসগুলিতে পাঠানোর জন্য অবশ্যই নিম্নলিখিত শর্তগুলি পূরণ করতে হবে:

  • আউটপুট স্ট্রিমকে অবশ্যই সক্রিয় ডিভাইসগুলোকে সমর্থন করতে হবে।
  • আউটপুট স্ট্রিমে অবশ্যই ডাইনামিক প্রোফাইল সমর্থন থাকতে হবে।
  • আউটপুট স্ট্রিমটি বর্তমানে কোনো সক্রিয় ডিভাইসে রাউট করা যাবে না।

নতুন ডিভাইস নির্বাচন প্রয়োগ করার জন্য, অডিও পলিসি ম্যানেজার ডিভাইস সংযোগের পর আউটপুট স্ট্রিমটি নিষ্ক্রিয় থাকলে তা বন্ধ করে আবার চালু করে, অথবা স্ট্রিমটি স্ট্যান্ডবাই মোডে গেলে সেই প্রক্রিয়াটি স্থগিত রাখে।

অডিও পলিসি ম্যানেজার নিম্নলিখিত সিস্টেম এপিআই-এর তালিকা প্রদান করে (যা AudioManager.java তে সংজ্ঞায়িত করা হয়েছে):

  • setPreferredDeviceForStrategy

    একটি নির্দিষ্ট স্ট্র্যাটেজির জন্য অডিও রাউটিংয়ের পছন্দের ডিভাইস নির্ধারণ করে। উল্লেখ্য যে, পছন্দের ডিভাইসটি সেট করার সময় সেটি উপলব্ধ নাও থাকতে পারে, কিন্তু উপলব্ধ হওয়ার সাথে সাথেই ব্যবহৃত হয়।

  • removePreferredDeviceForStrategy

    setPreferredDeviceForStrategy বা setPreferredDevicesForStrategy দিয়ে পূর্বে সেট করা পছন্দের অডিও ডিভাইস(গুলি) সরিয়ে দেয়।

  • getPreferredDeviceForStrategy

    setPreferredDeviceForStrategy বা setPreferredDevicesForStrategy দিয়ে পূর্বে সেট করা কোনো অডিও স্ট্র্যাটেজির জন্য পছন্দের ডিভাইসটি ফেরত দেয়।

  • setPreferredDevicesForStrategy

    একটি নির্দিষ্ট কৌশলের জন্য পছন্দের ডিভাইসগুলো নির্ধারণ করে।

  • getPreferredDevicesForStrategy

    setPreferredDeviceForStrategy বা setPreferredDevicesForStrategy দিয়ে পূর্বে সেট করা কোনো অডিও স্ট্র্যাটেজির জন্য পছন্দের ডিভাইসগুলো ফেরত দেয়।

  • OnPreferredDevicesForStrategyChangedListener

    একটি নির্দিষ্ট অডিও স্ট্র্যাটেজির জন্য সেট করা পছন্দের অডিও ডিভাইসগুলোর পরিবর্তনের বিজ্ঞপ্তি দেওয়ার জন্য একটি ইন্টারফেস নির্ধারণ করে।

  • addOnPreferredDevicesForStrategyChangedListener

    স্ট্র্যাটেজি-পছন্দের অডিও ডিভাইসের পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পেতে একজন লিসেনার যোগ করে।

  • removeOnPreferredDevicesForStrategyChangedListener

    স্ট্র্যাটেজি-পছন্দের অডিও ডিভাইসের পরিবর্তনগুলোর জন্য পূর্বে যোগ করা একটি লিসেনার সরিয়ে দেয়।

ডিভাইসের সক্ষমতা রিপোর্ট করুন

অডিও HAL বাস্তবায়নের অংশ হিসেবে, ভেন্ডররা ডিভাইসের সক্ষমতা রিপোর্ট করার জন্য API-গুলো প্রয়োগ করে। এই বিভাগে ডিভাইসের সক্ষমতা রিপোর্ট করতে ব্যবহৃত ডেটা টাইপ ও মেথডগুলো ব্যাখ্যা করা হয়েছে এবং একাধিক ডিভাইস সমর্থন করার জন্য অডিও HIDL HAL V7-এ করা কিছু পরিবর্তন তালিকাভুক্ত করা হয়েছে।

ডেটা টাইপ

অডিও HIDL HAL V7-এ, ডিভাইসের সক্ষমতা AudioProfile এবং AudioTransport স্ট্রাকচার ব্যবহার করে জানানো হয়। AudioTransport স্ট্রাকচারটি একটি অডিও পোর্টের সক্ষমতা বর্ণনা করে; পরিচিত অডিও ফরম্যাটের জন্য AudioProfile ব্যবহার করে, অথবা প্ল্যাটফর্মের কাছে অপরিচিত ফরম্যাটের জন্য র হার্ডওয়্যার ডেসক্রিপ্টর ব্যবহার করে। AudioProfile স্ট্রাকচারটিতে অডিও ফরম্যাট, প্রোফাইল দ্বারা সমর্থিত স্যাম্পল রেট এবং চ্যানেল মাস্কের তালিকা থাকে, যেমনটি types.hal এর নিম্নলিখিত কোড ব্লকে দেখানো হয়েছে:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

অডিও HIDL HAL V7-এ, ডিভাইসের সক্ষমতা বর্ণনা করার জন্য AudioPort ডেটা টাইপটি AudioTransport এবং AudioProfile স্ট্রাকচারের সাথে সংজ্ঞায়িত করা হয়।

অডিও এইচএএল পদ্ধতি

অডিও পলিসি ম্যানেজার ডিভাইসটির সক্ষমতা জানতে নিম্নলিখিত পদ্ধতিগুলো ব্যবহার করে:

  • getParameters: বিক্রেতা-নির্দিষ্ট প্যারামিটারের মান, যেমন সমর্থিত অডিও ফরম্যাট এবং তাদের নিজ নিজ স্যাম্পলিং রেট, পুনরুদ্ধার করার জন্য একটি জেনেরিক মেথড।
  • getAudioPort: প্রদত্ত অডিও পোর্টের জন্য সমর্থিত অ্যাট্রিবিউটগুলোর (যেমন স্যাম্পলিং রেট, ফরম্যাট, চ্যানেল মাস্ক, গেইন কন্ট্রোলার) তালিকা ফেরত দেয়।

IDevice.hal থেকে নেওয়া নিম্নলিখিত কোডটি getAudioPort মেথডের ইন্টারফেসটি দেখায়:

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

লিগ্যাসি এপিআই-তে পরিবর্তন

একাধিক অডিও প্রোফাইল সমর্থন করার জন্য, লিগ্যাসি এপিআই-এর ৩.২ সংস্করণে audio_port_v7 নামে একটি নতুন কাঠামো যোগ করা হয়েছে। আরও বিস্তারিত জানতে সোর্স কোড দেখুন।

audio_port_v7 যুক্ত হওয়ার কারণে, লিগ্যাসি এপিআই-এর ৩.২ সংস্করণে get_audio_port_v7 নামে একটি নতুন এপিআই যোগ করা হয়েছে, যা audio_port_v7 স্ট্রাকচার ব্যবহার করে ডিভাইসগুলোর সক্ষমতা সম্পর্কে জানতে পারে।

audio.h ফাইলের নিম্নলিখিত কোডটি get_audio_port_v7 API-এর সংজ্ঞা প্রদর্শন করে:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

যখন লিগ্যাসি API ভার্সন 3.2-এর নিচে এবং HIDL HAL ভার্সন 7 বা তার বেশি হয়, তখন লিগ্যাসি get_audio_port API থেকে প্রাপ্ত ডেটা নতুন AudioPort ফরম্যাটে পূরণ করতে হয়। এক্ষেত্রে, get_audio_port থেকে রিপোর্ট করা সমস্ত স্যাম্পল রেট এবং চ্যানেল মাস্ক ফেরত আসা সমস্ত ফরম্যাটের জন্য সমর্থিত বলে ধরে নেওয়া হয়, যা get_audio_port মান থেকে নতুন AudioPort কাঠামোতে একটি সহজ ম্যাপিং সক্ষম করে।

এপিআই বাস্তবায়নের উদাহরণ

এই বিভাগে এমন কয়েকটি টেস্ট স্যুটের বর্ণনা দেওয়া হয়েছে, যেগুলিতে পূর্ববর্তী বিভাগগুলিতে আলোচিত API-গুলি ব্যবহার করা হয়েছে। এই API-গুলি কীভাবে প্রয়োগ ও ব্যবহার করা হয়, তার কিছু উদাহরণের জন্য এই পদ্ধতিগুলি দেখুন।

setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy এবং OnPreferredDevicesForStrategyChangedListener সিস্টেম এপিআইগুলোর ব্যবহারের একটি উদাহরণ হলো GTS-এ অবস্থিত PreferredDeviceRoutingTest মেথড।

AudioDeviceInfo তে নতুন কাঠামোর ব্যবহারের একটি উদাহরণ দেখতে, CTS-এ অবস্থিত AudioManagerTest#testGetDevices পদ্ধতিটি দেখুন।

get_audio_port_v7 এর বাস্তবায়নের একটি উদাহরণ audio_hal.c তে রয়েছে এবং এতে দেখানো হয়েছে কীভাবে একাধিক ডিভাইসের জন্য ক্যাপাবিলিটি কোয়েরি করা হয়।

বৈধতা

এই বিভাগে অডিও ম্যানেজারের CTS এবং GTS (Google Mobile Services Test Suite) যাচাইকরণ সম্পর্কিত তথ্য দেওয়া হয়েছে।

CTS পরীক্ষা

CTS টেস্টগুলো android.media.cts.AudioManagerTest এ অবস্থিত।

নিম্নলিখিত হলো উপলব্ধ অডিও ম্যানেজার টেস্টগুলোর তালিকা:

  • AudioManagerTest#testGetDevices

    অডিও ডিভাইসটির সুনির্দিষ্ট সক্ষমতা যাচাই করে। এটি আরও যাচাই করে যে, AudioDeviceInfo স্ট্রাকচারে ফেরত আসা অডিও প্রোফাইলগুলো পুরোনো, ফ্ল্যাটেনড অ্যারে ফরম্যাটের বিষয়বস্তু বজায় রাখে, কিন্তু নতুন AudioProfile ফরম্যাটে থাকে।

  • AudioManagerTest#testPreferredDevicesForStrategy and AudioManagerTest#testPreferredDeviceForCapturePreset

    কৌশল এবং ক্যাপচার প্রিসেট সম্পর্কিত এপিআই পরীক্ষার জন্য পছন্দের ডিভাইসগুলো সফলভাবে সম্পন্ন হয়েছে কিনা তা যাচাই করুন।

জিটিএস পরীক্ষা

GTS টেস্টগুলো com.google.android.gts.audioservice.AudioServiceHostTest এ অবস্থিত।

স্ট্র্যাটেজি এবং ক্যাপচার প্রিসেটের জন্য পছন্দের ডিভাইসগুলোর এপিআই (API) সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে, AudioServiceHostTest#testPreferredDeviceRouting এবং AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset টেস্টগুলো চালান।