Hello everyone,
for the last days I am trying to receive extension events for incoming DTMF using SIP. I have read the global call for IP documentation, specifically section 4.16.
My code is roughly based on the SIP sample code from the forum here. When I receive the line device reset event, I do the following:
// set DTMF support
GC_PARM_BLKP parmblkp = nullptr;
gc_util_insert_parm_val(&parmblkp, IPSET_DTMF, IPPARM_SUPPORT_DTMF_BITMASK, sizeof(char), IP_DTMF_TYPE_INBAND_RTP | IP_DTMF_TYPE_RFC_2833);
gc_util_insert_parm_val(&parmblkp, IPSET_CALLINFO, IPPARM_CONNECTIONMETHOD, sizeof(char), IP_CONNECTIONMETHOD_FASTSTART);
if(gc_SetUserInfo(GCTGT_GCLIB_CHAN, pLine->hDevice, parmblkp, GC_ALLCALLS) != GC_SUCCESS)
{
LogGCError(...);
return;
}
gc_util_delete_parm_blk(parmblkp);
// wait for incoming call on line device
if(gc_WaitCall(pLine->hDevice, NULL, 0, -1, EV_ASYNC) != GC_SUCCESS)
{
LogGCError(static_cast<CHMPBase *>(pLine), _T("Wait for call"));
return;
}
When the IP board becomes unblocked after opening it, I try to enable events for DTMF. The dcoumenation is a bit shady here, but I found some code here on the forum, which lead me to this:
GC_PARM_BLK *pParm = NULL;
long lMask = EXTENSIONEVT_DTMF_USERINPUT_SIGNAL | EXTENSIONEVT_DTMF_RFC2833 | EXTENSIONEVT_DTMF_ALPHANUMERIC;
long lReqId = 0;
gc_util_insert_parm_ref(&pParm, IPSET_EXTENSIONEVT_MSK, GCACT_ADDMSK, sizeof(long), (void *)&lMask);
if(gc_SetConfigData(GCTGT_CCLIB_NETIF, pBoard->hDevice, pParm, 3, GCUPDATE_IMMEDIATE, &lReqId, EV_ASYNC) == -1)
LogGCError(static_cast<CHMPBase *>(pBoard), _T("Set Config Data"));
gc_util_delete_parm_blk(pParm);
Apparently EXTENSIONEVT_DTMF_ALPHANUMERIC is not supported by SIP, I tried basically all combinations of the three DTMF related bitmasks I found here and in the documentation.
I can take calls and play wave files to the user, but whatever I do, I do not receive GCEV_EXTENSION events when DTMF tones are sent to me. I do receive a GCEV_CALLINFO for the very first DTMF tone coming in, but no more events after that.
I also tried a different approach using dx_getdig(), but that doesn't allow me to listen for DTMF while I am playing a file to the caller ("Device is busy").
What am I doing wrong?