Cisco Spark Hybrid - Fix Audio Only Calls to Video Devices

For anyone who has been following along with the Cisco Spark Hybrid series, you will likely come across the issue of audio-only calls to video conferencing (VC) devices. For those of you who have successfully deployed Cisco Spark Hybrid Call Aware/Connect and are just experiencing this issue welcome!

If your Spark Hybrid clients are only able to achieve audio and not video when calling VC devices read on to resolve the problem.

As per this KB article Configure and Register IOS-Based Media Termination Points for Call Service Connect, an IOS-MTP is required to get the hybrid spark client playing nicely with the VC devices.

Out-of-Band (OOB) DTMF is required for DTMF interoperability with Cisco Spark CTI remote devices. If any devices registered to your call control environment do not support OOB, then Unified Communications Manager inserts a software MTP.

To ensure that both audio and video is passed through properly on a call involving TC/CE-based endpoints, you must use an IOS-based MTP with passthrough configured.

This is also briefly called out in the KB article Set Up Hybrid Call Service Connect, section Complete the Prerequisites for Hybrid Call Service Connect, step 5; which subsequently links to the KB article above.

Configure any TC or CE-based video endpoints to avoid audio-only calls:

Insertion of a Unified Communications Manager server-based MTP (media termination point) results in audio-only calls when TC and CE-based video endpoints are involved. Instead, see this article for directions to use an IOS-based MTP for DTMF interworking.

I wont recount all the steps in of how to setup the MTP as that is well documented in the KB articles, however, at a high level on the IOS device the following configuration is required:

sccp local GigabitEthernet0/0
sccp ccm identifier 1 priority 1 version 7.0
sccp ccm identifier 2 priority 2 version 7.0
sccp ccm group 1
associate ccm 1 priority 1
associate ccm 2 priority 2
associate profile 1 register MTP_NAME_USED_IN_CUCM
dspfarm profile 1 mtp
description passthru mtp for call service connect
codec g711ulaw
codec pass-through
maximum sessions software 200
associate application SCCP

The below RTMT trace excerpt was taken before the IOS-MTP was configured, for reference.

39329729.014 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::isMTPNeededForDTMF, isMTPNeeded for DTMF inection from OOB to 2833 party1MTPNeed=1 party1MTPNeed=0 mtpinsertionReason=0
39329729.015 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::isMTPNeededForDTMFInjectionFromOOBTo2833 - MTPInsertionReason=0 DTMFSide=0 Party1XferMode=16 Party2XferMode=16 Party 1[DTMFConfig=1 DTMFMethod=3 wantDTMFReception=1 DTMFReception=0 MTPNeedForDTMFInject=1] Party 2[DTMFConfig=1 DTMFMethod=2 wantDTMFReception=1 DTMFReception=0 MTPNeedForDTMFInject=0]
39329729.016 |15:42:24.544 |AppInfo |!!ERROR!! -MediaManager-(1514)::isMTPNeededForDTMFInjectionFromOOBTo2833 CTIRD Party 1 needs MTP DTMFMTPSide=2, MTPInsertReason=1
39329729.017 |15:42:24.544 |AppInfo |!!ERROR!! -MediaManager-(1514)::isMTPNeededForDTMFInjectionFromOOBTo2833 DTMFMTPSide=2, MTPInsertReason=1
39329729.018 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::isMTPNeededForDTMF, after all MTP determinationMTPSide=2 mtpinsertionReason=1
39329729.019 |15:42:24.544 |AppInfo |DET-MediaManager-(1514) - isIpv6CapableMTPNeeded(0) ipAddrMode(0 0) mtpside(0)
39329729.020 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::AllocateMTPForZeroSavedConnection mtp for DTMF ipv6(1 0)
39329729.021 |15:42:24.544 |AppInfo |SIG-MediaManager-(1514)::handleMediaConnectRequest, connCount=2
39329729.022 |15:42:24.544 |AppInfo |DET-RegionsServer::matchCapabilities-- savedOption=3, PREF_NONE, regionA=(null) regionB=(null) latentCaps(A=0, B=0) kbps=64, capACount=4, capBCount=11
39329729.023 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::checkAudioPassThru, param(bPostMTPAllocation=0,chkTrp=1), capCount(4,11), mtpPT=1, aPT=1
39329729.024 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::allocateProxies, j=0 XferMode(16 0) CI(48131115 0) mrid(0 0) resrcCI(0 0)
39329729.025 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::allocateProxies, connCount=2, party1 mrid=0 party2 mrid=0, j=0, party1MediaRequire=0 party2mediaRequire=0 Device reqd: None MultiMedia PassThru
39329729.026 |15:42:24.544 |AppInfo |DET-RegionsServer::matchCapabilities-- savedOption=3, PREF_NONE, regionA=(null) regionB=(null) latentCaps(A=0, B=0) kbps=64, capACount=4, capBCount=11
39329729.027 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::getCapsAndRegionForBothSides, entryInList=0, connCount=2
39329729.028 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::sendMTPXcoderAllocationRequest, (CapCount,Region),SideA:(4,Region-Trunk-Exp-Acano), SideB:(11,Region-Trunk-Exp-Acano), supressMatchCap=1,MTPNeededForDTMF=1
39329729.029 |15:42:24.544 |AppInfo |SIG-MediaManager-(1514)::sendMTPXcoderAllocationRequest, allocate MTP(ci=48131117), suppressMatchCap=0, mrgl=1d468615-0ba5-4d8f-1ff6-5936535a8c2b DeviceCapsReqdMask=0x119
39329729.030 |15:42:24.544 |AppInfo |DET-MediaManager-(1514)::allocateProxies, j=1 XferMode(16 0) CI(48131116 0) mrid(0 0) resrcCI(0 48131117)
39329729.031 |15:42:24.544 |AppInfo |SIG-MediaManager-(1514)::allocateProxies, allocating resources(1), additional res(0)
39329730.000 |15:42:24.544 |SdlSig |MrmAllocateMtpResourceReq |waiting |MediaResourceManager(2,100,138,1) |MediaManager(2,100,140,1514) |2,100,14,21947.5285^^* |[R:N-H:0,N:0,L:0,V:0,Z:0,D:0] CI=48131117 MRGLPkid=1d468615-0ba5-4d8f-1ff6-5936535a8c2b Kpbs=0 RegionA=Region-Trunk-Exp-Acano CapA=4 RegionB=Region-Trunk-Exp-Acano CapB=11 SuppressFlag=0 DeviceCapReqd= [0x119 DETECT_2833 PT_2833 PT_CAP MM_CAP] MandatoryCapabilities= [0x0] Type=0 Count=4 MTPRequired=F tryPassThru=T
39329730.001 |15:42:24.544 |AppInfo |MediaResourceManager::waiting_MrmAllocateMtpResourceReq CI=48131117, Count=4
39329730.002 |15:42:24.544 |AppInfo |MediaResourceManager::waiting_MrmAllocateMtpResourceReq - CREATING CHILD USING MRGL LIST
39329730.003 |15:42:24.544 |AppInfo |MRM::convertScmStringToStdString BSC-C001-Trunks-MRG
39329730.004 |15:42:24.544 |AppInfo |MRM::getMtpDeviceGivenMrgl MRGL=BSC-C001-Trunks-MRG
39329730.005 |15:42:24.544 |AppInfo |MRM::getMtpDeviceGivenMrgl DeviceName=MTP_BSCXM1CM001 DeviceType=110 Group=0 Counter=0 Capability=0 MultiCast=0 MRGL=1d468615-0ba5-4d8f-1ff6-5936535a8c2b
39329730.006 |15:42:24.544 |AppInfo |MRM::getMtpDeviceGivenMrgl DeviceName=MTP_BSCXS1CM002 DeviceType=110 Group=0 Counter=0 Capability=0 MultiCast=0 MRGL=1d468615-0ba5-4d8f-1ff6-5936535a8c2b
39329730.007 |15:42:24.544 |AppInfo |MRM::getMtpDeviceGivenMrgl GETTING MTP FROM DEFAULT LIST
39329730.008 |15:42:24.544 |AppInfo |MRM::getMtpDeviceGivenMrgl GETTING XCODE FROM DEFAULT LIST
39329730.009 |15:42:24.544 |AppInfo |MediaResourceManager::waiting_MrmAllocateMtpResourceReq - CREATED CHILD USING MRGL AND DEFAULT LIST

There is a handy blog post worth adding to your favourites as well if you need a DTMF refresher here