AAOS-এ একটি ইনপুট ডিভাইস সংযুক্ত করুন

অ্যান্ড্রয়েডে অডিও চালানোর জন্য আপনি এই পদ্ধতিগুলো ব্যবহার করতে পারেন:

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

HwAudioSource প্লেয়ার

HwAudioSource অডিও উৎস ডিভাইসটিকে সরাসরি একটি অ্যান্ড্রয়েড মিক্সারের সাথে সংযুক্ত করে।

প্রেরণা

অ্যান্ড্রয়েডের সাথে ডিভাইস-টু-ডিভাইস বা হার্ডওয়্যার অডিও প্যাচ ব্যবহার করার সময় বেশ কিছু সীমাবদ্ধতা দেখা দিতে পারে। এই প্রতিটি বিকল্পই প্লে (PLAY) , পজ (PAUSE) , এবং স্টপ (STOP)- এর মতো মিডিয়া কী ইভেন্ট গ্রহণ করতে পারে না এবং, যেহেতু এগুলো অ্যান্ড্রয়েডের অডিও স্ট্যাককে এড়িয়ে চলে, তাই অ্যান্ড্রয়েডের অন্যান্য অডিওর সাথে প্যাচটিকে মিশ্রিত করার জন্য হার্ডওয়্যারের প্রয়োজন হয়।

HwAudioSource ব্যবহার করুন

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

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

অডিও HAL-এর পরিবর্তন

এই নতুন প্লেয়ারটির ক্ষেত্রে, অডিও HAL-এর জন্য এই প্রত্যাশাগুলো বিবেচনা করুন। উদাহরণস্বরূপ, device/generic/car/emulator/audio/driver/audio_hw.c

  • adev_create_audio_patch একটি ডিভাইস থেকে মিক্সারে অডিও প্যাচ স্থাপনের জন্য অনুরোধ গ্রহণ করে।

  • adev_open_input_stream জন্য audio_source টি AUDIO_SOURCE_FM_TUNER হওয়া প্রয়োজন।

  • in_read ব্রডকাস্ট রেডিও অডিও ডেটা দিয়ে অডিও বাফারটি পূরণ করে।

আমরা আপনাকে audio_policy_configuration.xml ফাইলে AUDIO_DEVICE_IN_FM_TUNER টাইপের একটি টিউনার ডিভাইস কনফিগার করার পরামর্শ দিচ্ছি:

<devicePort
    tagName="Tuner_source"
    type="AUDIO_DEVICE_IN_FM_TUNER"
    role="source"
    address="tuner0">
    <profile
        name=""
        format="AUDIO_FORMAT_PCM_16_BIT"
        samplingRates="48000"
        channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</devicePort>

এই ডিভাইস কনফিগারেশনের মাধ্যমে, আপনি AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS ) এবং AudioDeviceInfo.TYPE_FM_TUNER একত্রে ব্যবহার করে এফএম রেডিও ইনপুট ডিভাইস খুঁজে বের করার প্রক্রিয়া সহজ করতে পারেন।

অডিও প্যাচ তৈরি করুন

আপনি দুটি অডিও পোর্টের মধ্যে একটি অডিও প্যাচ তৈরি করতে পারেন, যা মিক্স পোর্ট বা ডিভাইস পোর্ট হতে পারে। সাধারণত, মিক্স পোর্ট থেকে ডিভাইস পোর্টে অডিও প্যাচ প্লেব্যাকের জন্য ব্যবহৃত হয়, আর এর বিপরীত দিকটি ক্যাপচারের জন্য।

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

  • ভলিউম কন্ট্রোল মিডিয়া সিঙ্কের ক্ষেত্রে প্রযোজ্য এবং এটি অ্যান্ড্রয়েড ও FM_TUNER উভয় অডিওকেই প্রভাবিত করবে।

  • ব্যবহারকারীরা একটি সাধারণ অ্যাপ সুইচের মাধ্যমে অ্যান্ড্রয়েড এবং FM_TUNER অডিওর মধ্যে পরিবর্তন করতে পারেন (এর জন্য আলাদা করে কোনো মিডিয়া সোর্স বেছে নেওয়ার প্রয়োজন নেই)।

অটোমোটিভ বাস্তবায়নের ক্ষেত্রে দুটি ডিভাইস পোর্টের মধ্যে একটি অডিও প্যাচ তৈরি করার প্রয়োজন হতে পারে। এটি করার জন্য, আপনাকে প্রথমে audio_policy_configuration.xml ফাইলে ডিভাইস পোর্ট এবং সম্ভাব্য রুটগুলো ঘোষণা করতে হবে এবং তারপর ডিভাইস পোর্টগুলোর সাথে মিক্সপোর্ট যুক্ত করতে হবে।

নমুনা কনফিগারেশন

এই নমুনা কনফিগারেশনটি দেখুন, device/generic/car/emulator/audio/audio_policy_configuration.xml

<audioPolicyConfiguration>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_media_out</item>
                <item>bus1_audio_patch_test_in</item>
            </attachedDevices>
            <mixPorts>
                <mixPort name="mixport_bus0_media_out" role="source"
                        flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="mixport_audio_patch_in" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                           samplingRates="48000"
                           channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
                        address="bus0_media_out">
                    <profile balance="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
                <devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
                        address="bus1_audio_patch_test_in">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/>
                <route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>

অডিও ড্রাইভার এপিআই

আপনি getExternalSources() ব্যবহার করে উপলব্ধ সোর্সগুলির (অ্যাড্রেস দ্বারা চিহ্নিত) একটি তালিকা পেতে পারেন, তারপর অডিও ব্যবহারের মাধ্যমে এই সোর্সগুলি এবং সিঙ্ক পোর্টগুলির মধ্যে অডিও প্যাচ তৈরি করতে পারেন। Audio HAL-এর সংশ্লিষ্ট এন্ট্রি পয়েন্টগুলি IDevice.hal এ পাওয়া যায়।

Interface IDevice {
...
/
*   Creates an audio patch between several source and sink ports.  The handle
*   is allocated by the HAL and must be unique for this audio HAL module.
*
*   @param sources patch sources.
*   @param sinks patch sinks.
*   @return retval operation completion status.
*   @return patch created patch handle.
*/
createAudioPatch(vec<AudioPortConfig> sources, vec<AudioPortConfig> sinks)
       generates (Result retval, AudioPatchHandle patch);

*   Release an audio patch.
*
*   @param patch patch handle.
*   @return retval operation completion status.
*/
releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
...
}

রেডিও টিউনার

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

অ্যান্ড্রয়েড ১১-এ FM_TUNER রেকর্ড করার জন্য প্রয়োজনীয় পারমিশন android.permission.CAPTURE_AUDIO_OUTPUT এ পরিবর্তন করা হয়েছে। এর জন্য এখন আর OP_RECORD_AUDIO পারমিশন চেকের প্রয়োজন হয় না, যা শুধুমাত্র মাইক্রোফোনের ক্ষেত্রে প্রযোজ্য। এতে অ্যাপগুলোর ওপর কোনো প্রভাব পড়ার কথা নয়, কারণ FM_TUNER অ্যাক্সেস করার জন্য আগে থেকেই SYSTEM_API পারমিশন প্রয়োজন হয়।

একটি রেডিও অ্যাপ তৈরি করার বিষয়ে বিস্তারিত জানতে 'ইমপ্লিমেন্ট রেডিও' দেখুন।