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

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

Android 12 থেকে শুরু করে, অডিও ব্রডকাস্ট, BLE অডিও হেডফোনের একটি গ্রুপে মাল্টিকাস্ট করা বা একই সাথে একাধিক USB সাউন্ড কার্ড বেছে নেওয়ার মতো নতুন ব্যবহারের ক্ষেত্রে অনুমতি দেওয়ার জন্য এই সীমাবদ্ধতাগুলি সরিয়ে দেওয়া হয়েছে। একই সাথে একাধিক USB ডিভাইসে রাউটিং কাজ করে না।

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

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

একাধিক অডিও ডিভাইসে অডিও স্ট্রিম করার সুবিধা

Android 12-এ এই ফিচার কাজ করে এমন API-এর দুটি সেট আছে:

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

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

একটি স্ট্র্যাটেজির জন্য একাধিক পছন্দসই ডিভাইস ম্যানেজ করা

অডিও পলিসি ম্যানেজার সিস্টেম API অফার করে যাতে একাধিক অডিও ডিভাইসে একসাথে অডিও স্ট্রিম করার ক্ষেত্রে আরও ভাল সহায়তা প্রদান করা যায়। এইসব সিস্টেম API, কোনও নির্দিষ্ট স্ট্র্যাটেজির জন্য একাধিক পছন্দের ডিভাইস সেট করা, পাওয়া ও সরিয়ে দেওয়া যায়। Android 12 পর্যন্ত, এই ফিচারটি শুধুমাত্র একটি ডিভাইসের জন্য কাজ করত।

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

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

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

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

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

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

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

Audio Policy Manager, সিস্টেম API-এর নিম্নলিখিত তালিকা প্রদান করে(যেমন 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 স্ট্রাকচারের সাথে সংজ্ঞায়িত করা হয়েছে।

Audio HAL পদ্ধতি

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

  • 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);

Legacy API-তে পরিবর্তন

একাধিক অডিও প্রোফাইল কাজ করে এমন API-এর জন্য, লেগ্যাসি API-এর 3.2 ভার্সনে audio_port_v7 নামের একটি নতুন স্ট্রাকচার যোগ করা হয়েছে। আরও তথ্যের জন্য সোর্স কোড দেখুন।

audio_port_v7 যোগ করার ফলে, লিগ্যাসি API-এর 3.2 ভার্সনে audio_port_v7 স্ট্রাকচার ব্যবহার করে ডিভাইসের ক্ষমতা কোয়েরি করার জন্য get_audio_port_v7 নামের একটি নতুন API যোগ করা হয়েছে।

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);

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

API প্রয়োগের উদাহরণ

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

setPreferredDevicesForStrategy, getPreferredDevicesForStrategy, removePreferredDeviceForStrategy এবং OnPreferredDevicesForStrategyChangedListener সিস্টেম API-এর ব্যবহারের একটি উদাহরণ হল PreferredDeviceRoutingTest পদ্ধতি, যা GTS-এ অবস্থিত।

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 এবং AudioManagerTest#testPreferredDeviceForCapturePreset

    স্ট্র্যাটেজি ও ক্যাপচার প্রিসেট সম্পর্কিত API টেস্ট সফলভাবে সম্পূর্ণ হয়েছে কিনা তা যাচাই করুন।

GTS টেস্ট

GTS পরীক্ষা com.google.android.gts.audioservice.AudioServiceHostTest-এ অবস্থিত।

স্ট্র্যাটেজি ও ক্যাপচার প্রিসেটের জন্য পছন্দের ডিভাইসের API সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে, AudioServiceHostTest#testPreferredDeviceRouting ও AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset পরীক্ষা চালান।