[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/lib/libvoice/Makefile b/ap/lib/libvoice/Makefile
new file mode 100644
index 0000000..e092fad
--- /dev/null
+++ b/ap/lib/libvoice/Makefile
@@ -0,0 +1,85 @@
+# /*****************************************************************************
+#* °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+#*
+#* ÎļþÃû³Æ: Makefile
+#* Îļþ±êʶ: Makefile
+#* ÄÚÈÝÕªÒª: Makefile of ZTE librarys
+#* ʹÓ÷½·¨: void
+#*
+#* ÐÞ¸ÄÈÕÆÚ °æ±¾ºÅ Ð޸ıê¼Ç ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
+#* -----------------------------------------------------------------------------
+#* 2019/09/25 V1.0 Create xxq ´´½¨
+#*
+# ******************************************************************************/
+
+#*******************************************************************************
+# include ZTE library makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+
+#*******************************************************************************
+# library
+#*******************************************************************************
+LIB_SHARED = libvoice.so
+LIB_STATIC = libvoice.a
+
+OBJS = voice.o
+CFLAGS += -g
+LDFLAGS += -lpthread
+
+##############USER COMIZE END##################
+
+CFLAGS += -I$(zte_lib_path)/libtinyalsa/include
+CFLAGS += -I$(STAGEDIR)/include
+CFLAGS += -I$(APP_DIR)/include
+CFLAGS += -fPIC
+
+LDFLAGS_SHARED += -shared
+
+
+#*******************************************************************************
+# comp test app and
+#*******************************************************************************
+
+
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+
+
+
+
+#########################for linux######################################
+
+
+
+
+
+CFLAGS += -I./include/
+CFLAGS += -g -Werror=implicit-function-declaration
+SHAREDFLAG := -shared -lc
+LDLIBS += -L$(LIB_DIR)/libtinyalsa
+LDLIBS += -ltinyalsa
+
+all: $(LIB_STATIC) $(LIB_SHARED)
+
+$(LIB_STATIC) : $(OBJS)
+ $(AR) rcs $(LIB_STATIC) $(OBJS)
+
+$(LIB_SHARED): $(OBJS)
+ $(CC) $(LDFLAGS) $(LDFLAGS_SHARED) -o $@ $^
+
+
+
+
+clean:
+ rm -f $(lib_OBJECTS) $(LIB_SHARED) $(LIB_STATIC) *.elf *.gdb *.o core
+
+romfs:
+ $(ROMFSINST) $(LIB_SHARED) /lib/$(LIB_SHARED)
+
+
+
+
diff --git a/ap/lib/libvoice/include/voice_lib.h b/ap/lib/libvoice/include/voice_lib.h
new file mode 100644
index 0000000..d2baae2
--- /dev/null
+++ b/ap/lib/libvoice/include/voice_lib.h
@@ -0,0 +1,18 @@
+
+/*
+ * Copyright (C) 2019 ZTE, China
+ *
+ * This is the header file for the voice lib.
+ *
+ */
+
+#ifndef __VOICE_LIB_H
+#define __VOICE_LIB_H
+
+ int voice_close(T_Voice_Para *para);
+ int voice_open(T_Voice_Para *para);
+ int voice_Vploop(int *path);
+ int zDrvVolte_PreOpen(T_ZDrvVolte_Cfg *cfgParam);
+ void zDrvVolte_PreClose(void);
+
+#endif
diff --git a/ap/lib/libvoice/voice.c b/ap/lib/libvoice/voice.c
new file mode 100644
index 0000000..696c2ea
--- /dev/null
+++ b/ap/lib/libvoice/voice.c
@@ -0,0 +1,316 @@
+/*****************************************************************************
+** °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+**
+** ÎļþÃû³Æ: voice.c
+** Îļþ±êʶ:
+** ÄÚÈÝÕªÒª:
+** ʹÓ÷½·¨:
+**
+** ÐÞ¸ÄÈÕÆÚ °æ±¾ºÅ Ð޸ıê¼Ç ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
+** -----------------------------------------------------------------------------
+** 2019/09/25 V1.0 Create xxq ´´½¨
+**
+* ******************************************************************************/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <stdint.h>
+#include <linux/volte_drv.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <tinyalsa/audio_mixer_ctrl.h>
+
+#define VOICE_DEV_NAME "/dev/voice_device"
+
+
+
+typedef struct {
+ int fd;
+ unsigned int state; // 0 close;1 open
+ T_Voice_Para vpara;
+} T_voiceInfo;
+
+T_voiceInfo *voiceinfo = NULL;
+
+static int slic_flag = 0;
+static int slic_flag_already = 0;// 0 not get ,1 already get
+
+struct pcm *volte_pcm_voice_out = NULL;
+struct pcm *volte_pcm_voice_in = NULL;
+
+#if 0
+
+
+T_Voice_Para gsmhwpara = {
+ 8000, //8000;16000
+ 0, //// 0 gsm;1 td;2 wcdma;3 lte
+ 0//0 hardware dsp;1 soft amr lib
+};
+
+T_Voice_Para tdnbhwpara = {
+ 8000, //8000;16000
+ 1, //// 0 gsm;1 td;2 wcdma;3 lte
+ 0,//0 amr-nb;1 amr-wb
+ 0//0 hardware dsp;1 soft amr lib
+};
+
+T_Voice_Para tdnbsfpara = {
+ 8000, //8000;16000
+ 1, //// 0 gsm;1 td;2 wcdma;3 lte
+ 0,//0 amr-nb;1 amr-wb
+ 1//0 hardware dsp;1 soft amr lib
+};
+
+T_Voice_Para tdwbsfpara = {
+ 8000, //8000;16000
+ 1, //// 0 gsm;1 td;2 wcdma;3 lte
+ 1,//0 amr-nb;1 amr-wb
+ 1//0 hardware dsp;1 soft amr lib
+};
+
+
+#endif
+//static volatile int voiceinfo.fd = 0;
+
+
+int voice_open(T_Voice_Para *para)
+{
+ int ret = 0;
+ if (!para) {
+
+ printf("voice: open para is NULL.\n");
+
+ return -1;
+ }
+
+ voiceinfo = calloc(1, sizeof(T_voiceInfo));
+ if (!voiceinfo) {
+
+ printf("voice: open calloc fail!\n");
+ return -1;
+ }
+
+ voiceinfo->vpara = *para;
+
+ voiceinfo->fd = open(VOICE_DEV_NAME, O_RDONLY);
+ if (voiceinfo->fd < 0) {
+ printf("voice lib: open voice device error.\n");
+ free(voiceinfo);
+ return -1;
+
+ }
+
+
+ ret = ioctl(voiceinfo->fd, VOICE_IOCTL_START, para);
+ if (ret) {
+ printf("voice lib: voice start fd=%d,ret=%d.\n", voiceinfo->fd, ret);
+ goto err;
+ }
+ printf("voice open end !\n");
+
+ return 0;
+
+err:
+ close(voiceinfo->fd);
+ free(voiceinfo);
+ printf("voice open err end !\n");
+ return -1;
+
+
+}
+
+
+int voice_close(T_Voice_Para *para)
+{
+ int ret = 0;
+
+ if (!voiceinfo) {
+
+ printf("voice: close voiceinfo is NUll!\n");
+ return 0;
+ }
+
+ ret = ioctl(voiceinfo->fd, VOICE_IOCTL_STOP, para);
+
+ if (ret) {
+ printf("voice lib: voice stop fd=%d,ret=%d.\n", voiceinfo->fd, ret);
+ }
+
+ if (voiceinfo->fd >= 0) {
+ close(voiceinfo->fd);
+ }
+ voiceinfo->fd = -1;
+
+ free(voiceinfo);
+ voiceinfo = NULL;
+
+ printf("voice close end !\n");
+
+ return 0;
+}
+int voice_Vploop(int *path)
+{
+ int ret = 0;
+ int fd = -1;
+ printf("voice_Vploop: start path=%d!\n",*path);
+ fd = open(VOICE_DEV_NAME, O_RDONLY);
+ if (fd < 0) {
+ printf("voice_Vploop: open voice device error.\n");
+ return -1;
+ }
+ ret = ioctl(fd, VOICE_IOCTL_VPLOOP, path);
+ if (ret) {
+ printf("voice_Vploop: ret=%d,path=%p.\n", ret, path);
+ close(fd);
+ return -1;
+ }
+ close(fd);
+ return 0;
+
+}
+
+int voice_GetSlicFlag(void)
+{
+ int ret = 0;
+ int fd = -1;
+ int flag = 0;
+ printf("voice_GetSlicFlag: start!\n");
+ fd = open(VOICE_DEV_NAME, O_RDONLY);
+ if (fd < 0) {
+ printf("voice_GetSlicFlag: open voice device error.\n");
+ return -1;
+ }
+ ret = ioctl(fd, VOICE_IOCTL_GET_SLIC_USE_FLAG, &flag);
+ if (ret) {
+ printf("voice_GetSlicFlag: ret=%d,flag=%d.\n", ret, flag);
+ close(fd);
+ return -1;
+ }
+ close(fd);
+ slic_flag_already = 1;
+ return flag;
+
+}
+
+int zDrvVolte_PreOpen(T_ZDrvVolte_Cfg *cfgParam)
+{
+
+
+ struct mixer *voice_mixer = NULL;
+ struct pcm_config config_voice = {0};
+ printf(" voice lib zDrvVolte_PreOpen!\n");
+
+ if (slic_flag_already == 1) {
+ printf(" voice slic flag already get, slic_flag=%d!\n", slic_flag);
+ if (slic_flag == 1) {
+ return 0;
+ }
+
+ } else {
+ slic_flag = voice_GetSlicFlag();
+ printf(" voice slic flag get, slic_flag=%d!\n", slic_flag);
+ if (slic_flag == 1) {
+ return 0;
+ }
+ }
+
+
+ //open mixer dev for codec control
+ voice_mixer = mixer_open(0);
+ if (!voice_mixer) {
+ printf("zte voice_mixer open failed!\n");
+ return -1;
+ }
+
+ //config mixer dev
+ mix_set_voice_path(voice_mixer, T_OUTPUT_SPEAKER);
+ mix_set_voice_vol(voice_mixer, T_VOICE_VOL_3_LEVEL);
+
+ //close mixer
+ mixer_close(voice_mixer);
+ voice_mixer = NULL;
+
+ //open pcm dev for data tranf
+ config_voice.channels = cfgParam->channel_count;
+ config_voice.rate = cfgParam->clock_rate;
+ //buffer num
+ config_voice.period_count = 3;
+ //buffer size
+ config_voice.period_size = cfgParam->samples_per_frame * cfgParam->bits_per_sample / 8;
+ //16-bit signed
+ config_voice.format = PCM_FORMAT_S16_LE;
+
+ //card 0 dev 1
+ //23G card 0 dev 2
+ volte_pcm_voice_out = pcm_open(0, 1, PCM_OUT, &config_voice);
+ if (!pcm_is_ready(volte_pcm_voice_out)) {
+ printf("zte volte_pcm_voice_out open failed!\n");
+ goto err_ret;
+ }
+
+ volte_pcm_voice_in = pcm_open(0, 1, PCM_IN, &config_voice);
+ if (!pcm_is_ready(volte_pcm_voice_in)) {
+ printf("zte volte_pcm_voice_in open failed!\n");
+ goto err_ret;
+ }
+
+ if (0 != pcm_prepare(volte_pcm_voice_out)) {
+ printf("zte volte_pcm_voice_out pcm_prepare failed!\n");
+ goto err_ret;
+ }
+
+ if (0 != pcm_prepare(volte_pcm_voice_in)) {
+ printf("zte volte_pcm_voice_in pcm_prepare failed!\n");
+ goto err_ret;
+ }
+ return 0;
+err_ret:
+
+ pcm_close(volte_pcm_voice_out);
+ volte_pcm_voice_out = NULL;
+
+ if (volte_pcm_voice_in) {
+ pcm_close(volte_pcm_voice_in);
+ volte_pcm_voice_in = NULL;
+ }
+ return -1;
+
+}
+
+void zDrvVolte_PreClose(void)
+{
+
+ printf(" voice lib zDrvVolte_PreClose!\n");
+
+ if (slic_flag_already == 1) {
+ printf(" voice slic flag already get, slic_flag=%d!\n", slic_flag);
+ if (slic_flag == 1) {
+ return ;
+ }
+
+ } else {
+ slic_flag = voice_GetSlicFlag();
+ printf(" voice slic flag get, slic_flag=%d!\n", slic_flag);
+ if (slic_flag == 1) {
+ return ;
+ }
+ }
+
+
+ if (volte_pcm_voice_out) {
+ pcm_close(volte_pcm_voice_out);
+ volte_pcm_voice_out = NULL;
+ }
+ if (volte_pcm_voice_in) {
+ pcm_close(volte_pcm_voice_in);
+ volte_pcm_voice_in = NULL;
+ }
+}
+
+
+
+
+