Kết nối một thiết bị đầu vào trong AAOS

Bạn có thể dùng các cơ chế sau để phát âm thanh trên Android:

Mỗi cơ chế cho phép phát âm thanh trong Android. Cho đài có thể không đủ để phát hoặc phát từ các thiết bị đầu vào, mặc dù mỗi công cụ này có thể được kết hợp với tính năng ghi âm hoặc MediaRecorder để ghi âm trước rồi phát lại qua Android. Đối với hệ thống ứng dụng cụ thể, thông tin sau có thể dùng để kết nối đầu vào sang bộ trộn đầu ra trong AAOS.

Trình phát HwAudioSource

HwAudioSource kết nối trực tiếp thiết bị nguồn âm thanh với bộ trộn Android.

Động lực

Có thể có một số hạn chế phát sinh khi sử dụng âm thanh giữa các thiết bị hoặc phần cứng với Android. Mỗi lựa chọn không thể nhận các sự kiện chính đối với nội dung nghe nhìn như PLAY, PAUSESTOP (DỪNG) và vì những thao tác này né tránh âm thanh của Android ngăn xếp, mỗi công cụ đều yêu cầu phần cứng để kết hợp bản vá vào âm thanh khác từ Android.

Sử dụng HwAudioSource

HwAudioSource là một loại trình phát mới được thiết kế dưới dạng bản vá phần mềm. Chiến dịch này cho phép các ứng dụng dùng trình phát này để nhận các sự kiện chính đối với nội dung đa phương tiện và dữ liệu đầu ra cho phép kết hợp và định tuyến bởi Android.

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

Thay đổi đối với HAL (Lớp trừu tượng phần cứng) cho âm thanh

Với trình phát mới này, hãy cân nhắc những kỳ vọng này đối với lớp trừu tượng phần cứng (HAL) cho âm thanh. Cho ví dụ: device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch yêu cầu thiết lập bản vá âm thanh từ một thiết bị sang một máy trộn.

  • adev_open_input_stream dự kiến audio_source sẽ AUDIO_SOURCE_FM_TUNER.

  • in_read lấp đầy vùng đệm âm thanh bằng dữ liệu âm thanh truyền tin.

Bạn nên định cấu hình thiết bị bộ dò thuộc loại AUDIO_DEVICE_IN_FM_TUNER trong 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>

Với cấu hình thiết bị này, bạn có thể dễ dàng tìm kiếm đầu vào đài FM thiết bị bằng cách sử dụng AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS trong kết hợp với AudioDeviceInfo.TYPE_FM_TUNER.

Tạo bản vá âm thanh

Bạn có thể tạo bản vá âm thanh giữa hai cổng âm thanh, đó là một cổng trộn hoặc cổng thiết bị. Thông thường, bản vá âm thanh từ cổng trộn đến cổng thiết bị dành cho phát trong khi chiều đảo ngược là để chụp.

Ví dụ: một bản vá âm thanh định tuyến các mẫu âm thanh từ nguồn FM_TUNER trực tiếp vào bồn lưu trữ phương tiện sẽ bỏ qua bộ trộn phần mềm. Sau đó, bạn phải sử dụng bộ trộn phần cứng để trộn các mẫu âm thanh từ Android và FM_TUNER cho bồn lưu trữ dữ liệu. Khi tạo bản vá âm thanh trực tiếp từ nguồn FM_TUNER đến nội dung nghe nhìn bồn lưu trữ dữ liệu:

  • Điều khiển âm lượng áp dụng cho bồn lưu trữ phương tiện và sẽ ảnh hưởng đến cả thiết bị Android và âm thanh FM_TUNER.

  • Người dùng có thể chuyển đổi giữa âm thanh Android và FM_TUNER thông qua một ứng dụng đơn giản chuyển đổi (không cần lựa chọn nguồn phương tiện rõ ràng).

Quá trình triển khai Automotive cũng có thể cần tạo một bản vá âm thanh giữa hai cổng thiết bị. Để thực hiện việc này, trước tiên bạn phải khai báo các cổng thiết bị và có thể các tuyến đường trong audio_policy_configuration.xml rồi liên kết các trạm trộn với cổng thiết bị.

Cấu hình mẫu

Xem cấu hình mẫu này, 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 trình điều khiển âm thanh

Bạn có thể sử dụng getExternalSources() để truy xuất danh sách các nguồn có sẵn (được xác định theo địa chỉ), sau đó tạo bản vá âm thanh giữa các nguồn này và cổng bồn lưu trữ dữ liệu theo mức sử dụng âm thanh. Các điểm truy cập tương ứng trên HAL âm thanh xuất hiện trong 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);
...
}

Bộ dò đài

Khi tạo ứng dụng radio, bạn nên sử dụng HwAudioSource vì ứng dụng này xử lý cả việc tạo bản vá cũng như phiên đa phương tiện để xử lý khoá đa phương tiện sự kiện. Bạn có thể tạo nhiều nguồn âm thanh cho cùng một nguồn và âm thanh . Có thể có một cái để sử dụng radio thường xuyên cũng như thứ hai là dùng cho thông báo giao thông.

Nếu ghi lại FM_TUNER, trong Android 11, quyền thực hiện đã được thay đổi thành android.permission.CAPTURE_AUDIO_OUTPUT. Không còn phải trải qua quy trình kiểm tra quyền OP_RECORD_AUDIO (điều này áp dụng) cho micrô. Việc này sẽ không ảnh hưởng đến các ứng dụng vì FM_TUNER đã có yêu cầu quyền SYSTEM_API để truy cập.

Xem Triển khai đài để biết thông tin chi tiết về tạo một ứng dụng radio.