I had the same problem, i.e. there was a conflict between ID_DTMF_INVALID and 
ID_DTMF_0. I also simply removed ID_DTMF_INVALID from the enumeration 
definition.
 
Regards,
DanĂ­el
 Alexey Trizno wrote:

When remote party send DTMF, local party receive SIPX_MEDIA_INFO with _numeric_ 
toneId (0x02 for '2', 0x0A for '*', 0x0B for '#', etc.), but SIPX_TONE_ID 
structure describes ID_DTMF_2 = '2' (char) for 2.

    ID_DTMF_INVALID        = 0,     /**< Invalid/Uninitialized DMTF Id */
    ID_DTMF_0              = '0',   /**< DMTF 0 */
    ID_DTMF_1              = '1',   /**< DMTF 1 */
    ID_DTMF_2              = '2',   /**< DMTF 2 */
    ID_DTMF_3              = '3',   /**< DMTF 3 */
    ID_DTMF_4              = '4',   /**< DMTF 4 */
    ID_DTMF_5              = '5',   /**< DMTF 5 */
    ID_DTMF_6              = '6',   /**< DMTF 6 */
    ID_DTMF_7              = '7',   /**< DMTF 7 */
    ID_DTMF_8              = '8',   /**< DMTF 8 */
    ID_DTMF_9              = '9',   /**< DMTF 9 */
    ID_DTMF_STAR           = '*',   /**< DMTF * */
    ID_DTMF_POUND          = '#',   /**< DMTF # */
    ID_DTMF_FLASH          = '!',   /**< DTMF Flash */

Thus when remote party send 0, we receive toneId = ID_DTMF_INVALID

These Ids are used for sending DTMF in sipxtapi.

These Ids make their way into dtmflib.cpp into void 
MpToneGen_startTone(MpToneGenPtr p, int toneID) case '1': case  1 : pNew = 
&(p->key1); break;
           case '2': case  2 : pNew = &(p->key2); break;
           case '3': case  3 : pNew = &(p->key3); break;
           case 'a': case 'A': pNew = &(p->keya); break;
           case '4': case  4 : pNew = &(p->key4); break;
           case '5': case  5 : pNew = &(p->key5); break;
           case '6': case  6 : pNew = &(p->key6); break;
           case 'b': case 'B': pNew = &(p->keyb); break;
           case '7': case  7 : pNew = &(p->key7); break;
           case '8': case  8 : pNew = &(p->key8); break;
           case '9': case  9 : pNew = &(p->key9); break;
           case 'c': case 'C': pNew = &(p->keyc); break;
           case '*':           pNew = &(p->keystar); break;
           case '0': case  0 : pNew = &(p->key0); break;
           case '#':           pNew = &(p->keysharp); break;
           case 'd': case 'D': pNew = &(p->keyd); break;


As you can see, the code can handle both '1' and 1 when sending. But when 
firing the event io sipxtapi upon dtmf reception, the ID is not converted to 
internal sipxtapi ID properly. In sipxtapi there is function 
sipxTranslateToneId when sending DTMF, maybe a similar function could be used 
to do reverse translation. 
I found out why I didn't receive DTMF via INFO in sipxtapi, my voip provider 
doesn't support it it seems, it responds with 415 Unsupported media type :( 
when I use sjphone.


The solution could be to get rid of ID_DTMF_INVALID (visual assist says its not 
used anywhere), and replace all '1' etc with their codes: 0--9                
0--9
*                     10
#                     11
A--D              12--15
Flash                 16

in SIPX_TONE_ID


Also clean up the switch in MpToneGen_startTone to get rid of '1' etc and leave 
the numbers only. After these changes we could get rid of sipxTranslateToneId 
in sipxtapiinternal.cpp as with VOICE_ENGINE we would use the same IDs. But 
alexander chemeris or dan petrie must agree with this solution.

Jaroslav Libak

_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
_______________________________________________
sipxtapi-dev mailing list
[email protected]
List Archive: http://list.sipfoundry.org/archive/sipxtapi-dev/

Reply via email to