Index: include/cp/CallManager.h
===================================================================
--- include/cp/CallManager.h	(revision 11418)
+++ include/cp/CallManager.h	(working copy)
@@ -166,6 +166,9 @@
     //: target call id.  The source call/connection MUST be on hold prior
     //: to initiating the split/join.
 
+    //: mute feature by disabling Input Device Driver Resource
+    virtual void CallManager::enablenputDevice(const char* callId, const char* szRemoteAddress);
+    virtual void disableInputDevice(const char* callId, const char* szRemoteAddress);
 
     virtual void toneStart(const char* callId, int toneId, UtlBoolean local, UtlBoolean remote);
     virtual void toneStop(const char* callId);
Index: include/cp/CpCallManager.h
===================================================================
--- include/cp/CpCallManager.h	(revision 11418)
+++ include/cp/CpCallManager.h	(working copy)
@@ -197,7 +197,9 @@
         CP_RECORD_BUFFER_AUDIO_CONNECTION_STOP,
         CP_LIMIT_CODEC_PREFERENCES,
         CP_SILENT_REMOTE_HOLD,
-        CP_GET_USERAGENT
+        CP_GET_USERAGENT,
+        CP_ENABLE_INPUT_DEVICE,
+        CP_DISABLE_INPUT_DEVICE 
     };
 #endif // DOXYGEN_SHOULD_SKIP_THIS
 
Index: include/tapi/sipXtapi.h
===================================================================
--- include/tapi/sipXtapi.h	(revision 11418)
+++ include/tapi/sipXtapi.h	(working copy)
@@ -1520,6 +1520,13 @@
  * @param bLocal Should the tone be played locally? 
  * @param bRemote Should the tone be played to the remote party?
  */
+ 
+ 
+SIPXTAPI_API SIPX_RESULT sipxDisableInputDevice(const SIPX_CALL hCall); 
+
+SIPXTAPI_API SIPX_RESULT sipxEnableInputDevice(const SIPX_CALL hCall);
+
+ 
 SIPXTAPI_API SIPX_RESULT sipxCallStartTone(const SIPX_CALL hCall, 
                                            const SIPX_TONE_ID toneId,
                                            const bool bLocal,
Index: src/cp/CallManager.cpp
===================================================================
--- src/cp/CallManager.cpp	(revision 11418)
+++ src/cp/CallManager.cpp	(working copy)
@@ -792,6 +792,9 @@
         case CP_LIMIT_CODEC_PREFERENCES:
         case CP_OUTGOING_INFO:
         case CP_GET_USERAGENT:
+        case CP_DISABLE_INPUT_DEVICE:
+        case CP_ENABLE_INPUT_DEVICE:
+        
             // Forward the message to the call
             {
                 UtlString callId;
@@ -1452,6 +1455,24 @@
 }
 
 
+
+void CallManager::disableInputDevice(const char* callId, const char* szRemoteAddress)
+{
+    CpMultiStringMessage disableInputDeviceMessage(CP_DISABLE_INPUT_DEVICE,callId, szRemoteAddress);
+
+    postMessage(disableInputDeviceMessage);
+}
+
+void CallManager::enablenputDevice(const char* callId, const char* szRemoteAddress)
+{
+    CpMultiStringMessage enableInputDeviceMessage(CP_ENABLE_INPUT_DEVICE,callId, szRemoteAddress);
+
+    postMessage(enableInputDeviceMessage);
+}
+
+
+
+
 void CallManager::toneChannelStart(const char* callId, const char* szRemoteAddress, int toneId, UtlBoolean local, UtlBoolean remote)
 {
     CpMultiStringMessage startToneMessage(CP_START_TONE_CONNECTION,
Index: src/cp/CpPeerCall.cpp
===================================================================
--- src/cp/CpPeerCall.cpp	(revision 11418)
+++ src/cp/CpPeerCall.cpp	(working copy)
@@ -2265,7 +2265,35 @@
     case CallManager::CP_GET_USERAGENT:
         handleGetUserAgent( &eventMessage );
         break;
-
+              
+    case CallManager::CP_DISABLE_INPUT_DEVICE:
+        {            
+            UtlString remoteAddress ;
+            ((CpMultiStringMessage&)eventMessage).getString2Data(remoteAddress) ;
+          
+            Connection* connection = findHandlingConnection(remoteAddress);
+            if (connection && mpMediaInterface)
+            {   
+                int connectionId = connection->getConnectionId() ;
+                mpMediaInterface->disableMediaInputDevice(connectionId) ;
+            }           
+        }
+        break;
+        
+     case CallManager::CP_ENABLE_INPUT_DEVICE:
+        {            
+            UtlString remoteAddress ;
+            ((CpMultiStringMessage&)eventMessage).getString2Data(remoteAddress) ;
+          
+            Connection* connection = findHandlingConnection(remoteAddress);
+            if (connection && mpMediaInterface)
+            {   
+                int connectionId = connection->getConnectionId() ;
+                mpMediaInterface->enableMediaInputDevice(connectionId) ;
+            }           
+        }
+        break; 
+       
     case CallManager::CP_START_TONE_CONNECTION:        
         {
             UtlString remoteAddress ;
Index: src/tapi/sipXtapi.cpp
===================================================================
--- src/tapi/sipXtapi.cpp	(revision 11418)
+++ src/tapi/sipXtapi.cpp	(working copy)
@@ -1997,6 +1997,63 @@
 }
 
 
+
+SIPXTAPI_API SIPX_RESULT sipxDisableInputDevice(const SIPX_CALL hCall)
+{
+    OsStackTraceLogger stackLogger(FAC_SIPXTAPI, PRI_DEBUG, "sipxDisableInputDevice");
+    OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,
+        "sipxDisableInputDevice hCall=%d",hCall);
+
+    SIPX_RESULT sr = SIPX_RESULT_FAILURE ;
+    SIPX_INSTANCE_DATA *pInst ;
+    UtlString callId ;
+    UtlString remoteAddress ;
+    
+        if (sipxCallGetCommonData(hCall, &pInst, &callId, &remoteAddress, NULL))
+        {
+            SIPX_CALL_DATA* pData = sipxCallLookup(hCall, SIPX_LOCK_WRITE, stackLogger);
+            
+            if (pData)
+            {
+                sipxCallReleaseLock(pData, SIPX_LOCK_WRITE, stackLogger);
+                pInst->pCallManager->disableInputDevice(callId, remoteAddress) ;
+                sr = SIPX_RESULT_SUCCESS ;
+                             
+            }     
+        }
+    
+    return sr ;
+}
+
+
+ SIPXTAPI_API SIPX_RESULT sipxEnableInputDevice(const SIPX_CALL hCall)
+{
+    OsStackTraceLogger stackLogger(FAC_SIPXTAPI, PRI_DEBUG, "sipxEnableInputDevice");
+    OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,
+        "sipxEnableInputDevice hCall=%d",hCall);
+
+    SIPX_RESULT sr = SIPX_RESULT_FAILURE ;
+    SIPX_INSTANCE_DATA *pInst ;
+    UtlString callId ;
+    UtlString remoteAddress ;
+    
+        if (sipxCallGetCommonData(hCall, &pInst, &callId, &remoteAddress, NULL))
+        {
+            SIPX_CALL_DATA* pData = sipxCallLookup(hCall, SIPX_LOCK_WRITE, stackLogger);
+         
+            if (pData)
+            {
+                sipxCallReleaseLock(pData, SIPX_LOCK_WRITE, stackLogger);
+                pInst->pCallManager->enablenputDevice(callId, remoteAddress) ;
+                sr = SIPX_RESULT_SUCCESS ;                             
+            }     
+        }
+    
+    return sr ;
+}
+
+
+
 SIPXTAPI_API SIPX_RESULT sipxCallStopTone(const SIPX_CALL hCall)
 {
     OsStackTraceLogger stackLogger(FAC_SIPXTAPI, PRI_DEBUG, "sipxCallStopTone");
@@ -4442,7 +4499,9 @@
                 
                 rc = pInterface->getMicrophoneGain(iGain);
 
-                assert(iGain == pInst->micSetting.iGain);                                             
+                assert(iGain == pInst->micSetting.iGain);   
+                
+                                                          
                 if (rc == OS_SUCCESS)
                 {
                     sr = SIPX_RESULT_SUCCESS ;
