AC706N-le_audio-200SDK有线_无线麦录音demo
📎 原始文档:https://www.kdocs.cn/l/ca4cWEEsOC9L AC706N-le_audio-200SDK有线/无线麦录音demo
一、添加补丁程序:
【金山文档 | WPS云文档】 241104_706N_LE_AUDIO_200sdk_解决 package node 节点释放导致写异常的问题_media
https://kdocs.cn/l/cfwc1ivUZQbz
【金山文档 | WPS云文档】 le_audio_AC706N_2.0.0_patch_04_录音数据流修改补丁
https://kdocs.cn/l/cbdmZTiOqLR5
二、数据流修改:
1、目前资源限制,开启有线无线录音功能后,ram资源效果较多,demo修改限制为单无线麦连接
2、demo 有线无线单声道 :
有线无线立体声 :


三、程序修改:
app_main.c
app_config.h
#define USER_EX_RECORD_MODE_EN 1//有线无线麦外部录音功能使能
record.c
struct app_recode_handle {
struct file_recorder *recorder;
FILE *file;
char logo[20];
};

extern int get_rec_stream_state();
extern int ex_record_stream_open();
extern void ex_record_stream_close(void);
#define USER_RECORD_BACK_MUSIC 1//录音结束后返回音乐模式
static bool rec_back_music_flag = 0;
bool get_rec_back_music_flag(void){
y_printf("get_rec_back_music_flag:%d\n",rec_back_music_flag);
return rec_back_music_flag;
}
void set_rec_back_music_flag(bool flag){
rec_back_music_flag = flag;
}
void record_end_back_to_music(void) {
set_rec_back_music_flag(1);
app_send_message(APP_MSG_REC_BACK_TO_MUSIC, 0);
// sys_timeout_add(NULL, back_to_music_mode, 300);
}
static u8 record_mutex_create_flag = 0;
static u8 record_stream_dev_type = 0;
//rec_dev_type 0:rec_close,1:le_audio_mic,2:wire_mic_effect
void ex_record_mutex_init(void)
{
if(record_mutex_create_flag == 1) {
r_printf("record_mutex had creat...\n");
return;
}
os_mutex_create(&record_mutex);
record_mutex_create_flag = 1;
}
u8 u_get_stream_dev_type(){
y_printf("get-rec_dev_type:%d\n",record_stream_dev_type);
return record_stream_dev_type;
}
void u_set_stream_dev_type(u8 type){
y_printf("set-rec_dev_type:%x\n",type);
record_stream_dev_type = type;
}

if (record_mutex_create_flag != 1) {
y_printf("record_mutex creat\n");
os_mutex_create(&record_mutex);
record_mutex_create_flag = 1;
}


extern int get_rec_stream_state();
extern int ex_record_stream_open();
extern void ex_record_stream_close(void);
if(get_rec_stream_state()) {
ex_record_stream_close();
} else {
ex_record_stream_open();
}

static int rec_stream_open_flag = 0;
extern int file_recorder_close_without_Stream(struct file_recorder *recorder, bool close_file);
static struct jlstream *stream_temp = NULL;
struct jlstream *u_get_record_stream_temp(){
y_printf("get-stream_temp:%x\n",stream_temp);
return stream_temp;
}
void u_set_record_stream_temp(struct jlstream *stream){
y_printf("set-stream:%x\n",stream);
stream_temp = stream;
}
#if 0
void ex_record_stream_init(struct jlstream *stream)
{
y_printf(">>>> Enter Func: ex_record_stream_init!!\n");
extern void ex_record_mutex_init(void);
ex_record_mutex_init();
if(g_rec_hdl.recorder == NULL) {
r_printf("g_rec_hdl.recorder is NULL!\n");
struct file_recorder *recorder;
recorder = zalloc(sizeof(*recorder));
if (!recorder) {
/* jlstream_release(stream); */
r_printf("--> err:%s, %d!\n", __func__, __LINE__);
return;
}
g_rec_hdl.recorder = recorder;
}
if(stream != NULL) {
y_printf("init stream:%x\n",stream);
stream_temp = stream;
g_rec_hdl.recorder->stream = stream_temp;
y_printf("---> get new stream\n");
} else if(stream == NULL && stream_temp!=NULL) {
g_rec_hdl.recorder->stream = stream_temp;
y_printf("--->rec_init use stream_temp\n");
}else if(stream == NULL && stream_temp == NULL) {
r_printf("err stream=NULL,stream_temp=NULL\n");
g_rec_hdl.recorder = NULL;
return;
}
}
#else
void ex_record_stream_init(struct jlstream *stream)
{
y_printf(">>>> Enter Func: ex_record_stream_init!!\n");
if(stream != NULL) {
y_printf("init stream:%x\n",stream);
stream_temp = stream;
y_printf("---> get new stream\n");
} else if(stream == NULL && stream_temp!=NULL) {
y_printf("--->rec_init use stream_temp\n");
}else if(stream == NULL && stream_temp == NULL) {
r_printf("err stream=NULL,stream_temp=NULL\n");
return;
}
}
#endif
int ex_record_stream_open()
{
if (!dev_manager_get_total(0)) {
r_printf("--> err:%s, %d!\n", __func__, __LINE__);
return -1;
}
if ((get_cur_le_audio_player_cnt()==0) && (mic_effect_player_runing()==0)) {
r_printf("ex_record_stream_open err!!! no record_mic online\n");
return -1;
}
if(rec_stream_open_flag == 0) {
if(g_rec_hdl.recorder == NULL) {
r_printf("g_rec_hdl.recorder is NULL!\n");
struct file_recorder *recorder;
recorder = zalloc(sizeof(*recorder));
if (!recorder) {
/* jlstream_release(stream); */
r_printf("--> err:%s, %d!\n", __func__, __LINE__);
return -1;
}
g_rec_hdl.recorder = recorder;
}
if(stream_temp != NULL) {
y_printf("open stream:%x\n",stream_temp);
g_rec_hdl.recorder->stream = stream_temp;
y_printf("--->rec_open use stream_temp\n");
} else {
r_printf("--> err:%s, %d!\n", __func__, __LINE__);
g_rec_hdl.recorder = NULL;
return -1;
}
struct stream_enc_fmt fmt;
g_printf("0000 open stream:%x\n",g_rec_hdl.recorder->stream);
int err = file_recorder_get_fmt(g_rec_hdl.recorder, &fmt);
if (err) {
file_recorder_close(g_rec_hdl.recorder, 0);
r_printf("--> err:%s, %d!\n", __func__, __LINE__);
return -1;
}
printf("recorder_fmt: ch %d, sample rate %d\n", fmt.channel, fmt.sample_rate);
const char *suffix;
switch (fmt.coding_type) {
case AUDIO_CODING_PCM:
case AUDIO_CODING_WAV:
suffix = "wav";
break;
case AUDIO_CODING_MP3:
suffix = "mp3";
break;
default:
suffix = "bin";
break;
}
char folder[] = {TCFG_REC_FOLDER_NAME}; //录音文件夹名称
char filename[] = {TCFG_REC_FILE_NAME}; //录音文件名,不需要加后缀
#if (TCFG_NOR_REC)
char logo[] = {"rec_nor"}; //外挂flash录音
#elif (FLASH_INSIDE_REC_ENABLE)
char logo[] = {"rec_sdfile"}; //内置flash录音
#else
char *logo = dev_manager_get_phy_logo(dev_manager_find_active(0));//普通设备录音,获取最后活动设备
#endif
char *root_path = dev_manager_get_root_path_by_logo(logo);
char path[64] = {};
snprintf(path, sizeof(path), "%s%s/%s.%s", root_path, folder, filename, suffix);
g_rec_hdl.recorder->file = fopen(path, "w+");
extern const struct stream_file_ops recorder_fops;
jlstream_set_enc_file(g_rec_hdl.recorder->stream, g_rec_hdl.recorder, &recorder_fops);
snprintf(g_rec_hdl.logo, sizeof(g_rec_hdl.logo), "%s", logo);
g_rec_hdl.file = g_rec_hdl.recorder->file;
//记录播放录音需要的信息
memcpy(g_rec_play_hdl.path, path, sizeof(path));
memcpy(g_rec_play_hdl.suffix, suffix, strlen(suffix));
y_printf("ex_record_stream_open_suscess!!\n");
rec_stream_open_flag = 1;
}
return 0;
}
void ex_record_stream_close(void)
{
if(rec_stream_open_flag == 1) {
rec_stream_open_flag = 0;
y_printf(">> Func: ex_record_stream_close!\n");
os_mutex_pend(&record_mutex, 0);
//只关文件不关数据流
file_recorder_close_without_Stream(g_rec_hdl.recorder, 1);
g_rec_hdl.recorder = NULL;
os_mutex_post(&record_mutex);
}
}
//获取录音数据流状态
int get_rec_stream_state()
{
// y_printf("rec_stream:%d\n",rec_stream_open_flag);
return rec_stream_open_flag;
}
jlstream_event_handler.c
#if TCFG_APP_RECORD_EN && TCFG_KBOX_1T3_MODE_EN && USER_EX_RECORD_MODE_EN
extern int get_rec_stream_state();
static int wirless_rec_switch_get_status()
{
int state = get_rec_stream_state();
extern int get_cur_le_audio_player_cnt();
if(get_cur_le_audio_player_cnt() == 0) {
// putchar('6');
state = 0;
}
if(state == 0) {
// putchar('0');
}
// else {
// putchar('1');
// }
return state;
}
static int mic_effect_rec_switch_get_status()
{
int state = get_rec_stream_state();
extern bool mic_effect_player_runing();
if(mic_effect_player_runing() == 0) {
// putchar('7');
state = 0;
}
if(state == 0) {
// putchar('2');
}
// else {
// putchar('3');
// }
return state;
}
#endif
#if TCFG_APP_RECORD_EN && TCFG_MIC_EFFECT_ENABLE && USER_EX_RECORD_MODE_EN
if(!strcmp(arg, "Sw_micEffRec")) {
return (int)mic_effect_rec_switch_get_status;
}
#endif
#if TCFG_APP_RECORD_EN && TCFG_KBOX_1T3_MODE_EN && USER_EX_RECORD_MODE_EN
if(!strcmp(arg, "Sw_wirlessRec")) {
return (int)wirless_rec_switch_get_status;
}
#endif
mic_effect.c
#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
#include "file_recorder.h"
extern int get_rec_stream_state();
extern int ex_record_stream_open();
extern void ex_record_stream_close(void);
extern void ex_record_stream_init(struct jlstream *stream);
extern void u_set_stream_dev_type(u8 type);
#endif

#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
if(get_rec_stream_state()) {
r_printf(">>> mic_effect_player_open, close rec!!\n");
ex_record_stream_close();
}
ex_record_stream_init(player->stream);
u_set_stream_dev_type(2);
#endif

#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
if(get_rec_stream_state()) {
r_printf(">>> mic_effect_player_close, close rec!!\n");
ex_record_stream_close();
u_set_stream_dev_type(0);
}
#endif
le_audio_player.c
#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
#include "file_recorder.h"
extern int get_rec_stream_state();
extern int ex_record_stream_open();
extern void ex_record_stream_close(void);
extern void ex_record_stream_init(struct jlstream *stream);
extern void u_set_stream_dev_type(u8 type);
extern u8 u_get_stream_dev_type();
#endif
//获取连接le_audio的个数
int get_cur_le_audio_player_cnt()
{
int le_audio_cnt = 0;
for (int i = 0; i < 2; i++) {
if (g_le_audio_player_file[i].inused) {
le_audio_cnt++;
}
}
// g_printf(">> le_audio_cnt: %d\n", le_audio_cnt);
return le_audio_cnt;
}

#if TCFG_APP_RECORD_EN && TCFG_KBOX_1T3_MODE_EN && USER_EX_RECORD_MODE_EN
if (g_le_audio_player_file[i].stream == u_get_record_stream_temp()) {
r_f_printf("cur_close_stream == cur_record_stream !!!\n")
if (g_le_audio_player_file[(i+1)%2].inused) {
y_printf("V0001 set_le_audio_num:%d\n",g_le_audio_player_file[(i+1)%2].le_audio_num);
y_printf("V0001 set_stream:%x\n",g_le_audio_player_file[(i+1)%2].stream);
u_set_record_stream_temp(g_le_audio_player_file[(i+1)%2].stream);
} else {
y_printf("V0002 nomore le_audio\n");
u_set_record_stream_temp(NULL);
}
}
#endif

#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
y_printf("le_audio_player_create, stream:%x\n", player->stream);
if(get_rec_stream_state()) {
r_printf("le_audio_player_create, close rec!!\n");
if (u_get_stream_dev_type() != 1) {
ex_record_stream_close();
} else {
r_printf("le_audio_player_create, le_audio:recording!!! do not close record\n");
}
}
u_set_stream_dev_type(1);
ex_record_stream_init(player->stream);
#endif
r_printf("le_audio_open_now\n");

#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
int le_audio_mic_num = get_cur_le_audio_player_cnt();
if(get_rec_stream_state()) {
if (le_audio_mic_num != 2) {
r_printf("le_audio_mic_num!=2, close_le_audio_record\n");
ex_record_stream_close();
u_set_stream_dev_type(0);
} else {
r_printf("le_audio_mic_num==2, do not close_le_audio_record\n");
}
}
#endif
file_recorder.c

#if TCFG_APP_RECORD_EN && USER_EX_RECORD_MODE_EN
//只关文件编码不关数据流
int file_recorder_close_without_Stream(struct file_recorder *recorder, bool close_file)
{
int err = 0;
if (!recorder) {
return -EINVAL;
}
//不关流
/* jlstream_stop(recorder->stream, 50); */
/* jlstream_release(recorder->stream); */
if (close_file) {
err = recorder_fclose(recorder);
}
free(recorder);
jlstream_event_notify(STREAM_EVENT_CLOSE_RECODER, (int)"recorder");
return err;
}
#endif