| /***************************************************************************** | |
| ** °æÈ¨ËùÓÐ (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 |