mirror of https://github.com/sipwise/sems.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.4 KiB
113 lines
2.4 KiB
|
|
#include "EarlyRecord.h"
|
|
|
|
#include "log.h"
|
|
#include "AmConfigReader.h"
|
|
#include "AmUtils.h"
|
|
#include "AmPlugIn.h"
|
|
|
|
#define MOD_NAME "early_record"
|
|
|
|
EXPORT_SESSION_FACTORY(EarlyRecordFactory,MOD_NAME);
|
|
|
|
string EarlyRecordFactory::RecordDir;
|
|
|
|
EarlyRecordFactory::EarlyRecordFactory(const string& _app_name)
|
|
: AmSessionFactory(_app_name)
|
|
{
|
|
}
|
|
|
|
int EarlyRecordFactory::onLoad()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
AmSession* EarlyRecordFactory::onInvite(const AmSipRequest& req, const string& app_name,
|
|
const map<string,string>& app_params)
|
|
{
|
|
return new EarlyRecordDialog(NULL);
|
|
}
|
|
|
|
// auth with di_dial
|
|
AmSession* EarlyRecordFactory::onInvite(const AmSipRequest& req, const string& app_name,
|
|
const AmArg& session_params)
|
|
{
|
|
UACAuthCred* cred = AmUACAuth::unpackCredentials(session_params);
|
|
|
|
AmSession* s = new EarlyRecordDialog(cred);
|
|
|
|
if (NULL == cred) {
|
|
WARN("discarding unknown session parameters.\n");
|
|
} else {
|
|
AmUACAuth::enable(s);
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
EarlyRecordDialog::EarlyRecordDialog(UACAuthCred* credentials)
|
|
: cred(credentials)
|
|
{
|
|
// this sets the session to run onEarlySessionStart
|
|
accept_early_session = true;
|
|
}
|
|
|
|
EarlyRecordDialog::~EarlyRecordDialog()
|
|
{
|
|
}
|
|
|
|
void EarlyRecordDialog::onEarlySessionStart() {
|
|
DBG("Early Session Start\n");
|
|
msg_filename = "/tmp/" + getLocalTag() + ".wav";
|
|
|
|
if(a_msg.open(msg_filename,AmAudioFile::Write,false))
|
|
throw string("EarlyRecordDialog: couldn't open ") +
|
|
msg_filename + string(" for writing");
|
|
|
|
setInput(&a_msg);
|
|
setMute(true);
|
|
|
|
AmSession::onEarlySessionStart();
|
|
}
|
|
|
|
void EarlyRecordDialog::onSessionStart()
|
|
{
|
|
setInOut(NULL, NULL);
|
|
|
|
a_msg.close();
|
|
|
|
// replay the recorded early media
|
|
msg_filename = "/tmp/" + getLocalTag() + ".wav";
|
|
|
|
if(a_msg.open(msg_filename,AmAudioFile::Read,false))
|
|
throw string("EarlyRecordDialog: couldn't open ") +
|
|
msg_filename + string(" for writing");
|
|
|
|
setOutput(&a_msg);
|
|
|
|
AmSession::onSessionStart();
|
|
}
|
|
|
|
void EarlyRecordDialog::onBye(const AmSipRequest& req)
|
|
{
|
|
DBG("onBye: stopSession\n");
|
|
setStopped();
|
|
}
|
|
|
|
void EarlyRecordDialog::process(AmEvent* event)
|
|
{
|
|
|
|
AmAudioEvent* audio_event = dynamic_cast<AmAudioEvent*>(event);
|
|
if(audio_event && (audio_event->event_id == AmAudioEvent::cleared)){
|
|
dlg->bye();
|
|
setStopped();
|
|
return;
|
|
}
|
|
|
|
AmSession::process(event);
|
|
}
|
|
|
|
inline UACAuthCred* EarlyRecordDialog::getCredentials() {
|
|
return cred.get();
|
|
}
|