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

आप Android में ऑडियो चलाने के लिए इन तंत्रों का उपयोग कर सकते हैं:

प्रत्येक तंत्र एंड्रॉइड में ऑडियो प्लेबैक करने की अनुमति देता है। रेडियो प्लेबैक या इनपुट डिवाइस से प्लेबैक के लिए, ये विकल्प पर्याप्त नहीं हो सकते हैं, हालांकि प्रत्येक को पहले ऑडियो कैप्चर करने और फिर इसे एंड्रॉइड से चलाने के लिए ऑडियो कैप्चर या 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();

ऑडियो एचएएल में परिवर्तन

इस नए प्लेयर के साथ, ऑडियो एचएएल के लिए इन अपेक्षाओं पर विचार करें। उदाहरण के लिए, 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 स्रोत से सीधे मीडिया सिंक तक रूट करता है, सॉफ़्टवेयर मिक्सर को बायपास करता है। फिर आपको सिंक के लिए Android और FM_TUNER के ऑडियो नमूनों को मिलाने के लिए एक हार्डवेयर मिक्सर का उपयोग करना होगा। FM_TUNER स्रोत से सीधे मीडिया सिंक तक ऑडियो पैच बनाते समय:

  • वॉल्यूम नियंत्रण मीडिया सिंक पर लागू होता है और इसे Android और 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() उपयोग कर सकते हैं, फिर ऑडियो उपयोग द्वारा इन स्रोतों और सिंक पोर्ट के बीच ऑडियो पैच बना सकते हैं। ऑडियो 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 अनुमति की आवश्यकता होती है।

रेडियो ऐप बनाने के बारे में विवरण के लिए रेडियो लागू करें देखें।