mm-audio: add amrwb component

modify amrnb component to support amrwb.

Change-Id: I16119d9bd0c1880b9a4c0c8387e4a54bf4dd163a
diff --git a/mm-audio/aenc-amrnb/qdsp6/inc/omx_amr_aenc.h b/mm-audio/aenc-amrnb/qdsp6/inc/omx_amr_aenc.h
index 2d72eb2..f4fcf8e 100644
--- a/mm-audio/aenc-amrnb/qdsp6/inc/omx_amr_aenc.h
+++ b/mm-audio/aenc-amrnb/qdsp6/inc/omx_amr_aenc.h
@@ -60,6 +60,8 @@
 #include <semaphore.h>
 #include <linux/msm_audio.h>
 #include <linux/msm_audio_amrnb.h>
+#include <linux/msm_audio_amrwb.h>
+
 extern "C" {
     void * get_omx_component_factory_fn(void);
 }
@@ -144,6 +146,7 @@
 class omx_amr_aenc: public qc_omx_component
 {
 public:
+    int amrwb_enable;
     omx_amr_aenc();                             // constructor
     virtual ~omx_amr_aenc();                    // destructor
 
diff --git a/mm-audio/aenc-amrnb/qdsp6/src/omx_amr_aenc.cpp b/mm-audio/aenc-amrnb/qdsp6/src/omx_amr_aenc.cpp
index ba66d1b..5278671 100644
--- a/mm-audio/aenc-amrnb/qdsp6/src/omx_amr_aenc.cpp
+++ b/mm-audio/aenc-amrnb/qdsp6/src/omx_amr_aenc.cpp
@@ -1102,13 +1102,28 @@
     component_Role.nVersion.nVersion = OMX_SPEC_VERSION;
     if (!strcmp(role,"OMX.qcom.audio.encoder.amrnb"))
     {
+        amrwb_enable = 0;
         pcm_input = 1;
         component_Role.nSize = (OMX_U32)sizeof(role);
         strlcpy((char *)component_Role.cRole, (const char*)role,
 		sizeof(component_Role.cRole));
         DEBUG_PRINT("\ncomponent_init: Component %s LOADED \n", role);
-    } else if (!strcmp(role,"OMX.qcom.audio.encoder.tunneled.amrnb"))
-    {
+    } else if (!strcmp(role,"OMX.qcom.audio.encoder.tunneled.amrnb")) {
+        amrwb_enable = 0;
+        pcm_input = 0;
+        component_Role.nSize = (OMX_U32)sizeof(role);
+        strlcpy((char *)component_Role.cRole, (const char*)role,
+		sizeof(component_Role.cRole));
+        DEBUG_PRINT("\ncomponent_init: Component %s LOADED \n", role);
+    } else if (!strcmp(role,"OMX.qcom.audio.encoder.amrwb")) {
+        amrwb_enable = 1;
+        pcm_input = 1;
+        component_Role.nSize = (OMX_U32)sizeof(role);
+        strlcpy((char *)component_Role.cRole, (const char*)role,
+		sizeof(component_Role.cRole));
+        DEBUG_PRINT("\ncomponent_init: Component %s LOADED \n", role);
+    } else if (!strcmp(role,"OMX.qcom.audio.encoder.tunneled.amrwb")) {
+        amrwb_enable = 1;
         pcm_input = 0;
         component_Role.nSize = (OMX_U32)sizeof(role);
         strlcpy((char *)component_Role.cRole, (const char*)role,
@@ -1124,12 +1139,12 @@
     if(pcm_input)
     {
         m_tmp_meta_buf = (OMX_U8*) malloc(sizeof(OMX_U8) *
-                         (OMX_CORE_INPUT_BUFFER_SIZE + sizeof(META_IN)));
+                (OMX_CORE_INPUT_BUFFER_SIZE + sizeof(META_IN)));
 
         if (m_tmp_meta_buf == NULL){
             DEBUG_PRINT_ERROR("Mem alloc failed for tmp meta buf\n");
-                return OMX_ErrorInsufficientResources;
-	}
+            return OMX_ErrorInsufficientResources;
+        }
     }
     m_tmp_out_meta_buf =
 		(OMX_U8*)malloc(sizeof(OMX_U8)*OMX_AMR_OUTPUT_BUFFER_SIZE);
@@ -1138,16 +1153,29 @@
                 return OMX_ErrorInsufficientResources;
             }
 
-    if(0 == pcm_input)
-    {
-        m_drv_fd = open("/dev/msm_amrnb_in",O_RDONLY);
-    DEBUG_PRINT("Driver in Tunnel mode open\n");
-    }
-    else
-    {
-        m_drv_fd = open("/dev/msm_amrnb_in",O_RDWR);
-    DEBUG_PRINT("Driver in Non Tunnel mode open\n");
-    }
+    if(!amrwb_enable) {
+        if(0 == pcm_input)
+        {
+            m_drv_fd = open("/dev/msm_amrnb_in",O_RDONLY);
+            DEBUG_PRINT("Driver in Tunnel mode open\n");
+        }
+        else
+        {
+            m_drv_fd = open("/dev/msm_amrnb_in",O_RDWR);
+            DEBUG_PRINT("Driver in Non Tunnel mode open\n");
+        }
+    } else {
+        if(0 == pcm_input)
+        {
+            m_drv_fd = open("/dev/msm_amrwb_in",O_RDONLY);
+            DEBUG_PRINT("Driver in Tunnel mode open\n");
+        }
+        else
+        {
+            m_drv_fd = open("/dev/msm_amrwb_in",O_RDWR);
+            DEBUG_PRINT("Driver in Non Tunnel mode open\n");
+        }
+	}
     if (m_drv_fd < 0)
     {
         DEBUG_PRINT_ERROR("Component_init Open Failed[%d] errno[%d]",\
@@ -1417,6 +1445,7 @@
             {
 
                 struct msm_audio_amrnb_enc_config_v2 drv_amr_enc_config;
+                struct msm_audio_amrwb_enc_config drv_amrwb_enc_config;
                 struct msm_audio_stream_config drv_stream_config;
                 struct msm_audio_buf_cfg buf_cfg;
                 struct msm_audio_config pcm_cfg;
@@ -1433,22 +1462,49 @@
                     DEBUG_PRINT_ERROR("ioctl AUDIO_SET_STREAM_CONFIG failed, \
 					errno[%d]\n", errno);
                 }
+                if(!amrwb_enable)
+                {
+                    if(ioctl(m_drv_fd, AUDIO_GET_AMRNB_ENC_CONFIG_V2,
+                                &drv_amr_enc_config) == -1)
+                    {
+                        DEBUG_PRINT_ERROR("ioctl AUDIO_GET_AMRNB_ENC_CONFIG_V2 \
+                                failed, errno[%d]\n", errno);
+                    }
+                } else {
+                    if(ioctl(m_drv_fd, AUDIO_GET_AMRWB_ENC_CONFIG,
+                                &drv_amrwb_enc_config) == -1)
+                    {
+                        DEBUG_PRINT_ERROR("ioctl AUDIO_GET_AMRWB_ENC_CONFIG \
+                                failed, errno[%d]\n", errno);
+                    }
+                }
+                if(!amrwb_enable) {
+                    drv_amr_enc_config.band_mode = m_amr_param.eAMRBandMode;
+                    drv_amr_enc_config.dtx_enable = m_amr_param.eAMRDTXMode;
+                    drv_amr_enc_config.frame_format = m_amr_param.eAMRFrameFormat;
+                } else {
+                    drv_amrwb_enc_config.band_mode = m_amr_param.eAMRBandMode;
+                    drv_amrwb_enc_config.dtx_enable = m_amr_param.eAMRDTXMode;
+                    drv_amrwb_enc_config.frame_format = m_amr_param.eAMRFrameFormat;
+                }
 
-                if(ioctl(m_drv_fd, AUDIO_GET_AMRNB_ENC_CONFIG_V2,
-			&drv_amr_enc_config) == -1)
+                if(!amrwb_enable)
                 {
-                    DEBUG_PRINT_ERROR("ioctl AUDIO_GET_AMRNB_ENC_CONFIG_V2 \
-					failed, errno[%d]\n", errno);
+                    if(ioctl(m_drv_fd, AUDIO_SET_AMRNB_ENC_CONFIG_V2, &drv_amr_enc_config)
+                            == -1)
+                    {
+                        DEBUG_PRINT_ERROR("ioctl AUDIO_SET_AMRNB_ENC_CONFIG_V2 \
+                                failed, errno[%d]\n", errno);
+                    }
+                } else {
+                    if(ioctl(m_drv_fd, AUDIO_SET_AMRWB_ENC_CONFIG, &drv_amrwb_enc_config)
+                            == -1)
+                    {
+                        DEBUG_PRINT_ERROR("ioctl AUDIO_SET_AMRWB_ENC_CONFIG \
+                                failed, errno[%d]\n", errno);
+                    }
                 }
-        drv_amr_enc_config.band_mode = m_amr_param.eAMRBandMode;
-        drv_amr_enc_config.dtx_enable = m_amr_param.eAMRDTXMode;
-        drv_amr_enc_config.frame_format = m_amr_param.eAMRFrameFormat;
-        if(ioctl(m_drv_fd, AUDIO_SET_AMRNB_ENC_CONFIG_V2, &drv_amr_enc_config)
-		== -1)
-                {
-                    DEBUG_PRINT_ERROR("ioctl AUDIO_SET_AMRNB_ENC_CONFIG_V2 \
-					failed, errno[%d]\n", errno);
-                }
+
                 if (ioctl(m_drv_fd, AUDIO_GET_BUF_CFG, &buf_cfg) == -1)
                 {
                     DEBUG_PRINT_ERROR("ioctl AUDIO_GET_BUF_CFG, errno[%d]\n",
diff --git a/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c b/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c
index e509748..3448bff 100644
--- a/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c
+++ b/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c
@@ -89,6 +89,7 @@
 uint32_t pcmplayback = 0;
 uint32_t tunnel      = 0;
 uint32_t format = 1;
+uint32_t amrwb_enable=0;
 #define DEBUG_PRINT printf
 unsigned to_idle_transition = 0;
 unsigned long total_pcm_bytes;
@@ -110,6 +111,7 @@
 #define MIN_BITRATE 4 /* Bit rate 1 - 13.6 , 2 - 6.2 , 3 - 2.7 , 4 - 1.0 kbps*/
 #define MAX_BITRATE 4
 #define AMR_HEADER_SIZE 6
+#define AMRWB_HEADER_SIZE 9
 #define FAILED(result) (result != OMX_ErrorNone)
 
 #define SUCCEEDED(result) (result == OMX_ErrorNone)
@@ -499,6 +501,7 @@
 
     struct sigaction sa;
     char amr_header[6] = {0x23, 0x21, 0x41, 0x4D, 0x52, 0x0A};
+    char amrwb_header[9] = {0x23, 0x21, 0x41, 0x4D, 0x52,0x2D, 0x57, 0x42, 0x0A};
     memset(&sa, 0, sizeof(sa));
     sa.sa_handler = &signal_handler;
     sigaction(SIGABRT, &sa, NULL);
@@ -513,7 +516,7 @@
     pthread_mutex_init(&etb_lock, 0);
     pthread_mutex_init(&etb_lock1, 0);
 
-    if (argc >= 8) {
+    if (argc >= 9) {
         in_filename = argv[1];
           out_filename = argv[2];
     tunnel =  (uint32_t)atoi(argv[3]);
@@ -521,23 +524,35 @@
         dtxenable  = (uint32_t)atoi(argv[5]);
         recpath      = (uint32_t)atoi(argv[6]); // No configuration support yet..
         rectime      = (uint32_t)atoi(argv[7]);
+        amrwb_enable = (uint32_t)atoi(argv[8]);
 
     } else {
           DEBUG_PRINT(" invalid format: \n");
-          DEBUG_PRINT("ex: ./mm-aenc-omxamr-test INPUTFILE OUTPUTFILE Tunnel BANDMODE DTXENABLE RECORDPATH RECORDTIME\n");
+          DEBUG_PRINT("ex: ./mm-aenc-omxamr-test INPUTFILE OUTPUTFILE Tunnel BANDMODE DTXENABLE RECORDPATH RECORDTIME amrwb_enable \n");
           DEBUG_PRINT("Bandmode 1-7, dtxenable 0-1\n");
           DEBUG_PRINT("RECORDPATH 0(TX),1(RX),2(BOTH),3(MIC)\n");
           DEBUG_PRINT("RECORDTIME in seconds for AST Automation\n");
+	  DEBUG_PRINT("amrwb_enable:1-amrwb 0-amrnb\n");
           return 0;
     }
     if(recpath != 3) {
           DEBUG_PRINT("For RECORDPATH Only MIC supported\n");
           return 0;
     }
-    if(tunnel == 0)
-        aud_comp = "OMX.qcom.audio.encoder.amrnb";
-    else
-        aud_comp = "OMX.qcom.audio.encoder.tunneled.amrnb";
+    if(!amrwb_enable)
+    {
+        if(tunnel == 0)
+            aud_comp = "OMX.qcom.audio.encoder.amrnb";
+        else
+            aud_comp = "OMX.qcom.audio.encoder.tunneled.amrnb";
+    }
+    else {
+        if(tunnel == 0)
+            aud_comp = "OMX.qcom.audio.encoder.amrwb";
+        else
+            aud_comp = "OMX.qcom.audio.encoder.tunneled.amrwb";
+    }
+
     if(Init_Encoder(aud_comp)!= 0x00)
     {
         DEBUG_PRINT("Decoder Init failed\n");
@@ -589,7 +604,10 @@
             }
             wait_for_event();
             fseek(outputBufferFile, 0,SEEK_SET);
-            fwrite(amr_header,1,AMR_HEADER_SIZE,outputBufferFile);
+            if(!amrwb_enable)
+                fwrite(amr_header,1,AMR_HEADER_SIZE,outputBufferFile);
+            else
+                fwrite(amrwb_header,1,AMRWB_HEADER_SIZE,outputBufferFile);
 
             result = OMX_FreeHandle(amr_enc_handle);
             if (result != OMX_ErrorNone) {
@@ -1013,7 +1031,11 @@
     error_code = -1;
     return error_code;
     }
-    fseek(outputBufferFile, AMR_HEADER_SIZE, SEEK_SET);
+    if(!amrwb_enable) {
+        fseek(outputBufferFile, AMR_HEADER_SIZE, SEEK_SET);
+    } else {
+        fseek(outputBufferFile, AMRWB_HEADER_SIZE, SEEK_SET);
+    }
     return error_code;
 }