mmserv/voipaudioservices/VoIPServer/src/VoIPServerSession.cpp
changeset 53 eabc8c503852
parent 28 ebf79c79991a
equal deleted inserted replaced
48:a493a607b5bf 53:eabc8c503852
    95         {
    95         {
    96         iITCMsgComQueue.Close();
    96         iITCMsgComQueue.Close();
    97         }
    97         }
    98 
    98 
    99     iShared.iMutex.Close();
    99     iShared.iMutex.Close();
   100     iShared.iCodecSettings.iArrBitrates.Reset();
       
   101 
       
   102     iVoIPServer.DropSession(); // will start shutdown if no more sessions left
   100     iVoIPServer.DropSession(); // will start shutdown if no more sessions left
   103 
   101 
   104     // Release memory and close handles to unused plug-ins held by the DevSound
   102     // Release memory and close handles to unused plug-ins held by the DevSound
   105     REComSession::FinalClose();
   103     REComSession::FinalClose();
   106 
   104 
   126     iShared.iMutex.Wait();
   124     iShared.iMutex.Wait();
   127     iShared.iMainThreadID = tID;
   125     iShared.iMainThreadID = tID;
   128     iAO = new (ELeave) CVoIPServerAO(this, tID);
   126     iAO = new (ELeave) CVoIPServerAO(this, tID);
   129     iShared.iMnThreadStatus = &(this->iAO->iStatus);
   127     iShared.iMnThreadStatus = &(this->iAO->iStatus);
   130     iShared.iCodecSettings.iG711FrameRate = TVoIPCodecSettings::E20MS;
   128     iShared.iCodecSettings.iG711FrameRate = TVoIPCodecSettings::E20MS;
       
   129     iShared.iCodecSettings.iArrBitrates = NULL;
   131     iShared.iMutex.Signal();
   130     iShared.iMutex.Signal();
   132     iAO->Request();
   131     iAO->Request();
   133     iSessionType = ENone;
   132     iSessionType = ENone;
   134 
   133 
   135     TRACE_PRN_FN_EXT;
   134     TRACE_PRN_FN_EXT;
   410     TVoIPMsgBufPckg p;
   409     TVoIPMsgBufPckg p;
   411     p().iStatus = KErrNone;
   410     p().iStatus = KErrNone;
   412     p().iInt = 0;
   411     p().iInt = 0;
   413 
   412 
   414     // Is codecs info already available?
   413     // Is codecs info already available?
   415     if (iCodecsCountUp > 0 &&
   414     if (iCodecsCountUp > 0 && (iSessionType == EQueryEnc ||
   416        (iSessionType == EQueryEnc || iSessionType == EUplink))
   415             iSessionType == EUplink))
   417         {
   416         {
   418         p().iInt = iCodecsCountUp;
   417         p().iInt = iCodecsCountUp;
   419         iShared.iMutex.Wait();
   418         iShared.iMutex.Wait();
   420         p().iUint = iShared.iCodecSettings.iG711FrameRate; //TODO:
   419         p().iUint = iShared.iCodecSettings.iG711FrameRate; //TODO:
   421         iShared.iMutex.Signal();
   420         iShared.iMutex.Signal();
   422         }
   421         }
   423     else if (iCodecsCountDn > 0 &&
   422     else if (iCodecsCountDn > 0 && (iSessionType == EQueryDec ||
   424             (iSessionType == EQueryDec || iSessionType == EDnlink))
   423             iSessionType == EDnlink))
   425         {
   424         {
   426         p().iInt = iCodecsCountDn;
   425         p().iInt = iCodecsCountDn;
   427         iShared.iMutex.Wait();
   426         iShared.iMutex.Wait();
   428         p().iUint = iShared.iCodecSettings.iG711FrameRate; //TODO:
   427         p().iUint = iShared.iCodecSettings.iG711FrameRate; //TODO:
   429         iShared.iMutex.Signal();
   428         iShared.iMutex.Signal();
   479     CleanupStack::PushL(dataCopyBuffer);
   478     CleanupStack::PushL(dataCopyBuffer);
   480     RBufWriteStream stream;
   479     RBufWriteStream stream;
   481     stream.Open(*dataCopyBuffer);
   480     stream.Open(*dataCopyBuffer);
   482     CleanupClosePushL(stream);
   481     CleanupClosePushL(stream);
   483 
   482 
   484     if (iCodecsCountUp > 0 &&
   483     if (iCodecsCountUp > 0 && (iSessionType == EQueryEnc ||
   485        (iSessionType == EQueryEnc || iSessionType == EUplink))
   484             iSessionType == EUplink))
   486         {
   485         {
   487         for (TInt i = 0; i < iCodecsCountUp; i++)
   486         for (TInt i = 0; i < iCodecsCountUp; i++)
   488             {
   487             {
   489             stream.WriteUint32L(iCodecsUp[i].FourCC());
   488             stream.WriteUint32L(iCodecsUp[i].FourCC());
   490             TRACE_PRN_N2(_L("VoIP->CodecUP[%d]==[0x%x]"), i+1, iCodecsUp[i].FourCC());
   489             TRACE_PRN_N2(_L("VoIP->CodecUP[%d]==[0x%x]"), i+1, iCodecsUp[i].FourCC());
   491             }
   490             }
   492         }
   491         }
   493     else if (iCodecsCountDn > 0 &&
   492     else if (iCodecsCountDn > 0 && (iSessionType == EQueryDec ||
   494             (iSessionType == EQueryDec || iSessionType == EDnlink))
   493             iSessionType == EDnlink))
   495         {
   494         {
   496         for (TInt i = 0; i < iCodecsCountDn; i++)
   495         for (TInt i = 0; i < iCodecsCountDn; i++)
   497             {
   496             {
   498             stream.WriteUint32L(iCodecsDn[i].FourCC());
   497             stream.WriteUint32L(iCodecsDn[i].FourCC());
   499             TRACE_PRN_N2(_L("VoIP->CodecDN[%d]==[0x%x]"), i+1, iCodecsDn[i].FourCC());
   498             TRACE_PRN_N2(_L("VoIP->CodecDN[%d]==[0x%x]"), i+1, iCodecsDn[i].FourCC());
   533 
   532 
   534     // Create thread only once
   533     // Create thread only once
   535     if (iThread.Handle() <= 0)
   534     if (iThread.Handle() <= 0)
   536         {
   535         {
   537         err = iThread.Create(_L("VoIPDownlinkThread"),
   536         err = iThread.Create(_L("VoIPDownlinkThread"),
   538                              CVoIPDownlinkThread::ThreadFunction,
   537                 CVoIPDownlinkThread::ThreadFunction, KDefaultStackSize,
   539                              KDefaultStackSize,
   538                 KMinHeapSize, KMinHeapSize << 12, //1MB
   540                              KMinHeapSize,
   539                 &iShared);
   541                              KMinHeapSize << 12, //1MB
       
   542                              &iShared);
       
   543         if (err == KErrNone)
   540         if (err == KErrNone)
   544             {
   541             {
   545             iThread.SetPriority(EPriorityRealTime);
   542             iThread.SetPriority(EPriorityRealTime);
   546             iThread.Resume();
   543             iThread.Resume();
   547 
   544 
   592 
   589 
   593     // Create thread only once
   590     // Create thread only once
   594     if (iThread.Handle() <= 0)
   591     if (iThread.Handle() <= 0)
   595         {
   592         {
   596         err = iThread.Create(_L("VoIPUplinkThread"),
   593         err = iThread.Create(_L("VoIPUplinkThread"),
   597                              CVoIPUplinkThread::ThreadFunction,
   594                 CVoIPUplinkThread::ThreadFunction, KDefaultStackSize,
   598                              KDefaultStackSize,
   595                 KMinHeapSize, KMinHeapSize << 12, //1MB
   599                              KMinHeapSize,
   596                 &iShared);
   600                              KMinHeapSize << 12, //1MB
       
   601                              &iShared);
       
   602         if (err == KErrNone)
   597         if (err == KErrNone)
   603             {
   598             {
   604             iThread.SetPriority(EPriorityRealTime);
   599             iThread.SetPriority(EPriorityRealTime);
   605             iThread.Resume();
   600             iThread.Resume();
   606 
   601 
   987     stream.Open(*dataCopyBuffer);
   982     stream.Open(*dataCopyBuffer);
   988     CleanupClosePushL(stream);
   983     CleanupClosePushL(stream);
   989 
   984 
   990     RArray<TUint> bitrates;
   985     RArray<TUint> bitrates;
   991     iShared.iMutex.Wait();
   986     iShared.iMutex.Wait();
   992     bitrates = iShared.iCodecSettings.iArrBitrates;
   987     bitrates = *iShared.iCodecSettings.iArrBitrates;
   993     iShared.iMutex.Signal();
   988     iShared.iMutex.Signal();
   994     TInt numOfItems = bitrates.Count();
   989     TInt numOfItems = bitrates.Count();
   995 
   990 
   996     for (TInt i = 0; i < numOfItems; i++)
   991     for (TInt i = 0; i < numOfItems; i++)
   997         {
   992         {
   998         stream.WriteUint32L(bitrates[i]);
   993         stream.WriteUint32L(bitrates[i]);
   999 
       
  1000         TRACE_PRN_N1(_L("VoIP->SRV-SESSION: BR: [%d]"), bitrates[i]);
   994         TRACE_PRN_N1(_L("VoIP->SRV-SESSION: BR: [%d]"), bitrates[i]);
  1001         }
   995         }
  1002 
   996 
  1003     aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
   997     aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
  1004 
   998 
  1675     {
  1669     {
  1676     TRACE_PRN_FN_ENT;
  1670     TRACE_PRN_FN_ENT;
  1677     TRACE_PRN_IF_ERR(aError);
  1671     TRACE_PRN_IF_ERR(aError);
  1678 
  1672 
  1679     TVoIPMsgBufPckg p;
  1673     TVoIPMsgBufPckg p;
  1680     iShared.iMutex.Wait();
  1674     p().iInt = 0;
  1681     p().iInt = iShared.iCodecSettings.iArrBitrates.Count();
       
  1682     p().iStatus = aError;
  1675     p().iStatus = aError;
       
  1676 
       
  1677     iShared.iMutex.Wait();
       
  1678     if (iShared.iCodecSettings.iArrBitrates)
       
  1679         {
       
  1680         p().iInt = iShared.iCodecSettings.iArrBitrates->Count();
       
  1681         }
  1683     iShared.iMutex.Signal();
  1682     iShared.iMutex.Signal();
  1684     TRAPD(err, iMessage.WriteL(0, p));
  1683     TRAPD(err, iMessage.WriteL(0, p));
  1685     iMessage.Complete(err);
  1684     iMessage.Complete(err);
  1686     iMsgQueued = EFalse;
  1685     iMsgQueued = EFalse;
  1687 
  1686 
  2040 // -----------------------------------------------------------------------------
  2039 // -----------------------------------------------------------------------------
  2041 //
  2040 //
  2042 void CVoIPAudioServerSession::ToneFinished(TInt aError)
  2041 void CVoIPAudioServerSession::ToneFinished(TInt aError)
  2043     {
  2042     {
  2044     TRACE_PRN_IF_ERR(aError);
  2043     TRACE_PRN_IF_ERR(aError);
  2045 
       
  2046     NotifyDtmfClient(ECmdDTMFTonePlayFinished, aError);
  2044     NotifyDtmfClient(ECmdDTMFTonePlayFinished, aError);
  2047     }
  2045     }
  2048 
  2046 
  2049 // -----------------------------------------------------------------------------
  2047 // -----------------------------------------------------------------------------
  2050 // CVoIPAudioServerSession::BufferToBeEmptied
  2048 // CVoIPAudioServerSession::BufferToBeEmptied