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

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

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

HwAudioSource প্লেয়ার

HwAudioSource অডিও সোর্স ডিভাইসটিকে সরাসরি একটি Android মিক্সারের সাথে সংযুক্ত করে।

প্রেরণা

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

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

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

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.xmlAUDIO_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 রেডিও ইনপুট ডিভাইস খুঁজে পেতে সুবিধা করতে পারেন।

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

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

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

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

  • ব্যবহারকারীরা একটি সাধারণ অ্যাপ সুইচের মাধ্যমে Android এবং 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>

অডিও ড্রাইভার API

আপনি উপলব্ধ উত্সগুলির একটি তালিকা পুনরুদ্ধার করতে getExternalSources() ব্যবহার করতে পারেন (ঠিকানা দ্বারা চিহ্নিত), তারপর অডিও ব্যবহার দ্বারা এই উত্স এবং সিঙ্ক পোর্টগুলির মধ্যে অডিও প্যাচ তৈরি করুন৷ অডিও 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 11-এ করার অনুমতি android.permission.CAPTURE_AUDIO_OUTPUT এ পরিবর্তিত হয়েছিল। এটি আর OP_RECORD_AUDIO অনুমতি পরীক্ষার মধ্য দিয়ে যায় না, যা শুধুমাত্র মাইক্রোফোনের ক্ষেত্রে প্রযোজ্য। এটি অ্যাপ্লিকেশানগুলিকে প্রভাবিত করবে না কারণ FM_TUNER অ্যাক্সেসের জন্য ইতিমধ্যে SYSTEM_API অনুমতি প্রয়োজন৷

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