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 में किए गए बदलाव
इस नए प्लेयर के साथ, ऑडियो 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>
इस डिवाइस कॉन्फ़िगरेशन की मदद से, AudioDeviceInfo.TYPE_FM_TUNER के साथ AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS का इस्तेमाल करके, एफएम रेडियो के इनपुट डिवाइस को ढूंढना आसान हो जाता है.
ऑडियो पैच बनाना
दो ऑडियो पोर्ट के बीच ऑडियो पैच बनाया जा सकता है. ये पोर्ट, मिक्स पोर्ट या डिवाइस पोर्ट हो सकते हैं. आम तौर पर, मिक्स पोर्ट से डिवाइस पोर्ट तक का ऑडियो पैच, चलाने के लिए होता है. वहीं, डिवाइस पोर्ट से मिक्स पोर्ट तक का ऑडियो पैच, कैप्चर करने के लिए होता है.
उदाहरण के लिए, ऐसा ऑडियो पैच जो 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() का इस्तेमाल करके, उपलब्ध सोर्स की सूची (पते से पहचाने गए) को वापस पाया जा सकता है. इसके बाद, ऑडियो के इस्तेमाल के हिसाब से, इन सोर्स और सिंक पोर्ट के बीच ऑडियो पैच बनाए जा सकते हैं. ऑडियो 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 का इस्तेमाल करें. ऐसा इसलिए, क्योंकि यह पैच बनाने के साथ-साथ, मीडिया की इवेंट को मैनेज करने के लिए मीडिया सेशन भी बनाता है. एक ही सोर्स और ऑडियो एट्रिब्यूट के लिए, ऑडियो के कई सोर्स बनाए जा सकते हैं. रेडियो के सामान्य इस्तेमाल के लिए एक सोर्स और ट्रैफ़िक की जानकारी देने के लिए दूसरा सोर्स बनाया जा सकता है.
Android 11 में, FM_TUNER को रिकॉर्ड करने की अनुमति बदलकर android.permission.CAPTURE_AUDIO_OUTPUT कर दी गई है.
अब इसके लिए, OP_RECORD_AUDIO अनुमति की जांच नहीं की जाती. यह अनुमति सिर्फ़ माइक्रोफ़ोन पर लागू होती है. इसका असर ऐप्लिकेशन पर नहीं पड़ना चाहिए, क्योंकि FM_TUNER को ऐक्सेस करने के लिए, पहले से ही SYSTEM_API अनुमति की ज़रूरत होती है.
रेडियो ऐप्लिकेशन बनाने के बारे में ज़्यादा जानने के लिए, रेडियो लागू करना देखें.