132 StartL(KTMSServerName); |
136 StartL(KTMSServerName); |
133 RThread().SetPriority(EPriorityRealTime); |
137 RThread().SetPriority(EPriorityRealTime); |
134 iEffectSettings = TMSGlobalEffectsSettings::NewL(); |
138 iEffectSettings = TMSGlobalEffectsSettings::NewL(); |
135 iTarHandler = NULL; |
139 iTarHandler = NULL; |
136 iAudioCenRepHandler = NULL; |
140 iAudioCenRepHandler = NULL; |
137 iDTMFHandler = NULL; |
|
138 iCurrentRouting = TMS_AUDIO_OUTPUT_PRIVATE; |
141 iCurrentRouting = TMS_AUDIO_OUTPUT_PRIVATE; |
|
142 iDTMFDnlinkPlayer = NULL; |
|
143 iDTMFUplinkPlayer = NULL; |
|
144 iDTMFUplinkPlayerEtel = NULL; |
|
145 iActiveCallType = -1; |
|
146 iSyncVol = TMSPubSubListener::NewL(KTMSPropertyCategory,ESyncVolume, this); |
139 |
147 |
140 //TODO: EUnit fails to initialize ProfileEngine in RT in eshell mode |
148 //TODO: EUnit fails to initialize ProfileEngine in RT in eshell mode |
141 TRAP_IGNORE(InitRingTonePlayerL()); |
149 TRAP_IGNORE(InitRingTonePlayerL()); |
142 |
150 |
143 // We need it running for global volume change updates |
151 // We need it running for global volume change updates |
188 { |
196 { |
189 return iSession; |
197 return iSession; |
190 } |
198 } |
191 |
199 |
192 // ----------------------------------------------------------------------------- |
200 // ----------------------------------------------------------------------------- |
193 // TMSServer::SetDnLinkSession |
|
194 // |
|
195 // ----------------------------------------------------------------------------- |
|
196 // |
|
197 void TMSServer::SetDnLinkSession(const TBool aSession) |
|
198 { |
|
199 iDnlinkSession = aSession; |
|
200 } |
|
201 |
|
202 // ----------------------------------------------------------------------------- |
|
203 // TMSServer::SetUpLinkSession |
|
204 // |
|
205 // ----------------------------------------------------------------------------- |
|
206 // |
|
207 void TMSServer::SetUpLinkSession(const TBool aSession) |
|
208 { |
|
209 iUplinkSession = aSession; |
|
210 } |
|
211 |
|
212 // ----------------------------------------------------------------------------- |
|
213 // TMSServer::HasDnLinkSession |
|
214 // |
|
215 // ----------------------------------------------------------------------------- |
|
216 // |
|
217 TBool TMSServer::HasDnLinkSession() const |
|
218 { |
|
219 return iDnlinkSession; |
|
220 } |
|
221 |
|
222 // ----------------------------------------------------------------------------- |
|
223 // TMSServer::HasUpLinkSession |
|
224 // |
|
225 // ----------------------------------------------------------------------------- |
|
226 // |
|
227 TBool TMSServer::HasUpLinkSession() const |
|
228 { |
|
229 return iUplinkSession; |
|
230 } |
|
231 |
|
232 // ----------------------------------------------------------------------------- |
|
233 // TMSServer::GetNewTMSCallSessionHandleL |
201 // TMSServer::GetNewTMSCallSessionHandleL |
234 // |
202 // |
235 // ----------------------------------------------------------------------------- |
203 // ----------------------------------------------------------------------------- |
236 // |
204 // |
237 void TMSServer::GetNewTMSCallSessionHandleL(RHandleBase& aHandle) |
205 void TMSServer::GetNewTMSCallSessionHandleL(RHandleBase& aHandle) |
383 { |
353 { |
384 if (--iAudioCenRepHandlerCount <= 0) |
354 if (--iAudioCenRepHandlerCount <= 0) |
385 { |
355 { |
386 delete iAudioCenRepHandler; |
356 delete iAudioCenRepHandler; |
387 iAudioCenRepHandler = NULL; |
357 iAudioCenRepHandler = NULL; |
388 } |
|
389 } |
|
390 |
|
391 // ----------------------------------------------------------------------------- |
|
392 // TMSServer::StartDTMFNotifierL |
|
393 // |
|
394 // ----------------------------------------------------------------------------- |
|
395 // |
|
396 void TMSServer::StartDTMFNotifierL() |
|
397 { |
|
398 TRACE_PRN_FN_ENT; |
|
399 |
|
400 if (!iDTMFHandler) |
|
401 { |
|
402 iDTMFHandlerCount = 0; |
|
403 iDTMFHandler = TMSDtmfEventHandler::NewL( |
|
404 (const_cast<TMSServer*> (this))); |
|
405 } |
|
406 iDTMFHandlerCount++; |
|
407 |
|
408 TRACE_PRN_FN_EXT; |
|
409 } |
|
410 |
|
411 // ----------------------------------------------------------------------------- |
|
412 // TMSServer::CancelDTMFNotifier |
|
413 // |
|
414 // ----------------------------------------------------------------------------- |
|
415 // |
|
416 void TMSServer::CancelDTMFNotifier() |
|
417 { |
|
418 if (--iDTMFHandlerCount <= 0) |
|
419 { |
|
420 delete iDTMFHandler; |
|
421 iDTMFHandler = NULL; |
|
422 } |
358 } |
423 } |
359 } |
424 |
360 |
425 // ----------------------------------------------------------------------------- |
361 // ----------------------------------------------------------------------------- |
426 // TMSServer::SetOutput |
362 // TMSServer::SetOutput |
874 iCurrentRouting = routingpckg().iOutput; |
804 iCurrentRouting = routingpckg().iOutput; |
875 if (iCurrentRouting == TMS_AUDIO_OUTPUT_PUBLIC || |
805 if (iCurrentRouting == TMS_AUDIO_OUTPUT_PUBLIC || |
876 iCurrentRouting == TMS_AUDIO_OUTPUT_LOUDSPEAKER) |
806 iCurrentRouting == TMS_AUDIO_OUTPUT_LOUDSPEAKER) |
877 { |
807 { |
878 iEffectSettings->GetLoudSpkrVolume(vol); |
808 iEffectSettings->GetLoudSpkrVolume(vol); |
|
809 TRACE_PRN_N1(_L("TMSServer::NotifyTarClients loudspkr vol %d"),vol); |
879 } |
810 } |
880 else |
811 else |
881 { |
812 { |
882 iEffectSettings->GetEarPieceVolume(vol); |
813 iEffectSettings->GetEarPieceVolume(vol); |
|
814 TRACE_PRN_N1(_L("TMSServer::NotifyTarClients ear vol %d"),vol); |
883 } |
815 } |
884 |
816 |
885 TInt status = SendMessageToCallServ(TMS_EFFECT_GLOBAL_VOL_SET, vol); |
817 TInt status = SendMessageToCallServ(TMS_EFFECT_GLOBAL_VOL_SET, vol); |
886 |
818 |
887 iSessionIter.SetToFirst(); |
819 iSessionIter.SetToFirst(); |
888 TMSServerSession* serverSession = |
820 TMSServerSession* ss = static_cast<TMSServerSession*> (iSessionIter++); |
889 static_cast<TMSServerSession*> (iSessionIter++); |
821 while (ss != NULL) |
890 while (serverSession != NULL) |
|
891 { |
822 { |
892 // Send only if there is a subscriber to TMS routing notifications. |
823 // Send only if there is a subscriber to TMS routing notifications. |
893 if (iTarHandlerCount > 1) |
824 if (iTarHandlerCount > 1) |
894 { |
825 { |
895 serverSession->HandleRoutingChange(routingpckg); |
826 ss->HandleRoutingChange(routingpckg); |
896 } |
827 } |
897 serverSession->HandleGlobalEffectChange(TMS_EVENT_EFFECT_VOL_CHANGED, |
828 ss->HandleGlobalEffectChange(TMS_EVENT_EFFECT_VOL_CHANGED, vol, ETrue, |
898 vol, ETrue, iCurrentRouting); |
829 iCurrentRouting); |
899 serverSession = static_cast<TMSServerSession*> (iSessionIter++); |
830 ss = static_cast<TMSServerSession*> (iSessionIter++); |
900 } |
831 } |
901 |
832 |
|
833 TRACE_PRN_FN_EXT; |
|
834 return status; |
|
835 } |
|
836 |
|
837 // ----------------------------------------------------------------------------- |
|
838 // TMSServer::InitDTMF |
|
839 // |
|
840 // ----------------------------------------------------------------------------- |
|
841 // |
|
842 TInt TMSServer::InitDTMF(const RMessage2& aMessage) |
|
843 { |
|
844 TRACE_PRN_FN_ENT; |
|
845 TInt status(TMS_RESULT_SUCCESS); |
|
846 TMSStreamType strmtype; |
|
847 strmtype = (TMSStreamType) aMessage.Int0(); |
|
848 |
|
849 if (strmtype == TMS_STREAM_UPLINK) |
|
850 { |
|
851 if (!iDTMFUplinkPlayerEtel) //CS call |
|
852 { |
|
853 // Uses ETel for uplink |
|
854 TRAP(status, iDTMFUplinkPlayerEtel = TMSDTMFProvider::NewL()); |
|
855 if (iDTMFUplinkPlayerEtel && status == TMS_RESULT_SUCCESS) |
|
856 { |
|
857 iDTMFUplinkPlayerEtel->AddObserver(*this); |
|
858 } |
|
859 } |
|
860 if (!iDTMFUplinkPlayer) //IP call |
|
861 { |
|
862 TRAP(status, iDTMFUplinkPlayer = TMSAudioDtmfTonePlayer::NewL(*this, |
|
863 KAudioDTMFString, KAudioPriorityDTMFString)); |
|
864 } |
|
865 } |
|
866 else if (strmtype == TMS_STREAM_DOWNLINK) |
|
867 { |
|
868 if (!iDTMFDnlinkPlayer) //CS or IP call |
|
869 { |
|
870 TRAP(status, iDTMFDnlinkPlayer = TMSAudioDtmfTonePlayer::NewL(*this, |
|
871 KAudioDTMFString, KAudioPriorityDTMFString)); |
|
872 } |
|
873 } |
|
874 |
|
875 aMessage.Complete(status); |
902 TRACE_PRN_FN_EXT; |
876 TRACE_PRN_FN_EXT; |
903 return status; |
877 return status; |
904 } |
878 } |
905 |
879 |
906 // ----------------------------------------------------------------------------- |
880 // ----------------------------------------------------------------------------- |
913 TRACE_PRN_FN_ENT; |
887 TRACE_PRN_FN_ENT; |
914 |
888 |
915 TInt status(TMS_RESULT_SUCCESS); |
889 TInt status(TMS_RESULT_SUCCESS); |
916 TInt len(0); |
890 TInt len(0); |
917 TMSStreamType strmtype; |
891 TMSStreamType strmtype; |
918 |
|
919 strmtype = (TMSStreamType) aMessage.Int0(); |
892 strmtype = (TMSStreamType) aMessage.Int0(); |
920 len = aMessage.GetDesLength(1); |
893 len = aMessage.GetDesLength(1); |
921 HBufC* tone(NULL); |
|
922 if (len > 0) |
894 if (len > 0) |
923 { |
895 { |
924 delete tone; |
896 HBufC* tone(NULL); |
925 tone = NULL; |
897 TRAP(status, tone = HBufC::NewL(len)); |
926 TRAP(status,tone = HBufC::NewL(len)); |
|
927 if (status == TMS_RESULT_SUCCESS) |
898 if (status == TMS_RESULT_SUCCESS) |
928 { |
899 { |
929 TPtr ptr = tone->Des(); |
900 TPtr ptr = tone->Des(); |
930 status = aMessage.Read(1, ptr); |
901 status = aMessage.Read(1, ptr); |
931 TRACE_PRN_N(ptr); |
902 TRACE_PRN_N(ptr); |
932 |
903 |
933 TIpcArgs args; |
904 if (strmtype == TMS_STREAM_UPLINK) |
934 args.Set(0, strmtype); |
905 { |
935 args.Set(1, &ptr); |
906 #ifdef __WINSCW__ |
936 status = SendMessageToCallServ(TMS_DTMF_START, args); |
907 // Just to hear DTMF tones in Wins |
937 delete tone; |
908 iActiveCallType = TMS_CALL_IP; |
938 tone = NULL; |
909 #else |
939 } |
910 FindActiveCallType(); |
940 } |
911 #endif |
|
912 if (iActiveCallType == TMS_CALL_IP && iDTMFUplinkPlayer) |
|
913 { |
|
914 iDTMFUplinkPlayer->PlayDtmfTone(ptr); |
|
915 status = TMS_RESULT_SUCCESS; |
|
916 } |
|
917 else if (iActiveCallType == TMS_CALL_CS && |
|
918 iDTMFUplinkPlayerEtel) |
|
919 { |
|
920 status = iDTMFUplinkPlayerEtel->SendDtmfToneString(ptr); |
|
921 } |
|
922 else |
|
923 { |
|
924 status = TMS_RESULT_INVALID_STATE; |
|
925 } |
|
926 NotifyDtmfClients(ECmdDTMFToneUplPlayStarted, status); |
|
927 } |
|
928 else if (strmtype == TMS_STREAM_DOWNLINK) |
|
929 { |
|
930 status = TMS_RESULT_INVALID_STATE; |
|
931 if (iDTMFDnlinkPlayer) |
|
932 { |
|
933 iDTMFDnlinkPlayer->PlayDtmfTone(ptr); |
|
934 status = TMS_RESULT_SUCCESS; |
|
935 } |
|
936 NotifyDtmfClients(ECmdDTMFToneDnlPlayStarted, status); |
|
937 } |
|
938 else |
|
939 { |
|
940 status = TMS_RESULT_STREAM_TYPE_NOT_SUPPORTED; |
|
941 } |
|
942 } |
|
943 delete tone; |
|
944 tone = NULL; |
|
945 } |
|
946 |
941 aMessage.Complete(status); |
947 aMessage.Complete(status); |
942 |
|
943 TRACE_PRN_FN_EXT; |
948 TRACE_PRN_FN_EXT; |
944 return status; |
949 return status; |
945 } |
950 } |
946 |
951 |
947 // ----------------------------------------------------------------------------- |
952 // ----------------------------------------------------------------------------- |
951 // |
956 // |
952 TInt TMSServer::StopDTMF(const RMessage2& aMessage) |
957 TInt TMSServer::StopDTMF(const RMessage2& aMessage) |
953 { |
958 { |
954 TRACE_PRN_FN_ENT; |
959 TRACE_PRN_FN_ENT; |
955 |
960 |
956 TInt status(TMS_RESULT_SUCCESS); |
961 TInt status(TMS_RESULT_INVALID_STATE); |
957 TMSStreamType streamtype; |
962 TMSStreamType streamtype; |
958 streamtype = (TMSStreamType) aMessage.Int0(); |
963 streamtype = (TMSStreamType) aMessage.Int0(); |
959 status = SendMessageToCallServ(TMS_DTMF_STOP, streamtype); |
964 |
|
965 if (streamtype == TMS_STREAM_UPLINK) |
|
966 { |
|
967 if (iActiveCallType == TMS_CALL_IP && iDTMFUplinkPlayer) |
|
968 { |
|
969 iDTMFUplinkPlayer->Cancel(); |
|
970 status = TMS_RESULT_SUCCESS; |
|
971 } |
|
972 else if (iActiveCallType == TMS_CALL_CS && |
|
973 iDTMFUplinkPlayerEtel) |
|
974 { |
|
975 status = iDTMFUplinkPlayerEtel->StopDtmfTone(); |
|
976 status = TMSUtility::EtelToTMSResult(status); |
|
977 } |
|
978 } |
|
979 else if (streamtype == TMS_STREAM_DOWNLINK) |
|
980 { |
|
981 if (iDTMFDnlinkPlayer) |
|
982 { |
|
983 iDTMFDnlinkPlayer->Cancel(); |
|
984 status = TMS_RESULT_SUCCESS; |
|
985 } |
|
986 } |
|
987 iActiveCallType = -1; |
|
988 NotifyDtmfClients(ECmdDTMFTonePlayFinished, status); |
960 aMessage.Complete(status); |
989 aMessage.Complete(status); |
961 |
|
962 TRACE_PRN_FN_EXT; |
990 TRACE_PRN_FN_EXT; |
963 return status; |
991 return status; |
964 } |
992 } |
965 |
993 |
966 // ----------------------------------------------------------------------------- |
994 // ----------------------------------------------------------------------------- |
969 // ----------------------------------------------------------------------------- |
997 // ----------------------------------------------------------------------------- |
970 // |
998 // |
971 TInt TMSServer::ContinueSendingDTMF(const RMessage2& aMessage) |
999 TInt TMSServer::ContinueSendingDTMF(const RMessage2& aMessage) |
972 { |
1000 { |
973 TRACE_PRN_FN_ENT; |
1001 TRACE_PRN_FN_ENT; |
974 |
1002 TInt status(TMS_RESULT_INVALID_STATE); |
975 TInt status(TMS_RESULT_SUCCESS); |
1003 if (iActiveCallType == TMS_CALL_CS && iDTMFUplinkPlayerEtel) |
976 TBool continuesending; |
1004 { |
977 continuesending = (TBool) aMessage.Int0(); |
1005 TBool continuesnd = (TBool) aMessage.Int0(); |
978 status = SendMessageToCallServ(TMS_DTMF_CONTINUE, continuesending); |
1006 status = iDTMFUplinkPlayerEtel->ContinueDtmfStringSending(continuesnd); |
|
1007 status = TMSUtility::EtelToTMSResult(status); |
|
1008 } |
979 aMessage.Complete(status); |
1009 aMessage.Complete(status); |
980 |
|
981 TRACE_PRN_FN_EXT; |
1010 TRACE_PRN_FN_EXT; |
982 return status; |
1011 return status; |
983 } |
1012 } |
984 |
1013 |
985 // ----------------------------------------------------------------------------- |
1014 // ----------------------------------------------------------------------------- |
986 // TMSServer::NotifyDtmfClients |
1015 // TMSServer::NotifyDtmfClients |
987 // |
1016 // |
988 // ----------------------------------------------------------------------------- |
1017 // ----------------------------------------------------------------------------- |
989 // |
1018 // |
990 TInt TMSServer::NotifyDtmfClients(TmsMsgBufPckg dtmfpckg) |
1019 TInt TMSServer::NotifyDtmfClients(gint aEventType, gint aError) |
991 { |
1020 { |
992 TRACE_PRN_FN_ENT; |
1021 TRACE_PRN_FN_ENT; |
993 |
|
994 iSessionIter.SetToFirst(); |
1022 iSessionIter.SetToFirst(); |
995 TMSServerSession* serverSession = |
1023 TMSServerSession* ss = static_cast<TMSServerSession*> (iSessionIter++); |
996 static_cast<TMSServerSession*> (iSessionIter++); |
1024 while (ss != NULL) |
997 |
1025 { |
998 while (serverSession != NULL) |
1026 ss->NotifyClient(aEventType, aError); |
999 { |
1027 ss = static_cast<TMSServerSession*> (iSessionIter++); |
1000 serverSession->NotifyClient(dtmfpckg().iRequest, dtmfpckg().iStatus); |
1028 } |
1001 serverSession = static_cast<TMSServerSession*> (iSessionIter++); |
|
1002 } |
|
1003 |
|
1004 TRACE_PRN_FN_EXT; |
1029 TRACE_PRN_FN_EXT; |
1005 return TMS_RESULT_SUCCESS; |
1030 return TMS_RESULT_SUCCESS; |
|
1031 } |
|
1032 |
|
1033 //From DTMFTonePlayerObserver |
|
1034 // ----------------------------------------------------------------------------- |
|
1035 // TMSServer::DTMFInitCompleted |
|
1036 // |
|
1037 // ----------------------------------------------------------------------------- |
|
1038 // |
|
1039 void TMSServer::DTMFInitCompleted(gint status) |
|
1040 { |
|
1041 TRACE_PRN_FN_ENT; |
|
1042 if (status != TMS_RESULT_SUCCESS) |
|
1043 { |
|
1044 NotifyDtmfClients(ECmdDTMFTonePlayFinished, status); |
|
1045 } |
|
1046 TRACE_PRN_FN_EXT; |
|
1047 } |
|
1048 |
|
1049 // ----------------------------------------------------------------------------- |
|
1050 // TMSServer::DTMFToneFinished |
|
1051 // |
|
1052 // ----------------------------------------------------------------------------- |
|
1053 // |
|
1054 void TMSServer::DTMFToneFinished(gint status) |
|
1055 { |
|
1056 TRACE_PRN_FN_ENT; |
|
1057 TRACE_PRN_IF_ERR(status); |
|
1058 |
|
1059 // KErrUnderflow indicates end of DTMF playback. |
|
1060 if (status == KErrUnderflow /*|| status == KErrInUse*/) |
|
1061 { |
|
1062 status = TMS_RESULT_SUCCESS; |
|
1063 } |
|
1064 NotifyDtmfClients(ECmdDTMFTonePlayFinished, status); |
|
1065 TRACE_PRN_FN_EXT; |
|
1066 } |
|
1067 |
|
1068 // ----------------------------------------------------------------------------- |
|
1069 // TMSServer::FindActiveCallType |
|
1070 // |
|
1071 // ----------------------------------------------------------------------------- |
|
1072 // |
|
1073 gint TMSServer::FindActiveCallType() |
|
1074 { |
|
1075 TInt status(TMS_RESULT_INVALID_STATE); |
|
1076 iActiveCallType = -1; |
|
1077 TInt i = 0; |
|
1078 while (i < iTMSCallServList.Count()) |
|
1079 { |
|
1080 TMSStartAndMonitorTMSCallThread* callThread = iTMSCallServList[i]; |
|
1081 if (callThread) |
|
1082 { |
|
1083 TmsCallMsgBufPckg pckg; |
|
1084 TIpcArgs args(&pckg); |
|
1085 status = callThread->iTMSCallProxyLocal.ReceiveFromCallServer( |
|
1086 TMS_GET_ACTIVE_CALL_PARAMS, args); |
|
1087 if (pckg().iBool || status != TMS_RESULT_SUCCESS) |
|
1088 { |
|
1089 iActiveCallType = static_cast<TMSCallType> (pckg().iInt); |
|
1090 break; |
|
1091 } |
|
1092 } |
|
1093 i++; |
|
1094 } |
|
1095 return status; |
|
1096 } |
|
1097 |
|
1098 // ----------------------------------------------------------------------------- |
|
1099 // TMSServer::HandleDTMFEvent |
|
1100 // |
|
1101 // ----------------------------------------------------------------------------- |
|
1102 // |
|
1103 void TMSServer::HandleDTMFEvent(const TMSDTMFObserver::TCCPDtmfEvent event, |
|
1104 const gint status, const TChar /*tone*/) |
|
1105 { |
|
1106 TRACE_PRN_FN_ENT; |
|
1107 TRACE_PRN_IF_ERR(status); |
|
1108 gint cmd = ECmdDTMFTonePlayFinished; |
|
1109 |
|
1110 switch (event) |
|
1111 { |
|
1112 case ECCPDtmfUnknown: //Unknown |
|
1113 break; |
|
1114 case ECCPDtmfManualStart: //DTMF sending started manually |
|
1115 case ECCPDtmfSequenceStart: //Automatic DTMF sending initialized |
|
1116 cmd = ECmdDTMFToneUplPlayStarted; |
|
1117 break; |
|
1118 case ECCPDtmfManualStop: //DTMF sending stopped manually |
|
1119 case ECCPDtmfManualAbort: //DTMF sending aborted manually |
|
1120 case ECCPDtmfSequenceStop: //Automatic DTMF sending stopped |
|
1121 case ECCPDtmfSequenceAbort: //Automatic DTMF sending aborted |
|
1122 case ECCPDtmfStopInDtmfString: //There was stop mark in DTMF string |
|
1123 case ECCPDtmfStringSendingCompleted://DTMF sending success |
|
1124 default: |
|
1125 break; |
|
1126 } |
|
1127 |
|
1128 NotifyDtmfClients(cmd, status); |
|
1129 TRACE_PRN_FN_EXT; |
1006 } |
1130 } |
1007 |
1131 |
1008 // ----------------------------------------------------------------------------- |
1132 // ----------------------------------------------------------------------------- |
1009 // TMSServer::InitRingTonePlayerL |
1133 // TMSServer::InitRingTonePlayerL |
1010 // |
1134 // |