235 lines
6.6 KiB
C
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;
|
|
}
|