#include #include #include #include "ql_rtos.h" #include "ql_application.h" #include "ql_audio.h" #include "ql_iic.h" #include "ql_gpio.h" #include "ql_fs.h" #include "webclient.h" #include #include "sockets.h" #include "layer3.h" #include "ql_uart.h" const char *mp3_file[] ={ "test.mp3",// 0 "network_connect_zh.mp3",//1 系统启动中,正在等待网络连接 "network_check.mp3",//2 网络不好 请检查网络 "upgrading.mp3",//3 "volume20.mp3",//4 "volume40.mp3",//5 "volume60.mp3",//6 "volume80.mp3",//7 "volume100.mp3",//8 "tts_error.mp3",//9 "have_rest_zh.mp3",//10 小憩一下,待会儿见 "network_ok_zh.mp3",//11 已连上网络可以按键或刷卡跟我对话喔 "device_sleep_mode_zh.mp3",//12 进入休眠模式 "device_wake_up_zh.mp3",//13 设备已唤醒 "low_power_zh.mp3",//14 电量低 "low_power_off_zh.mp3",//15 电量严重不足,马上关机 "volume_up_zh.mp3",//16 "volume_down_zh.mp3",//17 "ai_active_zh.mp3",//18 "barge_in_cute.mp3",//19 对话打断提示音 }; //http://banban.api.talkingq.com:8080/assets/roles/banban/tts_error.mp3 //#define PCM_FILE "http://47.113.99.138:7050/output_16k.pcm" int http_file_download(const char *uri) { int res=0, length,total_length = 0; int resp_status = (-1); QFILE * fp = NULL; char fd_buff[128]={0x00}; u8 *buffer_read = NULL; //从url中分离文件名字 char *filename = strrchr(uri, '/'); if (filename==NULL) return -1; filename++;//remove '/' sprintf(fd_buff, "U:/%s", filename); printf("http_file_download:%s\n", fd_buff); ql_remove(fd_buff); fp = ql_fopen(fd_buff, "wb+"); if(fp==NULL) { printf("open file error\n"); res = -1; goto __exit; } struct webclient_session *session = NULL; session = webclient_session_create(1024); if (!session) { printf("open uri failed."); res = -1; goto __exit; } resp_status = webclient_get(session, uri); if (resp_status == 304) { printf("file download failed! Server http response : 304 not modified!"); res = -1; goto __exit; } if (resp_status != 200) { printf("file download failed! Server http response : %d !", resp_status); res = -1; goto __exit; } if (session->content_length == 0) { printf("Request file size is 0!"); res = -1; goto __exit; } // LOG_I("file size is (%d)", session->content_length); buffer_read = web_malloc(4096); if ((buffer_read == NULL)) { printf("No memory for http ota!"); res = -1; goto __exit; } printf("download start:%d\n", session->content_length); do { u32 nw; u32 page_pos; nw = 4096; if ((nw + total_length) > session->content_length) { nw = session->content_length - total_length; //log_i("last page, content_length:%d, total_length:%d, nw:%d\n", session->content_length, total_length, nw); } /* read */ page_pos = 0; do { length = webclient_read(session, buffer_read + page_pos, nw - page_pos); if (length <= 0) { printf("read error: %d, content_pos:%d, page_pos:%d\n", length, total_length, page_pos); break; } //LOG_I("webclient_read %d\n", length); page_pos += length; } while (page_pos < nw); /* read */ if (page_pos != nw) { res = -1; printf("page_pos error, %d:%d\n", page_pos, nw); goto __exit; } ql_fwrite(buffer_read, nw, 1, fp); total_length += nw; //print_progress(total_length, session->content_length); } while (total_length != session->content_length); printf("download end:%d\n", total_length); __exit: if(res==-1){ ql_remove(fd_buff); } if (session != NULL) webclient_close(session); if (buffer_read != NULL) web_free(buffer_read); if(fp!=NULL){ ql_fclose(fp); fp = NULL; } return res; } void app_file_check_download(void) { int index = 1; char url_buff[128]={0x00}; char filename_buff[64]={0x00}; int ret = 0, cnt = 0; for(index=1;index<20;index++){ /* barge_in_cute.mp3 is shipped in customer_fs and is not hosted by the * legacy prompt download service. */ if(index==4||index==5||index==6||index==7||index==8||index==19){ continue; } if(strlen(mp3_file[index])>0){ sprintf(filename_buff, "U:/%s", mp3_file[index]); if(ql_access(filename_buff, 0)!=0){ printf("downing mp3 file %d,%s\r\n", index,filename_buff); down_loop: sprintf(url_buff, "http://banban.api.talkingq.com:8080/assets/roles/banban/%s", mp3_file[index]); ret = http_file_download(url_buff); if(ret!=0&&cnt++<3) goto down_loop; } } } } void app_file_check_del(void) { int index = 1; char filename_buff[64]={0x00}; for(index=1;index<20;index++){ /* Keep the bundled barge-in prompt across app-only FOTA. Unlike the * server-managed prompts, it cannot be restored by the downloader. */ if(index==4||index==5||index==6||index==7||index==8||index==19){ continue; } if(strlen(mp3_file[index])>0){ sprintf(filename_buff, "U:/%s", mp3_file[index]); if(ql_access(filename_buff, 0)==0){ ql_remove(filename_buff); ql_rtos_task_sleep_ms(5); } } } } #if 0 //注意目前文件系统大小默认为256k uint8_t g_mp3_test1_buff[1024*60]; int32 g_mp3_test1_buff_len = 0; u16 pcm_buff[2*SHINE_MAX_SAMPLES]; u16 *pbuff=pcm_buff; void app_file_download(void) { QFILE *pcm_file_point=NULL; uint8_t* data_out=NULL; int count = 0; int nread = 0; struct lfs_info pcm_file; ql_rtos_task_sleep_ms(10000); pcm_file_point = ql_fopen("U:/output_16k.pcm","rb"); if(pcm_file_point==NULL) { printf("ql_fopen output_16k.pcm error\n"); http_file_download(PCM_FILE); pcm_file_point = ql_fopen("U:/output_16k.pcm","rb"); if(pcm_file_point==NULL) return; } ql_stat("U:/output_16k.pcm", &pcm_file); printf("pcm_file.size:%d\n", pcm_file.size); printf("pcm_file.name:%s\n", pcm_file.name); shine_t sh_shine; shine_config_t sh_config; //--------初始化config.mpeg结构 ------ shine_set_config_mpeg_defaults(&(sh_config.mpeg)); //--init sh_config struct //-------- 配置 config 结构 ------------- sh_config.wave.channels=PCM_MONO; //PCM_STEREO;//PCM_MONO; sh_config.wave.samplerate=16000;//valid samplerates: 44100,48000,32000,22050,24000,16000,11025,12000,8000 sh_config.mpeg.copyright=1; sh_config.mpeg.original=1; sh_config.mpeg.mode=MONO;//STEREO;//MONO; sh_config.mpeg.bitr=16; //64kbps for 16k //32kbps for 8k samplerate sh_shine=shine_initialise(&sh_config); do { nread=ql_fread(pcm_buff,sizeof(u16),576,pcm_file_point); printf("nread:%d\n", nread); if(nread<=0){ break; } else if(nread < 576){ //---小于喂给采样数时,剩余用0填充 printf("nread < samples_per_pass! nread = %d\n",nread); memset(pcm_buff+nread,0,(576-nread)*sizeof(u16)); }else{ data_out = shine_encode_buffer(sh_shine,&pbuff,&count); memcpy(g_mp3_test1_buff+g_mp3_test1_buff_len, data_out, count); g_mp3_test1_buff_len+=count; } }while(1); data_out=shine_flush(sh_shine,&count); memcpy(g_mp3_test1_buff+g_mp3_test1_buff_len, data_out, count); g_mp3_test1_buff_len+=count; printf("app_file_download:%d\n", g_mp3_test1_buff_len); if(pcm_file_point!=NULL){ ql_fclose(pcm_file_point); pcm_file_point = NULL; } if(sh_shine!=NULL){ shine_close(sh_shine); sh_shine = NULL; } unsigned char value = 0; for(count=0;count