2

I'm new to Freeswitch and looking for help from experts. My problem is below.

I'm trying to do below scenario in Perl:

When I'm getting an incoming call to script (test.pl) I play a file to it and then put inbound session to on-hold. Then I try to make new outbound session from a separate script (test2.pl). If outbound call get answer, then I break inbound session from on-hold and bridge both sessions. The scrips are like below.

test.pl

use strict;
use warnings;

our $session;

if( $session->ready() ) {
    $session->setVariable( 'hangup_after_bridge', 'false' );
    $session->setVariable( 'continue_on_fail', 'true' );
    $session->answer();

    my $api = new freeswitch::API;
    $api->execute('perlrun', '/usr/share/freeswitch/scripts/test2.pl ' . $session->get_uuid());
    $session->setVariable('playback_timeout_sec', '70');
    $session->execute("playback", '$${hold_music}');

    if ($session->getVariable('outbound_answered') == 'true') {
        my $outbound_uuid = $session->getVariable('outbound_uuid');
        my $outbound_session = new freeswitch::Session($outbound_uuid);

        if ($outbound_session->ready()) {
            $session->bridge($outbound_session);
        } else {
            # outbound session disconnected.
        }
    }  else {
        # outbound session didn't answer.
    }
} else {
    # Inbound disconneected.
}
1;

test2.pl

use strict;
use warnings;

my $api = new freeswitch::API;
my $inbound_uuid = $ARGV[0];
my $inbound_session = new freeswitch::Session( $inbound_uuid );

my $originate_str = "sofia/gateway/outbound/0416661666";
my $outbound_session = new freeswitch::Session( $originate_str );
my $hangup_cause_out = $outbound_session->hangupCause();
$inbound_session->setVariable( 'outbound_uuid', $outbound_session->get_uuid() );

if ( $outbound_session->ready() ) {
    if ( $inbound_session->ready() ) {
        $inbound_session->setVariable('outbound_answered', 'true');
        $outbound_session->streamFile("/usr/share/freeswitch/sounds/en/us/callie/ivr/8000/ivr-please_hold_while_party_contacted.wav");
        $inbound_session->execute('break');
        while ($inbound_session->ready()) {
            sleep(10);
            # Inbound sessnio ok, continue outbound session.
        }
    } else {
        # Inbound session got disconnected while we trying outbound.
    }
} else {
    # Outbound call failed.
}
1;

Debian syslog:

Jul 19 13:14:50 XXX systemd[1]: freeswitch.service: Main process exited, code=killed, status=6/ABRT
Jul 19 13:14:50 XXX systemd[1]: freeswitch.service: Unit entered failed state.
Jul 19 13:14:50 XXX systemd[1]: freeswitch.service: Failed with result 'signal'.
Jul 19 13:14:50 XXX systemd[1]: freeswitch.service: Service hold-off time over, scheduling restart.
Jul 19 13:14:50 XXX systemd[1]: Stopped freeswitch.
Jul 19 13:14:50 XXX systemd[1]: Starting freeswitch...

The expected scenario work without issues. But my issue is Freeswitch getting restart when inbound session hangup by incoming call party while Freeswitch ringing outbound party.

UPDATE1: I think I need to handle inbound session hangup event but kinda lost here. May be I'm doing all wrong.

UPDATE2: I been seen this issue in Freeswitch 1.8.7. I tried testing the same code in Freeswitch 1.6.20 and it didn't crash, but gave below error, [ERR] freeswitch_perl.cpp:114 session is not initalized So it seems Freeswitch 1.8 mod_perl module not handling it properly.

Looking for suggestions from Freeswitch experts.

Thank you!

Yasiru G
  • 6,886
  • 6
  • 23
  • 43

0 Answers0