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 |