| 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 
 
 测试的视频:
 
 
 
 |