Files
2025-12-03 11:12:34 +08:00

235 lines
6.6 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".aud_data_export.data.bss")
#pragma data_seg(".aud_data_export.data")
#pragma const_seg(".aud_data_export.text.const")
#pragma code_seg(".aud_data_export.text")
#endif
#include "aud_data_export.h"
#include "system/includes.h"
#include "audio_online_debug.h"
#include "circular_buf.h"
#include "app_config.h"
#include "time.h"
#define AUD_DE_LOG y_printf
/*支持的数据通道数:1~3*/
#define AUDIO_DATA_EXPORT_CH 1
enum {
AEC_ST_STOP = 0,
AEC_ST_INIT,
AEC_ST_START,
};
typedef struct {
u8 state;
u8 ch; /*export data ch num*/
u16 send_timer;
u8 packet[256];
#if (AUDIO_DATA_EXPORT_CH > 0)
u8 buf0[1024];
cbuffer_t data_cbuf0;
u32 seqn0;
#endif /*AUDIO_DATA_EXPORT_CH*/
#if (AUDIO_DATA_EXPORT_CH > 1)
u8 buf1[1024];
cbuffer_t data_cbuf1;
u32 seqn1;
#endif /*AUDIO_DATA_EXPORT_CH*/
#if (AUDIO_DATA_EXPORT_CH > 2)
u8 buf2[1024];
cbuffer_t data_cbuf2;
u32 seqn2;
#endif /*AUDIO_DATA_EXPORT_CH*/
} aud_data_export_t;
aud_data_export_t *aud_de = NULL;
typedef struct {
int cmd;
int data;
} rec_cmd_t;
int audio_data_export_start(u8 ch)
{
if (aud_de) {
AUD_DE_LOG("aud_de re-malloc !!!");
return 0;
}
aud_de = zalloc(sizeof(aud_data_export_t));
if (aud_de == NULL) {
AUD_DE_LOG("aud_de malloc failed!!!");
return -1;
}
if (ch <= AUDIO_DATA_EXPORT_CH) {
aud_de->ch = ch;
} else {
aud_de->ch = AUDIO_DATA_EXPORT_CH;
}
#if (AUDIO_DATA_EXPORT_CH > 0)
cbuf_init(&aud_de->data_cbuf0, aud_de->buf0, sizeof(aud_de->buf0));
aud_de->seqn0 = 0;
#endif /*AUDIO_DATA_EXPORT_CH*/
#if (AUDIO_DATA_EXPORT_CH > 1)
cbuf_init(&aud_de->data_cbuf1, aud_de->buf1, sizeof(aud_de->buf1));
aud_de->seqn1 = 0;
#endif /*AUDIO_DATA_EXPORT_CH*/
#if (AUDIO_DATA_EXPORT_CH > 2)
cbuf_init(&aud_de->data_cbuf2, aud_de->buf2, sizeof(aud_de->buf2));
aud_de->seqn2 = 0;
#endif /*AUDIO_DATA_EXPORT_CH*/
aud_de->state = AEC_ST_START;
return 0;
}
void audio_data_export_stop(void)
{
if (aud_de) {
if (aud_de->send_timer) {
sys_timer_del(aud_de->send_timer);
aud_de->send_timer = 0;
}
aud_de->state = AEC_ST_STOP;
free(aud_de);
aud_de = NULL;
}
}
static int spp_data_export(u8 ch, u8 *buf, u16 len)
{
u8 data_ch;
putchar('.');
if (ch == 0) {
data_ch = DB_PKT_TYPE_DAT_CH0;
} else if (ch == 1) {
data_ch = DB_PKT_TYPE_DAT_CH1;
} else {
data_ch = DB_PKT_TYPE_DAT_CH2;
}
int err = app_online_db_send_more(data_ch, buf, len);
if (err) {
printf("tx_err:%d", err);
}
return len;
}
int audio_data_export_run(u8 ch, u8 *data, int len)
{
int ret = 0;
if (aud_de && (aud_de->state == AEC_ST_START)) {
#if (AUDIO_DATA_EXPORT_CH > 0)
if (ch == 0) {
cbuf_write(&aud_de->data_cbuf0, data, len);
if (cbuf_get_data_size(&aud_de->data_cbuf0) >= 640) {
u8 tmp_buf[RECORD_CH0_LENGTH];
memcpy(tmp_buf, &aud_de->seqn0, 4);
s16 *data_buf = (s16 *)(&tmp_buf[4]);
cbuf_read(&aud_de->data_cbuf0, data_buf, 640);
spp_data_export(ch, tmp_buf, 644);
aud_de->seqn0 ++;
putchar('s');
}
}
#endif /*AUDIO_DATA_EXPORT_CH*/
#if (AUDIO_DATA_EXPORT_CH > 1)
else if (ch == 1) {
cbuf_write(&aud_de->data_cbuf1, data, len);
if (cbuf_get_data_size(&aud_de->data_cbuf1) >= 640) {
u8 tmp_buf[RECORD_CH1_LENGTH];
memcpy(tmp_buf, &aud_de->seqn1, 4);
s16 *data_buf = &tmp_buf[4];
cbuf_read(&aud_de->data_cbuf1, data_buf, 640);
spp_data_export(ch, tmp_buf, 644);
aud_de->seqn1 ++;
putchar('s');
}
}
#endif /*AUDIO_DATA_EXPORT_CH*/
#if (AUDIO_DATA_EXPORT_CH > 2)
else if (ch == 2) {
cbuf_write(&aud_de->data_cbuf2, data, len);
if (cbuf_get_data_size(&aud_de->data_cbuf2) >= 640) {
u8 tmp_buf[RECORD_CH2_LENGTH];
memcpy(tmp_buf, &aud_de->seqn2, 4);
s16 *data_buf = &tmp_buf[4];
cbuf_read(&aud_de->data_cbuf2, data_buf, 640);
spp_data_export(ch, tmp_buf, 644);
aud_de->seqn2 ++;
putchar('s');
}
}
#endif /*AUDIO_DATA_EXPORT_CH*/
}
return ret;
}
static int aud_online_data_export_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size)
{
int res_data = 0;
rec_cmd_t rec_cmd;
int err;
u8 parse_seq = ext_data[1];
//AUD_DE_LOG("aec_spp_rx,seq:%d,size:%d\n", parse_seq, size);
//put_buf(packet, size);
memcpy(&rec_cmd, packet, sizeof(rec_cmd_t));
switch (rec_cmd.cmd) {
case AUD_RECORD_COUNT:
if (aud_de) {
/* res_data = aud_de->ch; */
res_data = AUDIO_DATA_EXPORT_CH;
} else {
res_data = AUDIO_DATA_EXPORT_CH;
}
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 4);
if (err) {
printf("app_online_db_ack err:%d", err);
}
AUD_DE_LOG("query record_ch num:%d\n", res_data);
break;
case AUD_RECORD_START:
audio_data_export_start(AUDIO_DATA_EXPORT_CH);
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 1); //该命令随便ack一个byte即可
if (err) {
printf("app_online_db_ack err:%d", err);
}
AUD_DE_LOG("record_start\n");
break;
case AUD_RECORD_STOP:
AUD_DE_LOG("record_stop\n");
audio_data_export_stop();
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 1); //该命令随便ack一个byte即可
if (err) {
printf("app_online_db_ack err:%d", err);
}
break;
case ONLINE_OP_QUERY_RECORD_PACKAGE_LENGTH:
if (rec_cmd.data == 0) {
res_data = RECORD_CH0_LENGTH;
} else if (rec_cmd.data == 1) {
res_data = RECORD_CH1_LENGTH;
} else {
res_data = RECORD_CH2_LENGTH;
}
AUD_DE_LOG("query record ch%d packet length:%d\n", rec_cmd.data, res_data);
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 4); //回复对应的通道数据长度
if (err) {
printf("app_online_db_ack err:%d", err);
}
break;
}
return 0;
}
int aud_data_export_open(void)
{
app_online_db_register_handle(DB_PKT_TYPE_EXPORT, aud_online_data_export_parse);
return 0;
}
int aud_data_export_close(void)
{
if (aud_de) {
audio_data_export_stop();
}
return 0;
}