187 lines
5.4 KiB
C++
187 lines
5.4 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 "app_sdmmc.h"
|
|
#include "audiobuffer.h"
|
|
#include "audioflinger.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);
|
|
}
|
|
}
|