doubao_chat/apps/wifi_camera/wifi/rt_talk_voice.c

87 lines
1.7 KiB
C

#include "system/includes.h"
#include "server/audio_server.h"
#include "server/video_dec_server.h"
static void *dev = NULL;
static u8 bindex = 0xff;
static u16 offset = 0;
extern u32 read_net_data_cbuf(void *buf, u32 len);
void rt_talk_voice_play(void)
{
if (0xFF == bindex) {
//printf("\n%s %d\n",__func__,__LINE__);
dev_ioctl(dev, AUDIOC_STREAM_ON, (u32)&bindex);
}
}
void rt_talk_voice_stop(void)
{
if (0 == bindex) {
//printf("\n%s %d\n",__func__,__LINE__);
dev_ioctl(dev, AUDIOC_STREAM_OFF, bindex);
bindex = 0xFF;
}
}
static void rt_talk_dac_irq_handler(void *priv, void *data, int len)
{
int rlen = len;
u16 data_len;
const u8 *table;
u8 buf[1024];
//printf("\n%s %d\n",__func__,__LINE__);
if (bindex == 0xFF) {
return;
}
data_len = read_net_data_cbuf(buf, rlen);
if (data_len == 0) {
memset((u8 *)data, 0, len);
/*printf("\n rt_talk recv no data \n");*/
} else {
memcpy(data, buf, data_len);
if (data_len < rlen) {
memset((u8 *)data + data_len, 0, len - data_len);
}
}
}
int rt_talk_voice_init(void)
{
int err;
u32 arg[2];
struct audio_format f;
dev = dev_open("audio", (void *)AUDIO_TYPE_DEC);
if (!dev) {
return 0;
}
f.volume = -1;
f.channel = 1;
f.sample_rate = 8000;
f.priority = 9;
err = dev_ioctl(dev, AUDIOC_SET_FMT, (u32)&f);
if (err) {
puts("format_err\n");
return 0;
}
arg[0] = 0;
arg[1] = (u32)rt_talk_dac_irq_handler;
dev_ioctl(dev, IOCTL_REGISTER_IRQ_HANDLER, (u32)arg);
return 0;
}
int rt_talk_voice_uninit(void)
{
dev_close(dev);
return 0;
}