126 lines
2.9 KiB
C
126 lines
2.9 KiB
C
#include "app_config.h"
|
|
#include "system/timer.h"
|
|
#include "device/ioctl_cmds.h"
|
|
#include "fs/fs.h"
|
|
#include "system/init.h"
|
|
|
|
#if TCFG_HOST_AUDIO_ENABLE
|
|
#include "usb/host/usb_host.h"
|
|
#include "usb_ctrl_transfer.h"
|
|
#include "usb_bulk_transfer.h"
|
|
#include "audio.h"
|
|
#include "usb_config.h"
|
|
|
|
#define LOG_TAG_CONST USB
|
|
#define LOG_TAG "[AUDIO]"
|
|
#define LOG_ERROR_ENABLE
|
|
#define LOG_DEBUG_ENABLE
|
|
#define LOG_INFO_ENABLE
|
|
/* #define LOG_DUMP_ENABLE */
|
|
#define LOG_CLI_ENABLE
|
|
#include "debug.h"
|
|
|
|
#define TEST_FILE_ENABLE (0) //从sd卡读数据; 录制数据至sd卡
|
|
|
|
#if (TEST_FILE_ENABLE)
|
|
|
|
static FILE *play_file = NULL;
|
|
|
|
int usb_audio_record_get_buf(const usb_dev usb_id, void *ptr, u32 len, u8 channel, u32 sample_rate)
|
|
{
|
|
int ret = 0;
|
|
if (ptr == NULL && len == 0) {
|
|
//err
|
|
if (play_file) {
|
|
fclose(play_file);
|
|
play_file = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
if (!play_file) {
|
|
play_file = fopen(CONFIG_ROOT_PATH"raw.pcm", "r"); //单声道
|
|
/* play_file = fopen("storage/sd0/C/raw2.pcm", "r"); //双声道 */
|
|
if (!play_file) {
|
|
log_e("fopen play file faild!\n");
|
|
return -1;
|
|
}
|
|
}
|
|
//读sd卡数据到播放缓存中
|
|
ret = fread(ptr, len, 1, play_file);
|
|
if (ret != len) {
|
|
log_e(" file read buf err %d\n", ret);
|
|
fclose(play_file);
|
|
play_file = NULL;
|
|
return -1;
|
|
}
|
|
|
|
return len;
|
|
}
|
|
|
|
static FILE *record_file = NULL;
|
|
|
|
int usb_audio_play_put_buf(const usb_dev usb_id, void *ptr, u32 len, u8 channel, u32 sample_rate)
|
|
{
|
|
#if (TEST_FILE_ENABLE)
|
|
int ret = 0;
|
|
static u32 cnt = 0;
|
|
if (!record_file) {
|
|
record_file = fopen(CONFIG_ROOT_PATH"record01.pcm", "w+");
|
|
cnt = 0;
|
|
if (!record_file) {
|
|
log_e("fopen play file faild!\n");
|
|
return -1;
|
|
}
|
|
}
|
|
putchar('W');
|
|
ret = fwrite(ptr, len, 1, record_file);
|
|
if (ret != len) {
|
|
log_e(" file write buf err %d\n", ret);
|
|
fclose(record_file);
|
|
record_file = NULL;
|
|
return -1;
|
|
}
|
|
//test
|
|
if (cnt++ >= 800) {
|
|
cnt = 0;
|
|
log_info("stop record....\n");
|
|
fclose(record_file);
|
|
record_file = NULL;
|
|
}
|
|
#endif
|
|
|
|
return len;
|
|
}
|
|
|
|
static int usb_host_audio_test_init(void)
|
|
{
|
|
usb_host_audio_init(0, usb_audio_play_put_buf, usb_audio_record_get_buf);
|
|
#if USB_MAX_HW_NUM > 1
|
|
usb_host_audio_init(1, usb_audio_play_put_buf, usb_audio_record_get_buf);
|
|
#endif
|
|
return 0;
|
|
}
|
|
late_initcall(usb_host_audio_test_init);
|
|
|
|
#else
|
|
|
|
//主机收到从机通过usb发过来的数据
|
|
//ptr:usb数据指针
|
|
//len:读取的数据长度
|
|
int usb_audio_play_put_buf(const usb_dev usb_id, void *ptr, u32 len, u8 channel, u32 sample_rate)
|
|
{
|
|
return len;
|
|
}
|
|
|
|
//主机读取数据后通过usb发给从机
|
|
//ptr:usb数据指针
|
|
//len:发送的数据长度
|
|
int usb_audio_record_get_buf(const usb_dev usb_id, void *ptr, u32 len, u8 channel, u32 sample_rate)
|
|
{
|
|
return len;
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|