Hold, Re-Invite and Conference

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



(... re-posting, the original post doesn't seem to have made it into the list - my apologies, in case of a double-posting)

Hi Benny,

thanks for your response and your hint! 

> Hence, you should do connect call's media in on_call_media_state()
> callback instead.


Following this suggestion (as I understood it), I spent the past days shifting things around to achieve the desired result 
- unfortunately, with no success. 
Here is the condensed essence (proof-of-concept model) of the current implementation.

// some initialized globals ...
bool mergeCalls = false;
pjsua_call_id activeCallID		= -1;
pjsua_call_id holdingCallID	= -1;

// the GUI calls "mergeCallButtonPressed()", while "holdingCallID" had been "pjsua_call_set_hold(holdingCallID, NULL)" and  "activeCallID" is actually talking:
void mergeCallButtonPressed()
{
	mergeCalls = true;
	pjsua_call_reinvite(holdingCallID, PJ_TRUE, NULL);
}

// pjsua_call_reinvite then triggers:
void on_call_media_state(pjsua_call_id callID)
{
	pjsua_call_info callInfo;
	pjsua_call_get_info(callID, &callInfo);

	if (callInfo.media_status == PJSUA_CALL_MEDIA_ACTIVE) { //	When media is active, connect call to sound device.
		pjsua_conf_port_id slotOne = callInfo.conf_slot;
		pjsua_conf_connect(slotOne, 0);
		pjsua_conf_connect(0, slotOne);

		if (mergeCalls == true) {
			pjsua_conf_port_id slotTwo = pjsua_call_get_conf_port(activeCallID);
			pjsua_conf_connect(slotOne, slotTwo);
			pjsua_conf_connect(slotTwo, slotOne);
			
			// since the "activeCallID" is already  talking, its conf_port is already connected to "0" (and vice versa) ...

		} else {
			activeCallID = callID;
		}
	} else if (callInfo.media_status == PJSUA_CALL_MEDIA_LOCAL_HOLD) {
		// ? callSuspended(callID);
	}
}

While both remote-parties (activeCallID and holdingCallID) can listen and speak to port "0", they can neither listen nor speak to each other.

What am I missing/misunderstanding?

Again, thank you very much in advance for your help!

Best regards,

Thomas


On Oct 6, 2011, at 4:55 , Benny Prijono wrote:

> On Sat, Oct 1, 2011 at 5:46 PM, Thomas Martin <tmemail at gmx.de> wrote:
>> Hello Everybody,
>> 
>> I am trying to implement a 3-party-conference by connecting the mediastreams as follows:
>> 
>> void mergeCalls(int callOne, int callTwo) {
>> 
>>       // make sure that both calls are off-hold
>>       pjsua_call_reinvite(callOne, PJ_TRUE, NULL);
>>       pjsua_call_reinvite(callTwo, PJ_TRUE, NULL);
>> 
>>       // obtaining the media-slots
>>       pjsua_conf_port_id slotOne = pjsua_call_get_conf_port(callOne);
>>       pjsua_conf_port_id slotTwo = pjsua_call_get_conf_port(callTwo);
>> 
>>       // connecting everybody
>>       pjsua_conf_connect(0, slotOne);
>>       pjsua_conf_connect(slotOne, 0);
>> 
>>       pjsua_conf_connect(0, slotTwo);
>>       pjsua_conf_connect(slotTwo, 0);
>> 
>>       pjsua_conf_connect(slotOne, slotTwo);
>>       pjsua_conf_connect(slotTwo, slotOne);
>> }
>> 
> 
> The pjsua_conf_connect() above may not be useful, depending on what
> pjsua_call_reinvite() does. If the re-INVITE recreates the media
> stream (and most likely it does), your conf connection will be lost,
> so the pjsua_conf_connect() instructions above are useless.
> 
> Hence, you should do connect call's media in on_call_media_state()
> callback instead.
> 
> Benny
> 
> 
> 
>> "mergeCalls()" is called, while two calls are connected and either callOne or callTwo is "holding" (as in "pjsua_call_set_hold(callID, NULL)").
>> 
>> Even though the above code might be a bit of "overkill" (inefficient) with respect to re-inviting both calls and (re-)connecting both calls to "slot 0", this should not really be harmful.
>> 
>> The Log states:
>> 
>> 12:07:34.115   conference.c  Port 3 (sip:12345 at provider.com;user=phone) transmitting to port 0 (iPhone IO device)
>> 12:07:34.115   conference.c  Port 0 (iPhone IO device) transmitting to port 3 (sip:12345 at provider.com;user=phone)
>> 
>> 12:07:37.677   conference.c  Port 4 (sip:54321 at provider.com) transmitting to port 0 (iPhone IO device)
>> 12:07:37.677   conference.c  Port 0 (iPhone IO device) transmitting to port 4 (sip:54321 at provider.com)
>> 
>> 12:07:37.736   conference.c  Port 4 (sip:54321 at provider.com) transmitting to port 3 (sip:12345 at provider.com;user=phone)
>> 12:07:37.736   conference.c  Port 3 (sip:12345 at provider.com;user=phone) transmitting to port 4 (sip:54321 at provider.com)
>> 
>> However, the mediastreams do not seem to get merged:
>> 
>> Port 0 can listen and talk to both, Port 3 and Port 4
>> but:
>> Port 3 can listen and talk to Port 0 but NOT to Port 4
>> Port 4 can listen and talk to Port 0 but NOT to Port 3
>> 
>> (Port 3 seems to be able to hear Port 4 for a fraction of a second)
>> 
>> Somewhere, I had read about complications regarding re-pjsua_call_set_hold() and pjsua_call_reinvite() but I can't find the reference anymore.
>> 
>> Any hints are greatly appreciated!
>> 
>> Thank you very much in advance.
>> 
>> Best Regards,
>> 
>> Thomas
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> Visit our blog: http://blog.pjsip.org
>> 
>> pjsip mailing list
>> pjsip at lists.pjsip.org
>> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>> 
> 
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
> 
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org




[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux