200 lines
5.6 KiB
C++
200 lines
5.6 KiB
C++
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
#include "cmsis_os.h"
|
|
#include "hal_trace.h"
|
|
//#include "app_thread.h"
|
|
|
|
//#include "hal_sdmmc.h"
|
|
#include "SDFileSystem.h"
|
|
#include "audioflinger.h"
|
|
#include "audiobuffer.h"
|
|
#include "app_sdmmc.h"
|
|
|
|
|
|
#define APP_TEST_PLAYBACK_BUFF_SIZE (120 * 20)
|
|
#define APP_TEST_CAPTURE_BUFF_SIZE (120 * 20)
|
|
extern uint8_t app_test_playback_buff[APP_TEST_PLAYBACK_BUFF_SIZE] __attribute__ ((aligned(4)));
|
|
extern uint8_t app_test_capture_buff[APP_TEST_CAPTURE_BUFF_SIZE] __attribute__ ((aligned(4)));
|
|
SDFileSystem sdfs("sd");
|
|
|
|
int sd_open()
|
|
{
|
|
DIR *d = opendir("/sd");
|
|
if (!d)
|
|
{
|
|
TRACE(0,"sd file system borked\n");
|
|
return -1;
|
|
}
|
|
|
|
TRACE(0,"---------root---------\n");
|
|
struct dirent *p;
|
|
while ((p = readdir(d)))
|
|
{
|
|
int len = sizeof( dirent);
|
|
TRACE(2,"%s %d\n", p->d_name, len);
|
|
}
|
|
closedir(d);
|
|
TRACE(0,"--------root end-------\n");
|
|
}
|
|
|
|
extern uint32_t play_wav_file(char *file_path);
|
|
extern uint32_t stop_wav_file(void);
|
|
extern uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len);
|
|
|
|
void test_wave_play(bool on)
|
|
{
|
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
|
uint32_t reallen;
|
|
uint32_t totalreadsize;
|
|
uint32_t stime, etime;
|
|
|
|
char wave[] = "/sd/test_music.wav";
|
|
|
|
static bool isRun = false;
|
|
|
|
if (isRun==on)
|
|
return;
|
|
else
|
|
isRun=on;
|
|
|
|
|
|
TRACE(2,"%s %d\n", __func__, on);
|
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
|
if (on){
|
|
play_wav_file(wave);
|
|
|
|
stream_cfg.bits = AUD_BITS_16;
|
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
|
stream_cfg.sample_rate = AUD_SAMPRATE_48000;
|
|
|
|
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
|
stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
|
|
stream_cfg.vol = 0x03;
|
|
|
|
stream_cfg.handler = wav_file_audio_more_data;
|
|
stream_cfg.data_ptr = app_test_playback_buff;
|
|
stream_cfg.data_size = APP_TEST_PLAYBACK_BUFF_SIZE;
|
|
|
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
|
}else{
|
|
stop_wav_file();
|
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
FIL pcm_fil;
|
|
FRESULT pcm_res;
|
|
UINT pcm_num;
|
|
uint32_t pcm_save_more_data(uint8_t *buf, uint32_t len)
|
|
{
|
|
// TRACE(2,"%s\n len:%d", __func__, len);
|
|
|
|
audio_buffer_set_stereo2mono_16bits(buf, len, 1);
|
|
pcm_res = f_write(&pcm_fil,(uint8_t *)buf,len>>1,&pcm_num);
|
|
if(pcm_res != FR_OK)
|
|
{
|
|
TRACE(2,"[%s]:error-->res = %d", __func__, pcm_res);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void ad_tester(bool run)
|
|
{
|
|
char filename[] = "/sd/audio_dump.bin";
|
|
|
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
|
|
|
TRACE(2,"%s %d\n", __func__, run);
|
|
|
|
if (run){
|
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
|
pcm_res = f_open(&pcm_fil,"test2.bin",FA_CREATE_ALWAYS | FA_WRITE);
|
|
if (pcm_res) {
|
|
TRACE(2,"[%s]:Cannot creat test2.bin...%d",__func__, pcm_res);
|
|
return;
|
|
}
|
|
|
|
stream_cfg.bits = AUD_BITS_16;
|
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
|
stream_cfg.sample_rate = AUD_SAMPRATE_48000;
|
|
|
|
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
|
stream_cfg.io_path = AUD_INPUT_PATH_MAINMIC;
|
|
stream_cfg.vol = 0x03;
|
|
|
|
stream_cfg.handler = pcm_save_more_data;
|
|
stream_cfg.data_ptr = app_test_playback_buff;
|
|
stream_cfg.data_size = APP_TEST_PLAYBACK_BUFF_SIZE;
|
|
|
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
|
}else{
|
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
|
osDelay(1000);
|
|
|
|
f_close(&pcm_fil);
|
|
}
|
|
}
|
|
|
|
// if dump data into sd, buffer length should make sd card speed enough
|
|
// Bench32.exe can test sd card speed in PC, then make sure bufer length, buffer length < 16k(sd driver)
|
|
void dump_data2sd(enum APP_SDMMC_DUMP_T opt, uint8_t *buf, uint32_t len)
|
|
{
|
|
static FIL sd_fil;
|
|
FRESULT res;
|
|
|
|
|
|
ASSERT(opt < APP_SDMMC_DUMP_NUM, "[%s] opt(%d) >= APP_SDMMC_DUMP_NUM", __func__, opt);
|
|
|
|
if(opt == APP_SDMMC_DUMP_OPEN)
|
|
{
|
|
// res = f_open(&sd_fil,"dump.bin",FA_CREATE_ALWAYS | FA_WRITE);
|
|
res = f_open(&sd_fil,"test.txt",FA_READ);
|
|
|
|
// ASSERT(pcm_res == FR_OK,"[%s]:Cannot creat dump.bin, res = %d",__func__, pcm_res);
|
|
}
|
|
if(opt == APP_SDMMC_DUMP_READ)
|
|
{
|
|
res = f_read(&sd_fil, buf, len, &pcm_num);
|
|
|
|
// ASSERT(pcm_res == FR_OK,"[%s]:Cannot creat dump.bin, res = %d",__func__, pcm_res);
|
|
}
|
|
else if(opt == APP_SDMMC_DUMP_WRITE)
|
|
{
|
|
res = f_write(&sd_fil, buf, len, &pcm_num);
|
|
|
|
// ASSERT(pcm_res == FR_OK,"[%s]:Write dump.bin failed, res = %d", __func__, pcm_res);
|
|
}
|
|
else if(opt == APP_SDMMC_DUMP_CLOSE)
|
|
{
|
|
res = f_close(&sd_fil);
|
|
}
|
|
|
|
if(res == FR_OK)
|
|
{
|
|
TRACE(3,"[%s] SUCESS: opt = %d, res = %d",__func__, opt, res);
|
|
}
|
|
else
|
|
{
|
|
TRACE(3,"[%s] ERROR: opt = %d, res = %d",__func__, opt, res);
|
|
}
|
|
}
|