Add text message call state info.
This commit is contained in:
parent
2771986f37
commit
058b8778cd
@ -44,3 +44,7 @@ void mumble::MumbleCommunicator::sendPcmSamples(int16_t *samples, unsigned int l
|
|||||||
mumble::MumbleCommunicator::~MumbleCommunicator() {
|
mumble::MumbleCommunicator::~MumbleCommunicator() {
|
||||||
mum->disconnect();
|
mum->disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mumble::MumbleCommunicator::sendTextMessage(std::string message) {
|
||||||
|
mum->sendTextMessage(message);
|
||||||
|
}
|
||||||
|
@ -32,6 +32,8 @@ namespace mumble {
|
|||||||
|
|
||||||
virtual void sendPcmSamples(int16_t *samples, unsigned int length);
|
virtual void sendPcmSamples(int16_t *samples, unsigned int length);
|
||||||
|
|
||||||
|
void sendTextMessage(std::string message);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
boost::asio::io_service &ioService;
|
boost::asio::io_service &ioService;
|
||||||
|
|
||||||
|
@ -3,13 +3,15 @@
|
|||||||
#include <pjlib.h>
|
#include <pjlib.h>
|
||||||
#include <pjsua-lib/pjsua.h>
|
#include <pjsua-lib/pjsua.h>
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is global, because there's no way to pass it's value to onCallMediaState callback.
|
* These are global, because there's no way to pass it's value to onCallMediaState callback.
|
||||||
*/
|
*/
|
||||||
static int mediaPortSlot;
|
static int mediaPortSlot;
|
||||||
|
static sip::PjsuaCommunicator *pjsuaCommunicator = nullptr;
|
||||||
|
|
||||||
static log4cpp::Category &pjLogger = log4cpp::Category::getInstance("PjSip");
|
static log4cpp::Category &pjLogger = log4cpp::Category::getInstance("PjSip");
|
||||||
|
|
||||||
@ -34,13 +36,19 @@ static void onIncomingCall(pjsua_acc_id acc_id,
|
|||||||
PJ_UNUSED_ARG(rdata);
|
PJ_UNUSED_ARG(rdata);
|
||||||
|
|
||||||
pjsua_call_get_info(call_id, &ci);
|
pjsua_call_get_info(call_id, &ci);
|
||||||
|
pjsua_call_set_user_data(call_id, pjsuaCommunicator);
|
||||||
|
|
||||||
pjLogger.notice("Incoming call from %s.", ci.remote_info.ptr);
|
pjLogger.info("Incoming call from %s.", ci.remote_info.ptr);
|
||||||
|
|
||||||
/* Automatically answer incoming calls with 200/OK */
|
/* Automatically answer incoming calls with 200/OK */
|
||||||
pjsua_call_answer(call_id, 200, NULL, NULL);
|
pjsua_call_answer(call_id, 200, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void onDtmfDigit(pjsua_call_id callId, int digit) {
|
||||||
|
|
||||||
|
pjLogger.notice("DTMF digit '%c' (call %d).", digit, callId);
|
||||||
|
}
|
||||||
|
|
||||||
static void onCallState(pjsua_call_id call_id,
|
static void onCallState(pjsua_call_id call_id,
|
||||||
pjsip_event *e) {
|
pjsip_event *e) {
|
||||||
pjsua_call_info ci;
|
pjsua_call_info ci;
|
||||||
@ -48,7 +56,23 @@ static void onCallState(pjsua_call_id call_id,
|
|||||||
PJ_UNUSED_ARG(e);
|
PJ_UNUSED_ARG(e);
|
||||||
|
|
||||||
pjsua_call_get_info(call_id, &ci);
|
pjsua_call_get_info(call_id, &ci);
|
||||||
pjLogger.notice("Call %d state=%s.", call_id, ci.state_text.ptr);
|
sip::PjsuaCommunicator *communicator
|
||||||
|
= reinterpret_cast<sip::PjsuaCommunicator *>(pjsua_call_get_user_data(call_id));
|
||||||
|
|
||||||
|
pjLogger.info("Call %d state=%s.", call_id, ci.state_text.ptr);
|
||||||
|
|
||||||
|
string address = string(ci.remote_info.ptr);
|
||||||
|
address = address.substr(5, address.size() - 5 - 1);
|
||||||
|
|
||||||
|
if (ci.state == PJSIP_INV_STATE_CONFIRMED) {
|
||||||
|
auto msgText = "Start call from " + address + ".";
|
||||||
|
pjLogger.notice(msgText);
|
||||||
|
communicator->onStateChange(msgText);
|
||||||
|
} else if (ci.state == PJSIP_INV_STATE_DISCONNECTED) {
|
||||||
|
auto msgText = "End call from " + address + ".";
|
||||||
|
pjLogger.notice(msgText);
|
||||||
|
communicator->onStateChange(msgText);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pjLogToLog4CppBridgeFunction(int level, const char *data, int len) {
|
static void pjLogToLog4CppBridgeFunction(int level, const char *data, int len) {
|
||||||
@ -74,6 +98,11 @@ sip::PjsuaCommunicator::PjsuaCommunicator()
|
|||||||
callbackLogger(log4cpp::Category::getInstance("SipCommunicatorCallback")) {
|
callbackLogger(log4cpp::Category::getInstance("SipCommunicatorCallback")) {
|
||||||
pj_status_t status;
|
pj_status_t status;
|
||||||
|
|
||||||
|
if (pjsuaCommunicator != nullptr) {
|
||||||
|
throw sip::Exception("this is a singleton class");
|
||||||
|
}
|
||||||
|
pjsuaCommunicator = this;
|
||||||
|
|
||||||
status = pjsua_create();
|
status = pjsua_create();
|
||||||
if (status != PJ_SUCCESS) {
|
if (status != PJ_SUCCESS) {
|
||||||
throw sip::Exception("Error in pjsua_create()", status);
|
throw sip::Exception("Error in pjsua_create()", status);
|
||||||
@ -90,6 +119,7 @@ sip::PjsuaCommunicator::PjsuaCommunicator()
|
|||||||
generalConfig.max_calls = 1;
|
generalConfig.max_calls = 1;
|
||||||
|
|
||||||
generalConfig.cb.on_incoming_call = &onIncomingCall;
|
generalConfig.cb.on_incoming_call = &onIncomingCall;
|
||||||
|
generalConfig.cb.on_dtmf_digit = &onDtmfDigit;
|
||||||
generalConfig.cb.on_call_media_state = &onCallMediaState;
|
generalConfig.cb.on_call_media_state = &onCallMediaState;
|
||||||
generalConfig.cb.on_call_state = &onCallState;
|
generalConfig.cb.on_call_state = &onCallState;
|
||||||
|
|
||||||
@ -161,7 +191,8 @@ pjmedia_port *sip::PjsuaCommunicator::createMediaPort() {
|
|||||||
SAMPLING_RATE,
|
SAMPLING_RATE,
|
||||||
1,
|
1,
|
||||||
16,
|
16,
|
||||||
SAMPLING_RATE * 20 / 1000); // todo recalculate to match mumble specs
|
SAMPLING_RATE * 20 /
|
||||||
|
1000); // todo recalculate to match mumble specs
|
||||||
|
|
||||||
if (status != PJ_SUCCESS) {
|
if (status != PJ_SUCCESS) {
|
||||||
throw sip::Exception("error while calling pjmedia_port_info_init().", status);
|
throw sip::Exception("error while calling pjmedia_port_info_init().", status);
|
||||||
@ -254,13 +285,6 @@ void sip::PjsuaCommunicator::registerAccount(string host, string user, string pa
|
|||||||
accConfig.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
|
accConfig.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
|
||||||
accConfig.cred_info[0].data = toPjString(password);
|
accConfig.cred_info[0].data = toPjString(password);
|
||||||
|
|
||||||
logger.error("id:%s", accConfig.id.ptr);
|
|
||||||
logger.error("reg_uri:%s", accConfig.reg_uri.ptr);
|
|
||||||
logger.error("realm:%s", accConfig.cred_info[0].realm.ptr);
|
|
||||||
logger.error("scheme:%s", accConfig.cred_info[0].scheme.ptr);
|
|
||||||
logger.error("username:%s", accConfig.cred_info[0].username.ptr);
|
|
||||||
logger.error("data:%s", accConfig.cred_info[0].data.ptr);
|
|
||||||
|
|
||||||
pjsua_acc_id acc_id;
|
pjsua_acc_id acc_id;
|
||||||
|
|
||||||
status = pjsua_acc_add(&accConfig, PJ_TRUE, &acc_id);
|
status = pjsua_acc_add(&accConfig, PJ_TRUE, &acc_id);
|
||||||
|
@ -18,6 +18,10 @@ namespace sip {
|
|||||||
|
|
||||||
class Exception : public std::runtime_error {
|
class Exception : public std::runtime_error {
|
||||||
public:
|
public:
|
||||||
|
Exception(const char *title) : std::runtime_error(title) {
|
||||||
|
mesg += title;
|
||||||
|
}
|
||||||
|
|
||||||
Exception(const char *title, pj_status_t status) : std::runtime_error(title) {
|
Exception(const char *title, pj_status_t status) : std::runtime_error(title) {
|
||||||
char errorMsgBuffer[500];
|
char errorMsgBuffer[500];
|
||||||
pj_strerror(status, errorMsgBuffer, sizeof(errorMsgBuffer));
|
pj_strerror(status, errorMsgBuffer, sizeof(errorMsgBuffer));
|
||||||
@ -57,6 +61,8 @@ namespace sip {
|
|||||||
|
|
||||||
virtual void sendPcmSamples(int16_t *samples, unsigned int length);
|
virtual void sendPcmSamples(int16_t *samples, unsigned int length);
|
||||||
|
|
||||||
|
std::function<void(std::string)> onStateChange;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
log4cpp::Category &logger;
|
log4cpp::Category &logger;
|
||||||
log4cpp::Category &callbackLogger;
|
log4cpp::Category &callbackLogger;
|
||||||
|
6
main.cpp
6
main.cpp
@ -12,7 +12,7 @@ int main(int argc, char *argv[]) {
|
|||||||
log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout);
|
log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout);
|
||||||
appender1->setLayout(new log4cpp::BasicLayout());
|
appender1->setLayout(new log4cpp::BasicLayout());
|
||||||
log4cpp::Category &logger = log4cpp::Category::getRoot();
|
log4cpp::Category &logger = log4cpp::Category::getRoot();
|
||||||
logger.setPriority(log4cpp::Priority::DEBUG);
|
logger.setPriority(log4cpp::Priority::NOTICE);
|
||||||
logger.addAppender(appender1);
|
logger.addAppender(appender1);
|
||||||
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
@ -34,6 +34,10 @@ int main(int argc, char *argv[]) {
|
|||||||
&mumbleCommunicator,
|
&mumbleCommunicator,
|
||||||
_1, _2);
|
_1, _2);
|
||||||
|
|
||||||
|
pjsuaCommunicator.onStateChange = std::bind(
|
||||||
|
&mumble::MumbleCommunicator::sendTextMessage,
|
||||||
|
&mumbleCommunicator, _1);
|
||||||
|
|
||||||
mumbleCommunicator.onIncomingPcmSamples = std::bind(
|
mumbleCommunicator.onIncomingPcmSamples = std::bind(
|
||||||
&sip::PjsuaCommunicator::sendPcmSamples,
|
&sip::PjsuaCommunicator::sendPcmSamples,
|
||||||
&pjsuaCommunicator,
|
&pjsuaCommunicator,
|
||||||
|
Loading…
Reference in New Issue
Block a user