AAOS में इनपुट डिवाइस को कनेक्ट करना

Android में ऑडियो चलाने के लिए इन तरीकों का इस्तेमाल किया जा सकता है:

हर तरीका Android पर ऑडियो चलाने की सुविधा देता है. रेडियो के लिए इनपुट डिवाइसों से चलाना है, तो ये विकल्प शायद काफ़ी न हों. हालांकि, इनमें से हर एक को ऑडियो कैप्चर या ऑडियो रिकॉर्डिंग के साथ जोड़ा जा सकता है MediaRecorder क्लास का इस्तेमाल करें. इससे पहले ऑडियो कैप्चर किया जाएगा और फिर उसे Android से चलाया जा सकेगा. सिस्टम के लिए इनपुट को कनेक्ट करने के लिए नीचे दी गई जानकारी का इस्तेमाल किया जा सकता है. AAOS में आउटपुट मिक्सर पर स्विच करना है.

HwAudioSource प्लेयर

HwAudioSource, ऑडियो सोर्स डिवाइस को सीधे किसी Android मिक्सर से कनेक्ट करता है.

मोटिवेशन

डिवाइस-टू-डिवाइस या हार्डवेयर ऑडियो का इस्तेमाल करते समय कई रुकावटें आ सकती हैं Android के साथ पैच करें. हर विकल्प, मीडिया से जुड़े मुख्य इवेंट नहीं पा सकता, जैसे कि PLAY, PAUSE, STOP और क्योंकि ये 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();

ऑडियो एचएएल में बदलाव

इस नए प्लेयर के साथ, ऑडियो एचएएल की इन उम्मीदों को ध्यान में रखें. इसके लिए उदाहरण, 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_DEVICE_IN_FM_TUNER टाइप वाला ट्यूनर डिवाइस कॉन्फ़िगर करें audio_policy_configuration.xml में:

<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 सोर्स से ऑडियो के सैंपल रूट करता है सॉफ़्टवेयर मिक्सर को बायपास कर सकता है. इसके बाद, आपको इस हार्डवेयर मिक्सर में, 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>

ऑडियो ड्राइवर एपीआई

उपलब्ध सोर्स की सूची पाने के लिए, getExternalSources() का इस्तेमाल किया जा सकता है (पते से पहचाना गया) हो, तो इन सोर्स और ऑडियो के इस्तेमाल के हिसाब से, पोर्ट सिंक करने की सुविधा मिलती है. ऑडियो एचएएल पर इससे जुड़े एंट्री पॉइंट 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 अनुमति की आवश्यकता है.

रेडियो स्टेशन का इस्तेमाल करने के बारे में जानकारी पाने के लिए, रेडियो लागू करना देखें रेडियो ऐप्लिकेशन बनाने में मदद करता है.