ESP32 官方的 USB 框架是 TinyUSB, 这次带来的是使用 TinyUSB 在 IDF 下实现的虚拟USB麦克风。
代码内置了一个正弦波的采样数据,录音机打开之后会送出:
- /*
- * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
- *
- * SPDX-License-Identifier: Unlicense OR CC0-1.0
- */
-
- #include <stdio.h>
- #include <math.h>
- #include "sdkconfig.h"
- #include "esp_err.h"
- #include "esp_log.h"
- #include "driver/uart.h"
- #include "usb_device_uac.h"
- #include "sine.h"
-
- static const char *TAG = "usb_uac_main";
-
- int audiobuffer=0;
-
- static esp_err_t uac_device_output_cb(uint8_t *buf, size_t len, void *arg)
- {
- //size_t bytes_written = 0;
- //bsp_extra_i2s_write(buf, len, &bytes_written, 0);
- ESP_LOGE(TAG, "ocb");
- return ESP_OK;
- }
-
- static esp_err_t uac_device_input_cb(uint8_t *buf, size_t len, size_t *bytes_read, void *arg)
- {
-
- for (int i=0;i<len;i++) {
- buf[i]=AudioData[(audiobuffer+i)%AUDIOLEN];
- }
- audiobuffer=(audiobuffer+len)%AUDIOLEN;
- ESP_LOGE(TAG, "icb");
- *bytes_read=len;
- return ESP_OK;
- }
-
- static void uac_device_set_mute_cb(uint32_t mute, void *arg)
- {
- ESP_LOGI(TAG, "uac_device_set_mute_cb: %"PRIu32"", mute);
- //bsp_extra_codec_mute_set(mute);
- }
-
- static void uac_device_set_volume_cb(uint32_t volume, void *arg)
- {
- ESP_LOGI(TAG, "uac_device_set_volume_cb: %"PRIu32"", volume);
- //bsp_extra_codec_volume_set(volume, NULL);
- }
-
- void app_main(void)
- {
- uart_config_t uart_config = {
- .baud_rate = 2000000,
- .data_bits = UART_DATA_8_BITS,
- .parity= UART_PARITY_DISABLE,
- .stop_bits=UART_STOP_BITS_1
- };
-
- uart_param_config(UART_NUM_0,&uart_config);
-
- uac_device_config_t config = {
- .output_cb = uac_device_output_cb,
- .input_cb = uac_device_input_cb,
- .set_mute_cb = uac_device_set_mute_cb,
- .set_volume_cb = uac_device_set_volume_cb,
- .cb_ctx = NULL,
- };
-
- uac_device_init(&config);
- }
复制代码
完整的代码:
simpleuac.zip
测试的视频:
|