[Feature][ZXW-33]merge ZXW 0428 version

Change-Id: I11f167edfea428d9fab198ff00ff1364932d1b0b
diff --git a/ap/lib/libvoice/alsa_call.c b/ap/lib/libvoice/alsa_call.c
new file mode 100755
index 0000000..72f82ce
--- /dev/null
+++ b/ap/lib/libvoice/alsa_call.c
@@ -0,0 +1,278 @@
+/*****************************************************************************

+** °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+** 

+** ÎļþÃû³Æ:     alsa_voice.c

+** Îļþ±êʶ:     

+** ÄÚÈÝÕªÒª:    

+** ʹÓ÷½·¨:     

+** 

+** ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+** -----------------------------------------------------------------------------

+** 2019/09/25     V1.0        Create          xxq        ´´½¨

+** 

+* ******************************************************************************/

+#ifdef _USE_VOICE_ALSA

+

+#include <stdio.h>

+#include <unistd.h>

+#include <string.h>

+#include <stdlib.h>

+

+#include <stdint.h>

+//#include "volte_drv.h"

+#include <sys/ioctl.h>

+#include <fcntl.h>

+#include <tinyalsa/audio_mixer_ctrl.h>

+

+

+

+#include <stdbool.h> 

+#include "tinyalsa/asoundlib.h"

+#include "tinyalsa/audio_mixer_ctrl.h"

+//#include "audio_res_ctrl.h"

+#include "voice_lib.h"

+

+

+/**************************************************************************

+*                        ºê¶¨Òå                                           *

+**************************************************************************/

+

+//#define AVOICE_TEAK_2G_3G_DEV_NUM 3

+//#define AVOICE_SOFT_3G_DEV_NUM 4

+//#define AVOICE_4G_DEV_NUM 2

+//#define AVOICE_5G_DEV_NUM 2

+

+/**************************************************************************

+*                        ÀàÐͶ¨Òå                                         *

+**************************************************************************/

+/*

+typedef enum

+{

+    AVOICE_TEAK_2G_3G = 0,     

+    AVOICE_SOFT_3G_NB,//1

+    AVOICE_SOFT_3G_WB, //2   

+    AVOICE_4G_NB, //3                 

+    AVOICE_4G_WB, //4

+    AVOICE_5G_NB,//5    

+    AVOICE_5G_WB,//6      

+    MAX_AVOICE_MODE               

+}T_Alsa_Voice_Mode;

+*/

+

+

+/**************************************************************************

+*                        ¾Ö²¿º¯ÊýÔ­ÐÍÉùÃ÷                                 *

+**************************************************************************/

+

+/**********************************************************************************/

+/**********************************************************************************/

+/**********************************************************************************/

+

+/**********************************************************************************/

+/**************************************************************************

+*                          ¾²Ì¬È«¾Ö±äÁ¿                                   *

+**************************************************************************/

+

+

+/**************************************************************************

+*                            È«¾Öº¯Êý                                     *

+**************************************************************************/

+

+

+/**************************************************************************

+*                            ¾Ö²¿º¯Êý                                     *

+**************************************************************************/

+

+

+/****************************************************************************************************/

+/* start for testing  ctm*/

+

+/* data type for voice device  handle */

+

+struct voice_handle

+{

+    struct pcm  *pcm_voice_out;

+    struct pcm  *pcm_voice_in;

+};

+

+/* static  handle */

+static struct voice_handle voice_handle = {0};

+

+static int current_chanl = T_OUTPUT_RECEIVER;//T_OUTPUT_HEADSET;//T_OUTPUT_RECEIVER;

+static int current_vol = T_VOICE_VOL_5_LEVEL;

+static int dev_num = 1;

+static int current_mode = MAX_AVOICE_MODE;

+char* vocie_mode[]={"AVOICE_TEAK_2G_3G","AVOICE_SOFT_3G_NB","AVOICE_SOFT_3G_WB","AVOICE_4G_NB","AVOICE_4G_WB","AVOICE_5G_NB","AVOICE_5G_WB"};

+

+/*

+ * phone call   

+ */

+int alsa_voice_open(int vmode)

+{

+    int ret = 0;

+	//int status = 0;

+    struct pcm_config config_voice = {0};

+    struct mxier *voice_mixer = NULL;

+	

+	printf( "%s: start vocie_mode(%d) %s, current_mode=%d!\n",__func__,vmode,vocie_mode[vmode],current_mode);

+

+    if(vmode >= MAX_AVOICE_MODE||vmode < AVOICE_TEAK_2G_3G)

+	{

+		printf("alsa_voice_open: mode not support fail!\n");

+		return -2;

+	

+	}

+    /* open mixer dev for codec control */

+    if(!(voice_mixer = mixer_open(0))) 

+       printf("mixer open fail, file(%s), line(%d)\n", __FILE__, __LINE__);

+

+

+	if(T_OUTPUT_SPEAKER == current_chanl) {

+		mix_set_voice_path(voice_mixer,T_OUTPUT_SPEAKER);

+		

+		printf("chanl SPEAKER: mix_set_voice_path ret=%d!\n",ret);

+		mix_set_voice_vol(voice_mixer,T_VOICE_VOL_5_LEVEL);

+		

+	    printf("chanl SPEAKER: mix_set_voice_vol ret=%d!\n",ret);

+	}

+	else if (T_OUTPUT_RECEIVER == current_chanl){

+		mix_set_voice_path(voice_mixer, T_OUTPUT_RECEIVER);

+		

+		printf("chanl RECEIVER: mix_set_voice_path ret=%d!\n",ret);

+		mix_set_voice_vol(voice_mixer,T_VOICE_VOL_5_LEVEL);

+		

+	    printf("chanl RECEIVER: mix_set_voice_vol ret=%d!\n",ret);

+	}

+	else if (T_OUTPUT_HEADSET == current_chanl){

+		

+		ret= mix_set_voice_path(voice_mixer, T_OUTPUT_HEADSET);

+		

+	    printf("chanl HEADSET: mix_set_voice_path ret=%d!\n",ret);

+		ret = mix_set_voice_vol(voice_mixer,T_VOICE_VOL_5_LEVEL);

+	    printf("chanl HEADSET: mix_set_voice_vol ret=%d!\n",ret);

+		

+	}	

+	else

+	{

+		printf("alsa_voice_open: chanl not support fail!\n");

+		return -2;

+

+	}

+

+    /*close mixer */

+    mixer_close(voice_mixer);

+    

+    /* open pcm dev for data tranf*/

+    config_voice.channels = 1; /* one channel */ 

+    config_voice.rate = 8000;  /* 8K rate */ 

+    config_voice.period_count = 3; /* buffer num */

+    config_voice.period_size = 640; /* buffer size */

+    config_voice.format = PCM_FORMAT_S16_LE; /* 16-bit signed */

+    if(vmode == AVOICE_TEAK_2G_3G)

+    {

+         dev_num = AVOICE_TEAK_2G_3G_DEV_NUM;

+		 config_voice.rate = 8000;  /* 8K rate */ 

+    }

+	else if(vmode == AVOICE_SOFT_3G_NB)

+    {

+         dev_num = AVOICE_SOFT_3G_DEV_NUM;

+		 config_voice.rate = 8000;  /* 8K rate */  

+    }

+	else if(vmode == AVOICE_SOFT_3G_WB)

+    {

+         dev_num = AVOICE_SOFT_3G_DEV_NUM;

+		 config_voice.rate = 16000;  /* 16K rate */  

+    }

+	else if(vmode == AVOICE_4G_NB)

+    {

+         dev_num = AVOICE_4G_DEV_NUM;

+		 config_voice.rate = 8000;  /* 8K rate */  

+    }

+	else if(vmode == AVOICE_4G_WB)

+    {

+         dev_num = AVOICE_4G_DEV_NUM;

+		 config_voice.rate = 16000;  /* 16K rate */  

+    }

+	else if(vmode == AVOICE_5G_NB)

+    {

+         dev_num = AVOICE_5G_DEV_NUM;

+		 config_voice.rate = 8000;  /* 8K rate */  

+    }

+	else if(vmode == AVOICE_5G_WB)

+    {

+         dev_num = AVOICE_5G_DEV_NUM;

+		 config_voice.rate = 16000;  /* 16K rate */  

+    }

+	else

+	{

+		printf("alsa_voice_open: mode not support fail!\n");

+		return -2;

+	

+	}

+

+

+    if(!(voice_handle.pcm_voice_out = pcm_open(0, dev_num, PCM_OUT, &config_voice))) 

+		printf("pcm_out dev_num=%d open fail, file(%s), line(%d)\n",dev_num, __FILE__, __LINE__);

+	

+	printf("%s:pcm_open pcm_voice_out dev_num=%d end!\n",__func__,dev_num);

+		

+    if(!(voice_handle.pcm_voice_in = pcm_open(0,dev_num,PCM_IN, &config_voice))) 

+		printf("pcm_in open dev_num=%d fail, file(%s), line(%d)\n",dev_num, __FILE__, __LINE__);

+	

+	printf("%s:pcm_open pcm_voice_in dev_num=%d end!\n",__func__,dev_num);

+       

+    if(0 != pcm_prepare(voice_handle.pcm_voice_out)) 

+    	printf("pcm_out dev_num=%d prepare fail, file(%s), line(%d)\n",dev_num, __FILE__, __LINE__);

+	

+	printf("%s: pcm_voice_out pcm_prepare dev_num=%d end!\n",__func__,dev_num);

+		

+    if(0 != pcm_prepare(voice_handle.pcm_voice_in))

+   		printf("pcm_in dev_num=%d prepare fail, file(%s), line(%d)\n",dev_num, __FILE__, __LINE__);

+

+	

+	printf("%s: pcm_voice_in pcm_prepare vmode=%d dev_num=%d end!\n",__func__,vmode,dev_num);

+    current_mode = vmode;

+	printf("%s: end!\n",__func__); 

+	

+    return 0;

+}

+

+int alsa_voice_close(int vmode)

+{

+    int ret = 0;

+	printf("%s: start!\n",__func__); 

+

+    if(vmode >= MAX_AVOICE_MODE||vmode < AVOICE_TEAK_2G_3G)

+	{

+		printf("alsa_voice_close: mode not support fail!\n");

+		return -2;

+	

+	}

+

+if(voice_handle.pcm_voice_in) {

+	ret = pcm_close(voice_handle.pcm_voice_in);

+	voice_handle.pcm_voice_in = 0;

+

+	printf("pcm_close pcm_voice_in	ret=%d!\n",ret);

+}

+

+if(voice_handle.pcm_voice_out) {

+	ret = pcm_close(voice_handle.pcm_voice_out);

+	voice_handle.pcm_voice_out = 0;

+

+	printf("pcm_close pcm_voice_out  ret=%d!\n",ret);

+}

+

+

+

+

+

+	current_mode = MAX_AVOICE_MODE;

+	printf("%s: end!\n",__func__); 

+	

+    return ret; 

+}

+

+

+

+#endif