Bluetooth 通过蓝牙a2dp源esp32发送音频

Bluetooth 通过蓝牙a2dp源esp32发送音频,bluetooth,embedded,esp32,Bluetooth,Embedded,Esp32,我正在尝试通过蓝牙而不是默认噪声将测量的i2s模拟信号(例如来自麦克风)发送到接收器设备。 目前我正在尝试更改bt\u应用程序\u a2d\u数据\u cb() static int32_t bt_app_a2d_data_cb(uint8_t*data,int32_t i2s_read_len) { 如果(i2s_read_len254)da=0; //} 免费(i2s\u read\u buff); i2s_read_buff=NULL; 返回i2s读取长度; } 我能听到水槽装置发出的锯

我正在尝试通过蓝牙而不是默认噪声将测量的i2s模拟信号(例如来自麦克风)发送到接收器设备。 目前我正在尝试更改
bt\u应用程序\u a2d\u数据\u cb()

static int32_t bt_app_a2d_data_cb(uint8_t*data,int32_t i2s_read_len)
{
如果(i2s_read_len<0||data==NULL){
返回0;
}
char*i2s_read_buff=(char*)calloc(i2s_read_len,sizeof(char));
字节读取=0;
i2s\U adc\U启用(i2s\U数量\U 0);
while(字节\读取==0)
{
i2s_读取(i2s_NUM_0、i2s_read_buff、i2s_read_len、字节_read、端口最大延迟);
}
i2s\U adc\U禁用(i2s\U数量\U 0);
//照顾看门狗//
TIMERG0.wdt_wprotect=TIMG_wdt_WKEY_值;
TIMERG0.wdt_feed=1;
TIMERG0.wdt_wprotect=0;
uint32_t j=0;
uint16_t dac_值=0;
//将16位输入信号更改为8位
对于(int i=0;i8);//&0xff;
//da++;
//如果(da>254)da=0;
//}
免费(i2s\u read\u buff);
i2s_read_buff=NULL;
返回i2s读取长度;
}
我能听到水槽装置发出的锯齿声。
有什么办法吗?

您的数据可以是一些浮点数的数组,表示模拟信号或模拟信号的变化,例如,32khz声音信号包含320000个浮点数,用于定义每秒捕获的声音。如果您的数据预计以脱机模式传输,您可以以一个缓冲区加上一个终止符符号,然后通过发送设备的蓝牙模块发送缓冲区,该模块连接到适当的微控制器。对于接收设备,如果您有类似“\r”的终止符字符您可以处理传入缓冲区,例如,对于我的情况,我必须发送一个数字字符串数组,但我通常最多收到一个或两个未知字符,为了避免出现这种情况,我在完成接收容器时拒绝了它


如果您想要在线模式,即您的数据必须同时传输和播放。您必须考虑延迟和合理的时间来处理所有的微控制器和设备,如蓝牙、EEPROM IC和…

< P>我还正在研究一个项目“A2DP源ESP32”。 我正在播放spiffs的wav文件

如果wav文件为44100 16位立体声,则可以直接将文件中的字节流写入阵列
data[]
。 当我试图写的数据少于
len
-变量中的数据并返回更少的数据(例如88)时,我遇到了一个错误,现在我正试图找出如何减少这个缓冲区,因为延迟太大(
len
=512)

此外,阵列
data[]
中的数据存储为立体声

示例:将数据从文件读取到数据[]-数组:

size_t read;
read = fread((void*) data, 1, len, fwave);//fwave is a file
if(read<len){//If get EOF, go to begin of the file
    fseek(fwave , 0x2C , SEEK_SET);//skip wav-header 44bytesт
    read = fread((void*) (&(data[read])), 1, len-read, fwave);//read up
}
size\u-t-read;
read=fread((void*)data,1,len,fwave);//fwave是一个文件
如果(读)
size_t read;
read = fread((void*) data, 1, len, fwave);//fwave is a file
if(read<len){//If get EOF, go to begin of the file
    fseek(fwave , 0x2C , SEEK_SET);//skip wav-header 44bytesт
    read = fread((void*) (&(data[read])), 1, len-read, fwave);//read up
}
int32_t lenHalf=len/2;
read = fread((void*) data, 1, lenHalf, fwave);
if(read<lenHalf){
    fseek(fwave , 0x2C , SEEK_SET);//skip wav-header 44bytesт
    read = fread((void*) (&(data[read])), 1, lenHalf-read, fwave);//read up

}
//copy to the second channel
uint16_t *data16=(uint16_t*)data;
for (int i = lenHalf/2-1; i >= 0; i--) {
    data16[(i << 1)] = data16[i];
    data16[(i << 1) + 1] = data16[i];
}