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;
	}
}
Exemple #2
0
/**
 * 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;
}