เชื่อมต่ออุปกรณ์อินพุตใน AAOS

คุณใช้กลไกเหล่านี้เพื่อเล่นเสียงใน Android ได้โดยทำดังนี้

กลไกแต่ละอย่างช่วยให้เล่นไฟล์เสียงใน Android ได้ สำหรับวิทยุ การเล่นหรือการเล่นจากอุปกรณ์อินพุต ตัวเลือกเหล่านี้อาจไม่เพียงพอ แม้ว่าแต่ละองค์ประกอบจะสามารถ คู่กับการบันทึกเสียง หรือ MediaRecorder ให้บันทึกเสียงไว้ก่อน แล้วเล่นจาก Android สำหรับระบบ โดยเฉพาะอย่างยิ่ง คุณสามารถใช้ข้อมูลต่อไปนี้เพื่อเชื่อมต่ออินพุต อุปกรณ์ไปยังมิกเซอร์เอาต์พุตใน AAOS

โปรแกรมเล่น HwAudioSource

HwAudioSource เชื่อมต่ออุปกรณ์แหล่งที่มาของเสียงกับมิกเซอร์ของ Android โดยตรง

แรงจูงใจ

อาจมีข้อจำกัดหลายอย่างเมื่อใช้เสียงระหว่างอุปกรณ์กับฮาร์ดแวร์ แพตช์ของ Android แต่ละตัวเลือกจะรับเหตุการณ์สำคัญของสื่อไม่ได้ เช่น PLAY หยุดชั่วคราว และหยุด และเนื่องจากมีการหลบเลี่ยงเสียงของ 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

สร้างแพตช์เสียง

คุณสามารถสร้างแพตช์เสียงระหว่างพอร์ตเสียง 2 พอร์ต ไม่ว่าจะเป็นพอร์ตมิกซ์หรือพอร์ต พอร์ตของอุปกรณ์ โดยปกติแล้ว แพตช์เสียงจากพอร์ตมิกซ์ไปยังพอร์ตของอุปกรณ์นั้น ขณะที่ทิศทางกลับด้านมีไว้สำหรับการจับภาพ

เช่น แพตช์เสียงที่กำหนดเส้นทางตัวอย่างเสียงจากแหล่งที่มา FM_TUNER ไปยังซิงก์สื่อโดยตรงจะข้ามซอฟต์แวร์ผสม จากนั้นคุณต้องใช้ โปรแกรมผสมฮาร์ดแวร์สำหรับมิกซ์ตัวอย่างเสียงจาก Android และ FM_TUNER สำหรับ ซิงก์ เมื่อสร้างแพตช์เสียงจากแหล่งที่มา FM_TUNER ไปยังสื่อโดยตรง ซิงก์:

  • การควบคุมระดับเสียงจะใช้กับซิงก์สื่อ และจะส่งผลต่อทั้ง Android และเสียง FM_TUNER

  • ผู้ใช้สามารถสลับระหว่างเสียงระหว่าง Android และ FM_TUNER ผ่านแอปง่ายๆ ได้ (ไม่จำเป็นต้องมีตัวเลือกแหล่งที่มาสื่อที่ชัดเจน)

การติดตั้งใช้งานยานยนต์อาจต้องสร้างแพตช์เสียงระหว่าง 2 พอร์ตของอุปกรณ์ ในการดําเนินการดังกล่าว คุณต้องประกาศพอร์ตของอุปกรณ์ก่อน และถ้าเป็นไปได้ เส้นทางใน 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() เพื่อเรียกดูรายการแหล่งที่มาที่ใช้ได้ (ระบุโดยที่อยู่) แล้วสร้างแพตช์เสียงระหว่างแหล่งที่มาเหล่านี้และ พอร์ตซิงก์ตามการใช้งานเสียง จุดแรกเข้าที่เกี่ยวข้องใน 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 เนื่องจากแอปดังกล่าว จัดการทั้งการสร้างแพตช์และเซสชันสื่อเพื่อจัดการคีย์สื่อ กิจกรรม สามารถสร้างแหล่งที่มาของเสียงหลายแหล่งสำหรับแหล่งที่มาและเสียงเดียวกันได้ อาจมีอยู่คลื่นหนึ่งสำหรับการใช้งานวิทยุทั่วไป ชิ้นที่ 2 สำหรับประกาศการจราจร

หากบันทึก FM_TUNER ใน Android 11 สิทธิ์ในการดำเนินการเปลี่ยนเป็น android.permission.CAPTURE_AUDIO_OUTPUT คำขอไม่ผ่านการตรวจสอบสิทธิ์ OP_RECORD_AUDIO อีกต่อไป ไมโครโฟนเท่านั้น การดำเนินการนี้จะไม่ส่งผลต่อแอปตั้งแต่วันที่ FM_TUNER แล้ว ต้องมีสิทธิ์เข้าถึง SYSTEM_API

ดูรายละเอียดเกี่ยวกับติดตั้งวิทยุ ในการสร้างแอปวิทยุ