[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