[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;

+	}

+}

+

+

+

+

+