mmserv/tms/tmscallserver/src/ipcalluplink.cpp
changeset 14 80975da52420
parent 12 5a06f39ad45b
child 16 43d09473c595
child 19 4a629bc82c5e
equal deleted inserted replaced
12:5a06f39ad45b 14:80975da52420
     1 /*
       
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description: Telephony Multimedia Service
       
    15  *
       
    16  */
       
    17 
       
    18 #include <audiopreference.h>
       
    19 #include <mmcccodecinformation.h>
       
    20 #include <gstappsink.h>
       
    21 #include "tmsutility.h"
       
    22 #include "ipcallstream.h"
       
    23 
       
    24 using namespace TMS;
       
    25 
       
    26 static TMSIPUplink* iSelfUp;
       
    27 GstBuffer* gstUplBuffer;
       
    28 #ifdef _DEBUG
       
    29 //static TInt iHeapUp;
       
    30 #endif //_DEBUG
       
    31 
       
    32 // -----------------------------------------------------------------------------
       
    33 // TMSIPUplink::cb_record_raw_handoff
       
    34 // -----------------------------------------------------------------------------
       
    35 //
       
    36 void TMSIPUplink::cb_record_raw_handoff(GstElement *sink)
       
    37     {
       
    38     TRACE_PRN_N(_L("TMS->UPL: cb_record_raw_handoff Enter"));
       
    39 
       
    40 #ifdef _DEBUG
       
    41     /*    TInt block;
       
    42      RHeap &heap = User::Heap();
       
    43      TInt avail = heap.Available(block);
       
    44      RDebug::Print(_L("VoIP->PRINT-HEAP-UP:Available:[%d], delta:[%d]"),
       
    45      avail, iHeapUp-avail);
       
    46      iHeapUp = avail;*/
       
    47 #endif
       
    48 
       
    49     gstUplBuffer = gst_app_sink_pull_buffer(GST_APP_SINK(sink));
       
    50     iSelfUp->BufferToBeEmptied();
       
    51     }
       
    52 
       
    53 // -----------------------------------------------------------------------------
       
    54 // TMSIPUplink::bus_call
       
    55 // -----------------------------------------------------------------------------
       
    56 //
       
    57 gboolean TMSIPUplink::bus_call(GstBus* /*bus*/, GstMessage* msg,
       
    58         gpointer /*data*/)
       
    59     {
       
    60     switch (GST_MESSAGE_TYPE(msg))
       
    61         {
       
    62         case GST_MESSAGE_EOS:
       
    63             {
       
    64             gst_element_set_state(iSelfUp->iPipelineRec, GST_STATE_NULL);
       
    65             gst_object_unref(GST_OBJECT(iSelfUp->iPipelineRec));
       
    66             break;
       
    67             }
       
    68         case GST_MESSAGE_ERROR:
       
    69             {
       
    70             gchar *debug;
       
    71             GError *err;
       
    72             gst_message_parse_error(msg, &err, &debug);
       
    73             g_free(debug);
       
    74             g_print("Error: %s\n", err->message);
       
    75             g_error_free(err);
       
    76             break;
       
    77             }
       
    78         default:
       
    79             {
       
    80             break;
       
    81             }
       
    82         }
       
    83     return ETrue;
       
    84     }
       
    85 
       
    86 // -----------------------------------------------------------------------------
       
    87 // TMSIPUplink::gst_initialize_record
       
    88 // -----------------------------------------------------------------------------
       
    89 //
       
    90 gint TMSIPUplink::gst_initialize_record()
       
    91     {
       
    92     TRACE_PRN_FN_ENT;
       
    93 
       
    94     gint err = KErrNone;
       
    95 
       
    96     // create a new bin to hold the elements
       
    97     iPipelineRec = gst_pipeline_new("pipelineRec");
       
    98     iSource = gst_element_factory_make("devsoundsrc", "record_audio");
       
    99     iAppSink = gst_element_factory_make("appsink", "appsink");
       
   100 
       
   101     if (!iSource || !iAppSink)
       
   102         {
       
   103         err = KErrNotFound;
       
   104         TRACE_PRN_IF_ERR(err);
       
   105         return err;
       
   106         }
       
   107 
       
   108     iMaxBufLen = ConfigureMedia(iCodecID);
       
   109 
       
   110     GstCaps* caps = gst_caps_new_simple(iMediaType,
       
   111                                         "width", G_TYPE_INT, 16,
       
   112                                         "depth", G_TYPE_INT, 16,
       
   113                                         "signed", G_TYPE_BOOLEAN, TRUE,
       
   114                                         "endianness", G_TYPE_INT, G_BYTE_ORDER,
       
   115                                         "rate", G_TYPE_INT, 8000,
       
   116                                         "channels", G_TYPE_INT, 1,
       
   117                                         NULL);
       
   118 
       
   119     iBusRec = gst_pipeline_get_bus(GST_PIPELINE(iPipelineRec));
       
   120     gst_bus_add_watch(iBusRec, (TMSIPUplink::bus_call), NULL);
       
   121     gst_object_unref(iBusRec);
       
   122 
       
   123     // add objects to the main iPipelineRec
       
   124     gst_bin_add_many(GST_BIN(iPipelineRec), iSource, iAppSink, NULL);
       
   125 
       
   126     // link the elements
       
   127     gst_element_link_filtered(iSource, iAppSink, caps);
       
   128 
       
   129     g_object_set(G_OBJECT(iAppSink),
       
   130                  "max-buffers", 1,
       
   131                  "emit-signals", TRUE,
       
   132                  "sync", FALSE,
       
   133                  NULL);
       
   134 
       
   135     g_signal_connect(iAppSink, "new-buffer",
       
   136                      G_CALLBACK(cb_record_raw_handoff),
       
   137                      NULL);
       
   138 
       
   139     gst_app_sink_set_caps(GST_APP_SINK(iAppSink), caps);
       
   140     gst_caps_unref(caps);
       
   141 
       
   142     //NOTE: d/s is not ready at this time to return true maxgain
       
   143     TInt maxgain = 1;
       
   144 #ifdef __WINSCW__
       
   145     maxgain = 64;
       
   146 #endif //__WINSCW__
       
   147     g_object_set(G_OBJECT(iSource),
       
   148                  "blocksize", iMaxBufLen,
       
   149                  "gain", maxgain,
       
   150 #ifndef __WINSCW__
       
   151                  "priority", (gint)iPriority.iPriority,
       
   152                  "preference", (gint)iPriority.iPref,
       
   153 #endif
       
   154                  NULL);
       
   155 
       
   156     err = SetCodecCi();
       
   157     //gst_element_set_state(iPipelineRec, GST_STATE_READY);
       
   158 
       
   159     TRACE_PRN_FN_EXT;
       
   160     return err;
       
   161     }
       
   162 
       
   163 // -----------------------------------------------------------------------------
       
   164 // TMSIPUplink::gst_record_raw
       
   165 // -----------------------------------------------------------------------------
       
   166 //
       
   167 gint TMSIPUplink::gst_record_raw()
       
   168     {
       
   169     // start recording
       
   170     gst_element_set_state(iPipelineRec, GST_STATE_PLAYING);
       
   171     return KErrNone;
       
   172     }
       
   173 
       
   174 // -----------------------------------------------------------------------------
       
   175 // TMSIPUplink::TMSIPUplink
       
   176 // Standard Constructor
       
   177 // -----------------------------------------------------------------------------
       
   178 //
       
   179 TMSIPUplink::TMSIPUplink()
       
   180     {
       
   181     iSelfUp = this;
       
   182     }
       
   183 
       
   184 // -----------------------------------------------------------------------------
       
   185 // TMSIPUplink::~TMSIPUplink
       
   186 // Standard Constructor
       
   187 // -----------------------------------------------------------------------------
       
   188 //
       
   189 TMSIPUplink::~TMSIPUplink()
       
   190     {
       
   191     TRACE_PRN_FN_ENT;
       
   192 
       
   193     Stop();
       
   194     gst_object_unref(GST_OBJECT(iPipelineRec));
       
   195     gst_deinit();
       
   196 
       
   197     delete iSpeechEncoderConfig;
       
   198     delete iG711EncoderIntfc;
       
   199     delete iG729EncoderIntfc;
       
   200     delete iIlbcEncoderIntfc;
       
   201 
       
   202     TRACE_PRN_FN_EXT;
       
   203     }
       
   204 
       
   205 // -----------------------------------------------------------------------------
       
   206 // TMSIPUplink::NewL
       
   207 // Symbian two-phase constructor
       
   208 // -----------------------------------------------------------------------------
       
   209 //
       
   210 TMSIPUplink* TMSIPUplink::NewL(const guint32 codecID,
       
   211         const TMMFPrioritySettings priority)
       
   212     {
       
   213     TMSIPUplink* self = new (ELeave) TMSIPUplink();
       
   214     CleanupStack::PushL(self);
       
   215     self->ConstructL(codecID, priority);
       
   216     CleanupStack::Pop(self);
       
   217     return self;
       
   218     }
       
   219 
       
   220 // -----------------------------------------------------------------------------
       
   221 // TMSIPUplink::ConstructL
       
   222 // Part two of Symbian two phase construction
       
   223 // -----------------------------------------------------------------------------
       
   224 //
       
   225 void TMSIPUplink::ConstructL(const guint32 codecID,
       
   226         const TMMFPrioritySettings priority)
       
   227     {
       
   228     TRACE_PRN_FN_ENT;
       
   229 
       
   230     iCodecID = codecID;
       
   231     iPriority = priority;
       
   232     //    SetTime();
       
   233     gst_init(NULL, NULL);
       
   234     //    CalcLatency();
       
   235     //    SetTime();
       
   236     gint err = gst_initialize_record();
       
   237     if (err != TMS_RESULT_SUCCESS)
       
   238         {
       
   239         User::Leave(err);
       
   240         }
       
   241 
       
   242     // Client must set these before querying!
       
   243     iG711EncodeMode = TMS_G711_CODEC_MODE_ALAW;
       
   244     iILBCEncodeMode = TMS_ILBC_CODEC_MODE_20MS_FRAME;
       
   245     //    CalcLatency();
       
   246 
       
   247     TRACE_PRN_FN_EXT;
       
   248     }
       
   249 
       
   250 // -----------------------------------------------------------------------------
       
   251 // TMSIPUplink::Start
       
   252 //
       
   253 // -----------------------------------------------------------------------------
       
   254 //
       
   255 void TMSIPUplink::Start()
       
   256     {
       
   257     TRACE_PRN_FN_ENT;
       
   258 
       
   259     gst_record_raw();
       
   260     iStatus = EStreaming;
       
   261 
       
   262     TRACE_PRN_FN_EXT;
       
   263     }
       
   264 
       
   265 // -----------------------------------------------------------------------------
       
   266 // TMSIPUplink::Stop
       
   267 //
       
   268 // -----------------------------------------------------------------------------
       
   269 //
       
   270 void TMSIPUplink::Stop()
       
   271     {
       
   272     TRACE_PRN_FN_ENT;
       
   273 
       
   274     if (iStatus == EStreaming)
       
   275         {
       
   276         if (iPipelineRec != NULL &&
       
   277             iPipelineRec->current_state == GST_STATE_PLAYING)
       
   278             {
       
   279             GstStateChangeReturn ret;
       
   280             ret = gst_element_set_state(iPipelineRec, GST_STATE_NULL);
       
   281             if (ret == GST_STATE_CHANGE_FAILURE)
       
   282                 {
       
   283                 ;// retry???
       
   284                 //GST_STATE_CHANGE_SUCCESS
       
   285                 }
       
   286             }
       
   287         iStatus = EReady;
       
   288         }
       
   289 
       
   290     if (gstUplBuffer)
       
   291         {
       
   292         gst_buffer_unref(gstUplBuffer);
       
   293         }
       
   294 
       
   295     TRACE_PRN_FN_EXT;
       
   296     }
       
   297 
       
   298 // -----------------------------------------------------------------------------
       
   299 // TMSIPUplink::BufferToBeEmptied
       
   300 // From MDevSoundObserver
       
   301 // -----------------------------------------------------------------------------
       
   302 //
       
   303 void TMSIPUplink::BufferToBeEmptied()
       
   304     {
       
   305     TInt buflen = GST_BUFFER_SIZE(gstUplBuffer);
       
   306     TRACE_PRN_N1(_L("TMS->UPL: BTBE->LEN [%d]"), buflen);
       
   307 
       
   308     // Adjust/create RChunk if necessary
       
   309     TInt err = DoChunk(buflen, iMsgBuffer);
       
   310 
       
   311     if (err != TMS_RESULT_SUCCESS)
       
   312         {
       
   313         Stop();
       
   314         iMsgBuffer.iStatus = err;
       
   315         }
       
   316     else
       
   317         {
       
   318         // Pass buffer parameters to the client
       
   319         iMsgBuffer.iStatus = err;
       
   320         iMsgBuffer.iInt = buflen;
       
   321 
       
   322         // Copy data over to RChunk
       
   323         TPtr8 dataPtr(iChunk.Base(), buflen, iMaxBufLen);
       
   324         dataPtr.Copy(GST_BUFFER_DATA(gstUplBuffer), buflen);
       
   325         gst_buffer_unref(gstUplBuffer);
       
   326 
       
   327         //RDebug::RawPrint(dataPtr);
       
   328         iStatus = EStreaming;
       
   329 
       
   330         // If chunk is opened, we will expect a call from the client to
       
   331         // get chunk handle. When we get a call to copy chunk handle,
       
   332         // check these variables and see if they match. This is not
       
   333         // completely secure, but will provide some level of security.
       
   334         if (iMsgBuffer.iBool == TRUE)
       
   335             {
       
   336             iWriteDataXferHndlToClient = TRUE;
       
   337             iKey = iMsgBuffer.iUint32;
       
   338             }
       
   339         }
       
   340 
       
   341     // Notify client there is buffer ready to be emptied
       
   342     iMsgBuffer.iRequest = ECmdEmptyBuffer;
       
   343     err = iMsgQueue.Send(iMsgBuffer);
       
   344     TRACE_PRN_IF_ERR(err);
       
   345     }
       
   346 
       
   347 // -----------------------------------------------------------------------------
       
   348 // TMSIPUplink::BufferEmptied
       
   349 //
       
   350 // -----------------------------------------------------------------------------
       
   351 //
       
   352 void TMSIPUplink::BufferEmptied()
       
   353     {
       
   354     //TRACE_PRN_N(_L("TMS->UPL->BE"));
       
   355     }
       
   356 
       
   357 // -----------------------------------------------------------------------------
       
   358 // TMSIPUplink::SetCodecCi
       
   359 //
       
   360 // -----------------------------------------------------------------------------
       
   361 //
       
   362 gint TMSIPUplink::SetCodecCi()
       
   363     {
       
   364     TRAPD(err, SetCodecCiL());
       
   365     return err;
       
   366     }
       
   367 
       
   368 // -----------------------------------------------------------------------------
       
   369 // TMSIPUplink::SetCodecCiL
       
   370 //
       
   371 // -----------------------------------------------------------------------------
       
   372 //
       
   373 void TMSIPUplink::SetCodecCiL()
       
   374     {
       
   375     TRACE_PRN_FN_ENT;
       
   376 
       
   377     switch (iCodecID)
       
   378         {
       
   379         case KMccFourCCIdG711:
       
   380             {
       
   381             if (!iG711EncoderIntfc)
       
   382                 {
       
   383                 iG711EncoderIntfc = GST_G711_ENCODER_GET_IFACE(iSource);
       
   384                 }
       
   385             break;
       
   386             }
       
   387         case KMccFourCCIdG729:
       
   388             {
       
   389             if (!iG729EncoderIntfc)
       
   390                 {
       
   391                 iG729EncoderIntfc = GST_G729_ENCODER_GET_IFACE(iSource);
       
   392                 }
       
   393             break;
       
   394             }
       
   395         case KMccFourCCIdILBC:
       
   396             {
       
   397             if (!iIlbcEncoderIntfc)
       
   398                 {
       
   399                 iIlbcEncoderIntfc = GST_ILBC_ENCODER_GET_IFACE(iSource);
       
   400                 }
       
   401             break;
       
   402             }
       
   403         case KMccFourCCIdAMRNB:
       
   404         case KMMFFourCCCodePCM16:
       
   405             {
       
   406             break;
       
   407             }
       
   408         default:
       
   409             {
       
   410             User::Leave(TMS_RESULT_INVALID_ARGUMENT);
       
   411             }
       
   412         }
       
   413 
       
   414     if (!iSpeechEncoderConfig && iCodecID != KMMFFourCCCodePCM16)
       
   415         {
       
   416         iSpeechEncoderConfig = GST_SPEECH_ENCODER_CONFIG_GET_IFACE(iSource);
       
   417         }
       
   418 
       
   419     TRACE_PRN_FN_EXT;
       
   420     }
       
   421 
       
   422 // -----------------------------------------------------------------------------
       
   423 // TMSIPUplink::SetGain
       
   424 //
       
   425 // -----------------------------------------------------------------------------
       
   426 //
       
   427 gint TMSIPUplink::SetGain(const guint gain)
       
   428     {
       
   429     g_object_set(G_OBJECT(iSource), "gain", gain, NULL);
       
   430     TRACE_PRN_N1(_L("TMS->UPL: SetGain [%d]"), gain);
       
   431     return TMS_RESULT_SUCCESS;
       
   432     }
       
   433 
       
   434 // -----------------------------------------------------------------------------
       
   435 // TMSIPUplink::GetGain
       
   436 //
       
   437 // -----------------------------------------------------------------------------
       
   438 //
       
   439 gint TMSIPUplink::GetGain(guint& gain)
       
   440     {
       
   441     g_object_get(G_OBJECT(iSource), "gain", &gain, NULL);
       
   442     TRACE_PRN_N1(_L("TMS->UPL: GetGain [%d]"), gain);
       
   443     return TMS_RESULT_SUCCESS;
       
   444     }
       
   445 
       
   446 // -----------------------------------------------------------------------------
       
   447 // TMSIPUplink::GetMaxGain
       
   448 //
       
   449 // -----------------------------------------------------------------------------
       
   450 //
       
   451 gint TMSIPUplink::GetMaxGain(guint& gain)
       
   452     {
       
   453     g_object_get(G_OBJECT(iSource), "maxgain", &gain, NULL);
       
   454     TRACE_PRN_N1(_L("TMS->UPL: MaxGain [%d]"), gain);
       
   455     return TMS_RESULT_SUCCESS;
       
   456     }
       
   457 
       
   458 // -----------------------------------------------------------------------------
       
   459 // TMSIPUplink::GetDataXferChunkHndl
       
   460 //
       
   461 // -----------------------------------------------------------------------------
       
   462 //
       
   463 gint TMSIPUplink::GetDataXferChunkHndl(const TUint32 key, RChunk& chunk)
       
   464     {
       
   465     gint status = TMS_RESULT_SUCCESS;
       
   466 
       
   467     if (iChunk.Handle())
       
   468         {
       
   469         if (iWriteDataXferHndlToClient && (iKey == key))
       
   470             {
       
   471             chunk = iChunk;
       
   472             iWriteDataXferHndlToClient = FALSE;
       
   473             iKey = 0;
       
   474             }
       
   475         else
       
   476             {
       
   477             status = TMS_RESULT_ILLEGAL_OPERATION;
       
   478             }
       
   479         }
       
   480 
       
   481     return status;
       
   482     }
       
   483 
       
   484 // -----------------------------------------------------------------------------
       
   485 // TMSIPUplink::SetIlbcCodecMode
       
   486 //
       
   487 // -----------------------------------------------------------------------------
       
   488 //
       
   489 gint TMSIPUplink::SetIlbcCodecMode(const gint mode)
       
   490     {
       
   491     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   492 
       
   493     if (iStatus == EReady)
       
   494         {
       
   495         iILBCEncodeMode = mode;
       
   496 
       
   497         if (iIlbcEncoderIntfc && iCodecID == KMccFourCCIdILBC)
       
   498             {
       
   499             if (mode == TMS_ILBC_CODEC_MODE_20MS_FRAME)
       
   500                 {
       
   501                 err = iIlbcEncoderIntfc->SetEncoderMode(EIlbc20msFrame);
       
   502                 TRACE_PRN_N(_L("TMS->UPL: SetIlbcCodecMode [20ms Frame]"));
       
   503                 }
       
   504             else if (mode == TMS_ILBC_CODEC_MODE_30MS_FRAME)
       
   505                 {
       
   506                 err = iIlbcEncoderIntfc->SetEncoderMode(EIlbc30msFrame);
       
   507                 TRACE_PRN_N(_L("TMS->UPL: SetIlbcCodecMode [30ms Frame]"));
       
   508                 }
       
   509             }
       
   510         }
       
   511 
       
   512     TRACE_PRN_IF_ERR(err);
       
   513     return err;
       
   514     }
       
   515 
       
   516 // -----------------------------------------------------------------------------
       
   517 // TMSIPUplink::GetIlbcCodecMode
       
   518 //
       
   519 // -----------------------------------------------------------------------------
       
   520 //
       
   521 gint TMSIPUplink::GetIlbcCodecMode(gint& mode)
       
   522     {
       
   523     // not available through CIs -> return cached value
       
   524     mode = iILBCEncodeMode;
       
   525     TRACE_PRN_N1(_L("TMS->UPL: GetIlbcCodecMode [%d]"), mode);
       
   526     return TMS_RESULT_SUCCESS;
       
   527     }
       
   528 
       
   529 // -----------------------------------------------------------------------------
       
   530 // TMSIPUplink::SetG711CodecMode
       
   531 //
       
   532 // -----------------------------------------------------------------------------
       
   533 //
       
   534 gint TMSIPUplink::SetG711CodecMode(const gint mode)
       
   535     {
       
   536     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   537 
       
   538     if (iStatus == EReady)
       
   539         {
       
   540         iG711EncodeMode = mode;
       
   541 
       
   542         if (iG711EncoderIntfc && iCodecID == KMccFourCCIdG711)
       
   543             {
       
   544             if (mode == TMS_G711_CODEC_MODE_ALAW)
       
   545                 {
       
   546                 err = iG711EncoderIntfc->SetEncoderMode(EEncALaw);
       
   547                 TRACE_PRN_N(_L("TMS->UPL: SetG711CodecMode [ALaw]"));
       
   548                 }
       
   549             else if (mode == TMS_G711_CODEC_MODE_MULAW)
       
   550                 {
       
   551                 err = iG711EncoderIntfc->SetEncoderMode(EEncULaw);
       
   552                 TRACE_PRN_N(_L("TMS->UPL: SetG711CodecMode [uLaw]"));
       
   553                 }
       
   554             }
       
   555         }
       
   556 
       
   557     TRACE_PRN_IF_ERR(err);
       
   558     return err;
       
   559     }
       
   560 
       
   561 // -----------------------------------------------------------------------------
       
   562 // TMSIPUplink::GetG711CodecMode
       
   563 //
       
   564 // -----------------------------------------------------------------------------
       
   565 //
       
   566 gint TMSIPUplink::GetG711CodecMode(gint& mode)
       
   567     {
       
   568     // not available through CIs -> return cached value
       
   569     mode = iG711EncodeMode;
       
   570     TRACE_PRN_N1(_L("TMS->UPL: GetG711CodecMode [%d]"), mode);
       
   571     return TMS_RESULT_SUCCESS;
       
   572     }
       
   573 
       
   574 // -----------------------------------------------------------------------------
       
   575 // TMSIPUplink::GetSupportedBitrates
       
   576 //
       
   577 // -----------------------------------------------------------------------------
       
   578 //
       
   579 gint TMSIPUplink::GetSupportedBitrates(RArray<guint>& bitrates)
       
   580     {
       
   581     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   582     bitrates.Reset();
       
   583 
       
   584     if (iSpeechEncoderConfig)
       
   585         {
       
   586         gint i = 0;
       
   587         GList* gbitrates = NULL;
       
   588         //        GList* walk;
       
   589         err = iSpeechEncoderConfig->GetSupportedBitrates(&gbitrates);
       
   590 
       
   591         //TODO: try returning GList and do not convert to RArray
       
   592         for (; gbitrates; gbitrates = g_list_next (gbitrates))
       
   593             {
       
   594             //            guint br = GPOINTER_TO_INT(gbitrates->data);
       
   595             guint br = GPOINTER_TO_UINT(gbitrates->data);
       
   596             bitrates.Append(br);
       
   597             TRACE_PRN_N2(_L("TMS->UPL: GetSupportedBitrates %d:[%d]"), i+1, br);
       
   598             i++;
       
   599             }
       
   600         }
       
   601 
       
   602     TRACE_PRN_IF_ERR(err);
       
   603     return err;
       
   604     }
       
   605 
       
   606 // -----------------------------------------------------------------------------
       
   607 // TMSIPUplink::SetBitrate
       
   608 //
       
   609 // -----------------------------------------------------------------------------
       
   610 //
       
   611 gint TMSIPUplink::SetBitrate(guint bitrate)
       
   612     {
       
   613     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   614 
       
   615     if (iSpeechEncoderConfig)
       
   616         {
       
   617         err = iSpeechEncoderConfig->SetBitrate(bitrate);
       
   618         TRACE_PRN_N1(_L("TMS->UPL: SetBitrate [%d]"), bitrate);
       
   619         }
       
   620 
       
   621     TRACE_PRN_IF_ERR(err);
       
   622     return err;
       
   623     }
       
   624 
       
   625 // -----------------------------------------------------------------------------
       
   626 // TMSIPUplink::GetBitrate
       
   627 //
       
   628 // -----------------------------------------------------------------------------
       
   629 //
       
   630 gint TMSIPUplink::GetBitrate(guint& bitrate)
       
   631     {
       
   632     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   633 
       
   634     if (iSpeechEncoderConfig)
       
   635         {
       
   636         err = iSpeechEncoderConfig->GetBitrate(&bitrate);
       
   637         TRACE_PRN_N1(_L("TMS->UPL: GetBitrate [%d]"), bitrate);
       
   638         }
       
   639 
       
   640     TRACE_PRN_IF_ERR(err);
       
   641     return err;
       
   642     }
       
   643 
       
   644 // -----------------------------------------------------------------------------
       
   645 // TMSIPUplink::SetVad
       
   646 //
       
   647 // -----------------------------------------------------------------------------
       
   648 //
       
   649 gint TMSIPUplink::SetVad(const TMSFormatType fmttype, const gboolean vad)
       
   650     {
       
   651     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   652 
       
   653     switch (fmttype)
       
   654         {
       
   655         case TMS_FORMAT_G711:
       
   656             {
       
   657             if (iG711EncoderIntfc)
       
   658                 {
       
   659                 err = iG711EncoderIntfc->SetVadMode(vad);
       
   660                 TRACE_PRN_N1(_L("TMS->UPL: SetVad [%d]"), vad);
       
   661                 }
       
   662             break;
       
   663             }
       
   664         case TMS_FORMAT_G729:
       
   665             {
       
   666             if (iG729EncoderIntfc)
       
   667                 {
       
   668                 err = iG729EncoderIntfc->SetVadMode(vad);
       
   669                 TRACE_PRN_N1(_L("TMS->UPL: SetVad [%d]"), vad);
       
   670                 }
       
   671             break;
       
   672             }
       
   673         case TMS_FORMAT_ILBC:
       
   674             {
       
   675             if (iIlbcEncoderIntfc)
       
   676                 {
       
   677                 err = iIlbcEncoderIntfc->SetVadMode(vad);
       
   678                 TRACE_PRN_N1(_L("TMS->UPL: SetVad [%d]"), vad);
       
   679                 }
       
   680             break;
       
   681             }
       
   682         case TMS_FORMAT_AMR:
       
   683             {
       
   684             if (iSpeechEncoderConfig)
       
   685                 {
       
   686                 err = iSpeechEncoderConfig->SetVadMode(vad);
       
   687                 TRACE_PRN_N1(_L("TMS->UPL: SetVad [%d]"), vad);
       
   688                 }
       
   689             break;
       
   690             }
       
   691         default:
       
   692             {
       
   693             break; //TMS_RESULT_DOES_NOT_EXIST
       
   694             }
       
   695         }
       
   696 
       
   697     TRACE_PRN_IF_ERR(err);
       
   698     return err;
       
   699     }
       
   700 
       
   701 // -----------------------------------------------------------------------------
       
   702 // TMSIPUplink::GetVad
       
   703 //
       
   704 // -----------------------------------------------------------------------------
       
   705 //
       
   706 gint TMSIPUplink::GetVad(const TMSFormatType fmttype, gboolean& vad)
       
   707     {
       
   708     gint err = TMS_RESULT_DOES_NOT_EXIST;
       
   709 
       
   710     switch (fmttype)
       
   711         {
       
   712         case TMS_FORMAT_G711:
       
   713             {
       
   714             if (iG711EncoderIntfc)
       
   715                 {
       
   716                 err = iG711EncoderIntfc->GetVadMode(&vad);
       
   717                 TRACE_PRN_N1(_L("TMS->UPL: GetVad [%d]"), vad);
       
   718                 }
       
   719             break;
       
   720             }
       
   721         case TMS_FORMAT_G729:
       
   722             {
       
   723             if (iG729EncoderIntfc)
       
   724                 {
       
   725                 err = iG729EncoderIntfc->GetVadMode(&vad);
       
   726                 TRACE_PRN_N1(_L("TMS->UPL: GetVad [%d]"), vad);
       
   727                 }
       
   728             break;
       
   729             }
       
   730         case TMS_FORMAT_ILBC:
       
   731             {
       
   732             if (iIlbcEncoderIntfc)
       
   733                 {
       
   734                 err = iIlbcEncoderIntfc->GetVadMode(&vad);
       
   735                 TRACE_PRN_N1(_L("TMS->UPL: GetVad [%d]"), vad);
       
   736                 }
       
   737             break;
       
   738             }
       
   739         case TMS_FORMAT_AMR:
       
   740             {
       
   741             if (iSpeechEncoderConfig)
       
   742                 {
       
   743                 err = iSpeechEncoderConfig->GetVadMode(&vad);
       
   744                 TRACE_PRN_N1(_L("TMS->UPL: GetVad [%d]"), vad);
       
   745                 }
       
   746             break;
       
   747             }
       
   748         default:
       
   749             {
       
   750             break; //TMS_RESULT_DOES_NOT_EXIST
       
   751             }
       
   752         }
       
   753 
       
   754     TRACE_PRN_IF_ERR(err);
       
   755     return err;
       
   756     }
       
   757 
       
   758 // End of file