คุณสามารถใช้กลไกเหล่านี้เพื่อเล่นเสียงใน 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_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>
ด้วยการกำหนดค่าอุปกรณ์นี้ คุณสามารถอำนวยความสะดวกในการค้นหาอุปกรณ์อินพุตวิทยุ FM ได้โดยใช้ AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
ร่วมกับ AudioDeviceInfo.TYPE_FM_TUNER
สร้างแพทช์เสียง
คุณสามารถสร้างแพตช์เสียงระหว่างพอร์ตเสียงสองพอร์ต ไม่ว่าจะเป็นพอร์ตมิกซ์หรือพอร์ตอุปกรณ์ก็ได้ โดยทั่วไปแล้ว แพตช์เสียงจากพอร์ตมิกซ์ไปยังพอร์ตอุปกรณ์จะใช้สำหรับการเล่น ในขณะที่ทิศทางย้อนกลับใช้สำหรับการบันทึก
ตัวอย่างเช่น แพตช์เสียงที่กำหนดเส้นทางตัวอย่างเสียงจากแหล่ง FM_TUNER
ไปยังแหล่งรวมสื่อโดยตรงจะข้ามตัวผสมซอฟต์แวร์ จากนั้นคุณต้องใช้ตัวผสมฮาร์ดแวร์เพื่อผสมตัวอย่างเสียงจาก Android และ FM_TUNER
สำหรับ sink เมื่อสร้างแพตช์เสียงโดยตรงจากแหล่ง 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()
เพื่อดึงรายการแหล่งที่มาที่มีอยู่ (ระบุตามที่อยู่) จากนั้นสร้างแพตช์เสียงระหว่างแหล่งที่มาเหล่านี้และพอร์ตซิงก์ตามการใช้เสียง จุดเข้าที่สอดคล้องกันบน Audio 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
ในการเข้าถึงอยู่แล้ว
ดู การใช้งานวิทยุ สำหรับรายละเอียดเกี่ยวกับการสร้างแอปวิทยุ