void MyH323Connection::SetCapabilities(int cap, int dtmfMode, struct ast_codec_pref *prefs) { int txFramesInPacket; // int gsmFrames = 4; PINDEX lastcap = -1; /* last common capability index */ #if 0 if (cap & AST_FORMAT_SPEEX) { /* Not real sure if Asterisk acutally supports all of the various different bit rates so add them all and figure it out later*/ localCapabilities.SetCapability(0, 0, new SpeexNarrow2AudioCapability()); localCapabilities.SetCapability(0, 0, new SpeexNarrow3AudioCapability()); localCapabilities.SetCapability(0, 0, new SpeexNarrow4AudioCapability()); localCapabilities.SetCapability(0, 0, new SpeexNarrow5AudioCapability()); localCapabilities.SetCapability(0, 0, new SpeexNarrow6AudioCapability()); } #endif #if 0 if (cap & AST_FORMAT_GSM) { H323_GSM0610Capability *gsmCap; lastcap = localCapabilities.SetCapability(0, 0, gsmCap = new H323_GSM0610Capability); gsmCap->SetTxFramesInPacket(gsmFrames); } #endif if (cap & AST_FORMAT_ULAW) { H323_G711Capability *g711uCap; lastcap = localCapabilities.SetCapability(0, 0, g711uCap = new H323_G711Capability(H323_G711Capability::muLaw)); txFramesInPacket = ast_get_ptime_by_format(prefs, AST_FORMAT_ULAW); g711uCap->SetTxFramesInPacket(txFramesInPacket); } if (cap & AST_FORMAT_ALAW) { H323_G711Capability *g711aCap; lastcap = localCapabilities.SetCapability(0, 0, g711aCap = new H323_G711Capability(H323_G711Capability::ALaw)); txFramesInPacket = ast_get_ptime_by_format(prefs, AST_FORMAT_ALAW); g711aCap->SetTxFramesInPacket(txFramesInPacket); } if (cap & AST_FORMAT_G726) { H323_G726Capability *g726Cap; lastcap = localCapabilities.SetCapability(0, 0, g726Cap = new H323_G726Capability); txFramesInPacket = ast_get_ptime_by_format(prefs, AST_FORMAT_G726); g726Cap->SetTxFramesInPacket(txFramesInPacket); } if (cap & AST_FORMAT_G729A) { AST_G729ACapability *g729aCap; AST_G729Capability *g729Cap; lastcap = localCapabilities.SetCapability(0, 0, g729aCap = new AST_G729ACapability); lastcap = localCapabilities.SetCapability(0, 0, g729Cap = new AST_G729Capability); txFramesInPacket = ast_get_ptime_by_format(prefs, AST_FORMAT_G729A); g729aCap->SetTxFramesInPacket(txFramesInPacket); g729Cap->SetTxFramesInPacket(txFramesInPacket); } if (cap & AST_FORMAT_G723_1) { H323_G7231Capability *g7231Cap; lastcap = localCapabilities.SetCapability(0, 0, g7231Cap = new H323_G7231Capability); txFramesInPacket = ast_get_ptime_by_format(prefs, AST_FORMAT_G723_1); g7231Cap->SetTxFramesInPacket(txFramesInPacket); } if (cap & AST_FORMAT_G722) { H323_G722Capability *g722Cap; lastcap = localCapabilities.SetCapability(0, 0, g722Cap = new H323_G722Capability); txFramesInPacket = ast_get_ptime_by_format(prefs, AST_FORMAT_G722); g722Cap->SetTxFramesInPacket(txFramesInPacket); } lastcap++; mode = dtmfMode; switch (dtmfMode) { case H323_DTMF_INBAND: localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneH245)); sendUserInputMode = SendUserInputAsTone; break; case H323_DTMF_RFC2833: localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneRFC2833)); sendUserInputMode = SendUserInputAsInlineRFC2833; break; case H323_DTMF_Q931_KEYPAD: lastcap = localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::HookFlashH245)); lastcap++; lastcap = localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::BasicString)); lastcap++; lastcap = localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneH245)); lastcap++; localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneRFC2833)); sendUserInputMode = SendUserInputAsQ931; break; case H323_DTMF_H245_ALPHANUMERIC: lastcap = localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::HookFlashH245)); lastcap++; localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::BasicString)); sendUserInputMode = SendUserInputAsString; break; case H323_DTMF_H245_SIGNAL: localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneH245)); sendUserInputMode = SendUserInputAsTone; break; default: cout << "\tERROR: Invalid DTMF mode" << endl; break; } if (h323debug) { cout << "Allowed Codecs:\n\t" << setprecision(2) << localCapabilities << endl; } }
/** * Add capability to the capability table of the end point. */ int h323_set_capability(int cap, int dtmfMode) { H323Capabilities oldcaps; PStringArray codecs; int g711Frames = 30; int gsmFrames = 4; if (!h323_end_point_exist()) { cout << " ERROR: [h323_set_capablity] No Endpoint, this is bad" << endl; return 1; } /* clean up old capabilities list before changing */ oldcaps = endPoint->GetCapabilities(); for (PINDEX i=0; i< oldcaps.GetSize(); i++) { codecs.AppendString(oldcaps[i].GetFormatName()); } endPoint->RemoveCapabilities(codecs); mode = dtmfMode; if (dtmfMode == H323_DTMF_INBAND) { endPoint->SetSendUserInputMode(H323Connection::SendUserInputAsTone); } else { endPoint->SetSendUserInputMode(H323Connection::SendUserInputAsInlineRFC2833); } if (cap & AST_FORMAT_SPEEX) { /* Not real sure if Asterisk acutally supports all of the various different bit rates so add them all and figure it out later*/ endPoint->SetCapability(0, 0, new SpeexNarrow2AudioCapability()); endPoint->SetCapability(0, 0, new SpeexNarrow3AudioCapability()); endPoint->SetCapability(0, 0, new SpeexNarrow4AudioCapability()); endPoint->SetCapability(0, 0, new SpeexNarrow5AudioCapability()); endPoint->SetCapability(0, 0, new SpeexNarrow6AudioCapability()); } if (cap & AST_FORMAT_G729A) { AST_G729ACapability *g729aCap; AST_G729Capability *g729Cap; endPoint->SetCapability(0, 0, g729aCap = new AST_G729ACapability); endPoint->SetCapability(0, 0, g729Cap = new AST_G729Capability); } if (cap & AST_FORMAT_G723_1) { H323_G7231Capability *g7231Cap; endPoint->SetCapability(0, 0, g7231Cap = new H323_G7231Capability); } if (cap & AST_FORMAT_GSM) { H323_GSM0610Capability *gsmCap; endPoint->SetCapability(0, 0, gsmCap = new H323_GSM0610Capability); gsmCap->SetTxFramesInPacket(gsmFrames); } if (cap & AST_FORMAT_ULAW) { H323_G711Capability *g711uCap; endPoint->SetCapability(0, 0, g711uCap = new H323_G711Capability(H323_G711Capability::muLaw)); g711uCap->SetTxFramesInPacket(g711Frames); } if (cap & AST_FORMAT_ALAW) { H323_G711Capability *g711aCap; endPoint->SetCapability(0, 0, g711aCap = new H323_G711Capability(H323_G711Capability::ALaw)); g711aCap->SetTxFramesInPacket(g711Frames); } if (h323debug) { cout << "Allowed Codecs:\n\t" << setprecision(2) << endPoint->GetCapabilities() << endl; } return 0; }