mumsi/PjsuaCommunicator.hpp

152 lines
4.0 KiB
C++
Raw Normal View History

2015-11-03 02:13:15 +01:00
#pragma once
2015-11-09 00:51:51 +01:00
#include "IncomingConnectionValidator.hpp"
#include "AudioFramesMixer.hpp"
#include <pjmedia.h>
#include <pjsua-lib/pjsua.h>
2015-11-07 16:32:21 +01:00
#include <pjsua2.hpp>
#undef isblank
2015-11-04 01:22:59 +01:00
#include <log4cpp/Category.hh>
#include <boost/noncopyable.hpp>
#include <string>
#include <stdexcept>
2015-11-06 02:23:48 +01:00
#include <climits>
2015-11-07 16:32:21 +01:00
#include <bits/unique_ptr.h>
// for userState enum
#include <mumlib.hpp>
#include "main.hpp"
enum dtmf_modes_t {DTMF_MODE_UNAUTH, DTMF_MODE_ROOT, DTMF_MODE_STAR};
2015-10-16 22:41:37 +02:00
namespace sip {
2015-10-17 22:27:37 +02:00
constexpr int DEFAULT_PORT = 5060;
2015-10-16 22:41:37 +02:00
constexpr int SAMPLING_RATE = 48000;
constexpr int MAX_CALLER_PIN_LEN = 64;
constexpr int MAX_PIN_FAILS = 2;
2015-10-16 22:41:37 +02:00
class Exception : public std::runtime_error {
public:
2015-11-04 00:53:52 +01:00
Exception(const char *title) : std::runtime_error(title) {
mesg += title;
}
Exception(std::string title) : std::runtime_error(title) {
mesg += title;
}
2015-10-16 22:41:37 +02:00
Exception(const char *title, pj_status_t status) : std::runtime_error(title) {
char errorMsgBuffer[500];
pj_strerror(status, errorMsgBuffer, sizeof(errorMsgBuffer));
mesg += title;
mesg += ": ";
mesg += errorMsgBuffer;
}
virtual const char *what() const throw() override {
2015-10-16 22:41:37 +02:00
return mesg.c_str();
}
private:
std::string mesg;
};
2015-11-07 16:32:21 +01:00
class _LogWriter;
class _Account;
class _Call;
class _MumlibAudioMedia;
2015-10-16 22:41:37 +02:00
struct call {
unsigned index;
std::unique_ptr<mixer::AudioFramesMixer> mixer;
std::unique_ptr<sip::_MumlibAudioMedia> media;
pj_caching_pool cachingPool;
std::function<void(std::string)> onStateChange;
std::function<void(int16_t *, int)> onIncomingPcmSamples;
std::function<void(int)> onMuteDeafChange;
std::function<void(mumlib::UserState field, bool val)> sendUserState;
std::function<void(mumlib::UserState field, std::string val)> sendUserStateStr;
std::function<void()> onConnect;
std::function<void()> onDisconnect;
std::function<void()> onCallerAuth;
std::function<void()> joinAuthChannel;
std::function<void()> joinDefaultChannel;
};
class PjsuaCommunicator : boost::noncopyable {
public:
PjsuaCommunicator(IncomingConnectionValidator &validator, int frameTimeLength, int maxCalls);
2015-11-02 23:41:49 +01:00
void connect(
2015-09-29 02:26:45 +02:00
std::string host,
std::string user,
2015-10-17 22:27:37 +02:00
std::string password,
unsigned int port = DEFAULT_PORT);
virtual ~PjsuaCommunicator();
void sendPcmSamples(
int callId,
int sessionId,
int sequenceNumber,
int16_t *samples,
unsigned int length);
// config params we get from config.ini
std::string caller_pin;
std::string file_welcome;
std::string file_prompt_pin;
std::string file_entering_channel;
std::string file_announce_new_caller;
std::string file_invalid_pin;
std::string file_goodbye;
std::string file_mute_on;
std::string file_mute_off;
std::string file_menu;
// TODO: move these to private?
std::string got_dtmf;
dtmf_modes_t dtmf_mode = DTMF_MODE_ROOT;
int pin_fails = 0;
2015-11-06 02:23:48 +01:00
pj_status_t mediaPortGetFrame(pjmedia_port *port, pjmedia_frame *frame);
pj_status_t mediaPortPutFrame(pjmedia_port *port, pjmedia_frame *frame);
call calls[MY_MAX_CALLS];
private:
2015-10-16 22:41:37 +02:00
log4cpp::Category &logger;
2015-11-07 16:32:21 +01:00
log4cpp::Category &pjsuaLogger;
2015-10-16 22:41:37 +02:00
2015-11-07 16:32:21 +01:00
std::unique_ptr<_LogWriter> logWriter;
std::unique_ptr<_Account> account;
2015-10-16 22:41:37 +02:00
pj::Endpoint endpoint;
2015-10-16 22:41:37 +02:00
2015-11-09 00:51:51 +01:00
IncomingConnectionValidator &uriValidator;
2015-10-16 22:41:37 +02:00
void registerAccount(std::string host,
std::string user,
std::string password);
2015-11-07 16:32:21 +01:00
friend class _Call;
friend class _Account;
friend class _MumlibAudioMedia;
};
}