mirror of https://github.com/sipwise/sems.git
git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@292 8eb893ce-cfd4-0310-b710-fb5ebe64c474sayer/1.4-spce2.6
parent
210b5105b1
commit
65270dfd75
@ -0,0 +1,8 @@
|
||||
|
||||
This directory contains examples that illustrate how to
|
||||
make use certain aspects of the SEMS framework rather than
|
||||
be complete ready-to-use applications. The examples given
|
||||
here can be a good start for further development, though.
|
||||
|
||||
In each directory you will find a separate Readme file describing
|
||||
the purpose of the example.
|
||||
@ -0,0 +1,183 @@
|
||||
/*
|
||||
* $Id: Announcement.cpp 145 2006-11-26 00:01:18Z sayer $
|
||||
*
|
||||
* Copyright (C) 2006 iptego GmbH
|
||||
*
|
||||
* This file is part of sems, a free SIP media server.
|
||||
*
|
||||
* sems is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* For a license to use the sems software under conditions
|
||||
* other than those described here, or to purchase support for this
|
||||
* software, please contact iptel.org by e-mail at the following addresses:
|
||||
* info@iptel.org
|
||||
*
|
||||
* sems is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "Jukecall.h"
|
||||
#include "AmApi.h"
|
||||
#include "AmUtils.h"
|
||||
#include "sems.h"
|
||||
#include "log.h"
|
||||
|
||||
#define MOD_NAME "jukecall"
|
||||
|
||||
EXPORT_SESSION_FACTORY(JukecallFactory,MOD_NAME);
|
||||
|
||||
// you can replace this with configurable file
|
||||
#define INITIAL_ANNOUNCEMENT "../apps/examples/jukecall/wav/greeting.wav"
|
||||
#define JUKE_DIR "../apps/examples/jukecall/wav/"
|
||||
|
||||
JukecallFactory::JukecallFactory(const string& _app_name)
|
||||
: AmSessionFactory(_app_name)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int JukecallFactory::onLoad()
|
||||
{
|
||||
// read configuration
|
||||
|
||||
DBG("JukecallFactory loaded.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
AmSession* JukecallFactory::onInvite(const AmSipRequest& req)
|
||||
{
|
||||
if (req.user.length() <= 3) {
|
||||
throw AmSession::Exception(403, "Need a number to call");
|
||||
}
|
||||
|
||||
JukecallSession* dlg = new JukecallSession();
|
||||
|
||||
return dlg;
|
||||
}
|
||||
|
||||
JukecallSession::JukecallSession()
|
||||
: AmB2ABCallerSession()
|
||||
{
|
||||
}
|
||||
|
||||
JukecallSession::~JukecallSession()
|
||||
{
|
||||
}
|
||||
|
||||
void JukecallSession::onSessionStart(const AmSipRequest& req)
|
||||
{
|
||||
DBG("-----------------------------------------------------------------\n");
|
||||
DBG("playing file\n");
|
||||
|
||||
if(initial_announcement.open(INITIAL_ANNOUNCEMENT,AmAudioFile::Read)) {
|
||||
dlg.bye();
|
||||
throw string("CTConfDDialog::onSessionStart: Cannot open file '%s'\n", INITIAL_ANNOUNCEMENT);
|
||||
}
|
||||
|
||||
// set this as our output
|
||||
setOutput(&initial_announcement);
|
||||
|
||||
state = JC_initial_announcement;
|
||||
}
|
||||
|
||||
void JukecallSession::onDtmf(int event, int duration_msec) {
|
||||
DBG("got DTMF %d\n", event);
|
||||
|
||||
// no jukebox if other party is not connected
|
||||
if (getCalleeStatus()!=AmB2ABCallerSession::Connected)
|
||||
return;
|
||||
|
||||
// no jukebox in the beginning and while playing
|
||||
if (state != JC_connect)
|
||||
return;
|
||||
|
||||
DBG("playing back file...\n");
|
||||
|
||||
song.reset(new AmAudioFile());
|
||||
if (song->open(JUKE_DIR+int2str(event)+".wav",AmAudioFile::Read)) {
|
||||
ERROR("could not open file\n");
|
||||
return;
|
||||
}
|
||||
setOutput(song.get());
|
||||
state = JC_juke;
|
||||
|
||||
relayEvent(new JukeEvent(event));
|
||||
}
|
||||
|
||||
void JukecallSession::process(AmEvent* event)
|
||||
{
|
||||
|
||||
AmAudioEvent* audio_event = dynamic_cast<AmAudioEvent*>(event);
|
||||
if(audio_event && (audio_event->event_id == AmAudioEvent::cleared)){
|
||||
switch(state) {
|
||||
case JC_initial_announcement: {
|
||||
state = JC_connect;
|
||||
string callee = "sip:" + dlg.user.substr(3) + "@" + dlg.domain;
|
||||
DBG("-------------------------- connecting %s ------------------------\n", callee.c_str());
|
||||
connectCallee(callee, callee,
|
||||
dlg.remote_party, dlg.remote_uri);
|
||||
|
||||
return;
|
||||
|
||||
} break;
|
||||
|
||||
case JC_juke: {
|
||||
DBG("reconnecting audio\n");
|
||||
reconnectAudio();
|
||||
state = JC_connect;
|
||||
return;
|
||||
}; break;
|
||||
|
||||
default: {
|
||||
DBG("cleared in other state.\n");
|
||||
return;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
AmB2ABCallerSession::process(event);
|
||||
}
|
||||
|
||||
AmB2ABCalleeSession* JukecallSession::createCalleeSession() {
|
||||
AmB2ABCalleeSession* sess = new JukecalleeSession(getLocalTag());
|
||||
return sess;
|
||||
}
|
||||
|
||||
JukecalleeSession::JukecalleeSession(const string& other_tag)
|
||||
: AmB2ABCalleeSession(other_tag)
|
||||
{
|
||||
setDtmfDetectionEnabled(false);
|
||||
}
|
||||
|
||||
|
||||
void JukecalleeSession::process(AmEvent* event) {
|
||||
JukeEvent* juke_event = dynamic_cast<JukeEvent*>(event);
|
||||
if(juke_event) {
|
||||
song.reset(new AmAudioFile());
|
||||
if (song->open(JUKE_DIR+int2str(event->event_id)+".wav",AmAudioFile::Read)) {
|
||||
ERROR("could not open file\n");
|
||||
return;
|
||||
}
|
||||
setOutput(song.get());
|
||||
return;
|
||||
}
|
||||
|
||||
AmAudioEvent* audio_event = dynamic_cast<AmAudioEvent*>(event);
|
||||
if(audio_event && (audio_event->event_id == AmAudioEvent::cleared)){
|
||||
DBG("reconnecting audio\n");
|
||||
reconnectAudio();
|
||||
return;
|
||||
}
|
||||
|
||||
AmB2ABCalleeSession::process(event);
|
||||
}
|
||||
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* $Id: CTConfD.h 145 2006-11-26 00:01:18Z sayer $
|
||||
*
|
||||
* Copyright (C) 2006 ipteo GmbH
|
||||
*
|
||||
* This file is part of sems, a free SIP media server.
|
||||
*
|
||||
* sems is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* For a license to use the sems software under conditions
|
||||
* other than those described here, or to purchase support for this
|
||||
* software, please contact iptel.org by e-mail at the following addresses:
|
||||
* info@iptel.org
|
||||
*
|
||||
* sems is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _JUKECALL_H_
|
||||
#define _JUKECALL_H_
|
||||
|
||||
#include "AmB2ABSession.h"
|
||||
#include "AmConfigReader.h"
|
||||
#include "AmApi.h"
|
||||
|
||||
#include <string>
|
||||
using std::string;
|
||||
|
||||
class JukecallFactory: public AmSessionFactory
|
||||
{
|
||||
public:
|
||||
JukecallFactory(const string& _app_name);
|
||||
|
||||
int onLoad();
|
||||
|
||||
AmSession* onInvite(const AmSipRequest& req);
|
||||
};
|
||||
|
||||
class JukecallSession
|
||||
: public AmB2ABCallerSession
|
||||
{
|
||||
|
||||
public:
|
||||
enum JukeLeg1_state {
|
||||
JC_initial_announcement = 0,
|
||||
JC_connect,
|
||||
JC_juke
|
||||
};
|
||||
|
||||
private:
|
||||
// our state
|
||||
JukeLeg1_state state;
|
||||
AmAudioFile initial_announcement;
|
||||
|
||||
auto_ptr<AmAudioFile> song;
|
||||
|
||||
protected:
|
||||
AmB2ABCalleeSession* createCalleeSession();
|
||||
|
||||
public:
|
||||
|
||||
JukecallSession();
|
||||
~JukecallSession();
|
||||
|
||||
void onSessionStart(const AmSipRequest& req);
|
||||
void process(AmEvent* event);
|
||||
|
||||
void onDtmf(int event, int duration_msec);
|
||||
};
|
||||
|
||||
class JukecalleeSession
|
||||
: public AmB2ABCalleeSession {
|
||||
|
||||
void process(AmEvent* event);
|
||||
auto_ptr<AmAudioFile> song;
|
||||
|
||||
public:
|
||||
JukecalleeSession(const string& other_tag);
|
||||
};
|
||||
|
||||
class JukeEvent : public AmEvent {
|
||||
public:
|
||||
JukeEvent(int key)
|
||||
: AmEvent(key) {}
|
||||
};
|
||||
|
||||
#endif
|
||||
// Local Variables:
|
||||
// mode:C++
|
||||
// End:
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
|
||||
plug_in_name = jukecall
|
||||
|
||||
module_ldflags =
|
||||
module_cflags =
|
||||
|
||||
module_extra_objs =
|
||||
extra_install = jukecall_audio
|
||||
|
||||
extra_clean =
|
||||
|
||||
COREPATH ?=../../../core
|
||||
include $(COREPATH)/plug-in/Makefile.app_module
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
Jukecall
|
||||
|
||||
This is an example of how to use the B2ABSession - a kind of
|
||||
b2bua where SEMS stays in the media path, or media relay.
|
||||
|
||||
Because SEMS stays in the path, its possible to react e.g.
|
||||
on DTMF while in the call - and the jukecall example does
|
||||
just this:
|
||||
First it plays a welcome message to the caller, then it
|
||||
connects to the originally dialled number stripped by the
|
||||
first three digits. When the two parties are connected,
|
||||
the first one can play some files into the call by pressing
|
||||
the keys on the phone.
|
||||
|
||||
for example:
|
||||
|
||||
123@example.org SEMS jukecall 456@example.org
|
||||
|
||||
| INVITE sip:500456 | |
|
||||
+---------------------->| |
|
||||
| 200 OK | |
|
||||
|<----------------------| |
|
||||
| | |
|
||||
| play greeting.wav | |
|
||||
|<======================| |
|
||||
| | |
|
||||
| | |
|
||||
| | INVITE sip:456 |
|
||||
| +---------------------->|
|
||||
| | 200 OK |
|
||||
| |<----------------------|
|
||||
| | |
|
||||
| | |
|
||||
| connected through relay |
|
||||
|<=====================>|<=====================>|
|
||||
| | |
|
||||
| DTMF 1 | |
|
||||
|-=-=-=-=-=-=-=-=-=-=-=>| |
|
||||
| | |
|
||||
| play 1.wav | play 1.wav |
|
||||
|<======================|======================>|
|
||||
| | |
|
||||
| connected through relay |
|
||||
|<=====================>|<=====================>|
|
||||
| | |
|
||||
| DTMF 3 | |
|
||||
|-=-=-=-=-=-=-=-=-=-=-=>| |
|
||||
| | |
|
||||
| play 3.wav | play 3.wav |
|
||||
|<======================|======================>|
|
||||
| | |
|
||||
|
||||
aso.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue