void RTP::process_dtmf_rfc2833() { unsigned int seqno = getSeqNum(); unsigned int event, event_end, samples; char resp = 0; unsigned int timestamp = getTimestamp(); unsigned char *pdata = data + sizeof(RTPFixedHeader); /* Figure out event, event end, and samples */ event = ntohl(*((unsigned int *)(pdata))); event >>= 24; event_end = ntohl(*((unsigned int *)(pdata))); event_end <<= 8; event_end >>= 24; samples = ntohl(*((unsigned int *)(pdata))); samples &= 0xFFFF; if(dtmfdebug) syslog(LOG_ERR, "Got RTP RFC2833 from %u (seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d) \n", getMarker(), seqno, timestamp, len, (getMarker()?1:0), event, ((event_end & 0x80)?1:0), samples); /* Figure out what digit was pressed */ if (event < 10) { resp = '0' + event; } else if (event < 11) { resp = '*'; } else if (event < 12) { resp = '#'; } else if (event < 16) { resp = 'A' + (event - 12); } else if (event < 17) { /* Event 16: Hook flash */ resp = 'X'; } else { /* Not a supported event */ //syslog(LOG_ERR, "Ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", event); return; } if ((last_end_timestamp != timestamp) || (lastdtmf && lastdtmf != resp)) { lastdtmf = resp; if(dtmfdebug) syslog(LOG_ERR, "dtmfevent %c\n", resp); last_end_timestamp = timestamp; Call *owner = (Call*)call_owner; if(owner) { owner->handle_dtmf(resp, ts2double(header->ts.tv_sec, header->ts.tv_usec), saddr, daddr); } } return; }