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