Clean up project.
This commit is contained in:
parent
0189d0f8ac
commit
d4a01348e0
@ -9,12 +9,9 @@ find_package(PkgConfig REQUIRED)
|
|||||||
|
|
||||||
pkg_check_modules(PJSIP "libpjproject")
|
pkg_check_modules(PJSIP "libpjproject")
|
||||||
pkg_check_modules(LOG4CPP "log4cpp")
|
pkg_check_modules(LOG4CPP "log4cpp")
|
||||||
pkg_check_modules(SNDFILE "sndfile")
|
|
||||||
|
|
||||||
|
|
||||||
include_directories(${PJSIP_INCLUDE_DIRS})
|
include_directories(${PJSIP_INCLUDE_DIRS})
|
||||||
include_directories(${LOG4CPP_INCLUDE_DIRS})
|
include_directories(${LOG4CPP_INCLUDE_DIRS})
|
||||||
include_directories(${SNDFILE_INCLUDE_DIRS})
|
|
||||||
include_directories(../mumlib/include)
|
include_directories(../mumlib/include)
|
||||||
|
|
||||||
link_directories(../mumlib/build)
|
link_directories(../mumlib/build)
|
||||||
@ -24,7 +21,7 @@ set(SOURCE_FILES
|
|||||||
PjsuaCommunicator.hpp
|
PjsuaCommunicator.hpp
|
||||||
MumbleCommunicator.cpp
|
MumbleCommunicator.cpp
|
||||||
MumbleCommunicator.hpp
|
MumbleCommunicator.hpp
|
||||||
ISamplesBuffer.hpp
|
ICommunicator.hpp
|
||||||
Configuration.cpp
|
Configuration.cpp
|
||||||
Configuration.hpp)
|
Configuration.hpp)
|
||||||
|
|
||||||
@ -33,10 +30,8 @@ set(SOURCE_FILES
|
|||||||
#)
|
#)
|
||||||
|
|
||||||
add_executable(mumsi ${SOURCE_FILES} main.cpp)
|
add_executable(mumsi ${SOURCE_FILES} main.cpp)
|
||||||
target_link_libraries(mumsi ${OPUS_LIBRARIES})
|
|
||||||
target_link_libraries(mumsi ${PJSIP_LIBRARIES})
|
target_link_libraries(mumsi ${PJSIP_LIBRARIES})
|
||||||
target_link_libraries(mumsi ${LOG4CPP_LIBRARIES})
|
target_link_libraries(mumsi ${LOG4CPP_LIBRARIES})
|
||||||
target_link_libraries(mumsi ${SNDFILE_LIBRARIES})
|
|
||||||
target_link_libraries(mumsi ${Boost_LIBRARIES})
|
target_link_libraries(mumsi ${Boost_LIBRARIES})
|
||||||
target_link_libraries(mumsi mumlib)
|
target_link_libraries(mumsi mumlib)
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#ifndef CONFIGURATION_HPP_
|
#pragma once
|
||||||
#define CONFIGURATION_HPP_
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
@ -35,5 +34,3 @@ namespace config {
|
|||||||
ConfigurationImpl *impl;
|
ConfigurationImpl *impl;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIGURATION_HPP_ */
|
|
||||||
|
17
ICommunicator.hpp
Normal file
17
ICommunicator.hpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
class ICommunicator {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Send samples through the Communicator.
|
||||||
|
*/
|
||||||
|
virtual void sendPcmSamples(int16_t *samples, unsigned int length) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This callback is called when Communicator has received samples.
|
||||||
|
*/
|
||||||
|
std::function<void(int16_t *, int)> onIncomingPcmSamples;
|
||||||
|
};
|
@ -1,14 +0,0 @@
|
|||||||
#ifndef MUMSI_ISAMPLESBUFFER_HPP
|
|
||||||
#define MUMSI_ISAMPLESBUFFER_HPP
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
class ISamplesBuffer {
|
|
||||||
public:
|
|
||||||
virtual void pushSamples(int16_t *samples, unsigned int length) = 0;
|
|
||||||
|
|
||||||
// virtual unsigned int pullSamples(int16_t *samples, unsigned int length, bool waitWhenEmpty) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //MUMSI_ISAMPLESBUFFER_HPP
|
|
@ -12,22 +12,21 @@ namespace mumble {
|
|||||||
virtual void audio(
|
virtual void audio(
|
||||||
int16_t *pcm_data,
|
int16_t *pcm_data,
|
||||||
uint32_t pcm_data_size) {
|
uint32_t pcm_data_size) {
|
||||||
communicator->samplesBuffer.pushSamples(pcm_data, pcm_data_size);
|
communicator->onIncomingPcmSamples(pcm_data, pcm_data_size);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
mumble::MumbleCommunicator::MumbleCommunicator(
|
mumble::MumbleCommunicator::MumbleCommunicator(boost::asio::io_service &ioService)
|
||||||
boost::asio::io_service &ioService,
|
: ioService(ioService),
|
||||||
ISamplesBuffer &samplesBuffer,
|
logger(log4cpp::Category::getInstance("MumbleCommunicator")) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void mumble::MumbleCommunicator::connect(
|
||||||
std::string user,
|
std::string user,
|
||||||
std::string password,
|
std::string password,
|
||||||
std::string host,
|
std::string host,
|
||||||
int port) : ioService(ioService),
|
int port) {
|
||||||
samplesBuffer(samplesBuffer),
|
|
||||||
logger(log4cpp::Category::getInstance("MumbleCommunicator")) {
|
|
||||||
|
|
||||||
quit = false;
|
|
||||||
|
|
||||||
callback.reset(new MumlibCallback());
|
callback.reset(new MumlibCallback());
|
||||||
|
|
||||||
@ -38,7 +37,7 @@ mumble::MumbleCommunicator::MumbleCommunicator(
|
|||||||
mum->connect(host, port, user, password);
|
mum->connect(host, port, user, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mumble::MumbleCommunicator::sendAudioFrame(int16_t *samples, int length) {
|
void mumble::MumbleCommunicator::sendPcmSamples(int16_t *samples, unsigned int length) {
|
||||||
mum->sendAudioData(samples, length);
|
mum->sendAudioData(samples, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
#ifndef MUMSI_MUMBLECOMMUNICATOR_HPP
|
#pragma once
|
||||||
#define MUMSI_MUMBLECOMMUNICATOR_HPP
|
|
||||||
|
#include "ICommunicator.hpp"
|
||||||
|
|
||||||
#include "ISamplesBuffer.hpp"
|
|
||||||
#include <mumlib.hpp>
|
#include <mumlib.hpp>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <log4cpp/Category.hh>
|
#include <log4cpp/Category.hh>
|
||||||
#include <sndfile.hh>
|
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
namespace mumble {
|
namespace mumble {
|
||||||
|
|
||||||
@ -19,11 +17,12 @@ namespace mumble {
|
|||||||
|
|
||||||
class MumlibCallback;
|
class MumlibCallback;
|
||||||
|
|
||||||
class MumbleCommunicator {
|
class MumbleCommunicator : public ICommunicator {
|
||||||
public:
|
public:
|
||||||
MumbleCommunicator(
|
MumbleCommunicator(
|
||||||
boost::asio::io_service &ioService,
|
boost::asio::io_service &ioService);
|
||||||
ISamplesBuffer &samplesBuffer,
|
|
||||||
|
void connect(
|
||||||
std::string user,
|
std::string user,
|
||||||
std::string password,
|
std::string password,
|
||||||
std::string host,
|
std::string host,
|
||||||
@ -31,31 +30,17 @@ namespace mumble {
|
|||||||
|
|
||||||
~MumbleCommunicator();
|
~MumbleCommunicator();
|
||||||
|
|
||||||
// void senderThreadFunction();
|
virtual void sendPcmSamples(int16_t *samples, unsigned int length);
|
||||||
|
|
||||||
//void receiveAudioFrameCallback(uint8_t *audio_data, uint32_t audio_data_size);
|
|
||||||
|
|
||||||
void sendAudioFrame(int16_t *samples, int length);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
boost::asio::io_service &ioService;
|
boost::asio::io_service &ioService;
|
||||||
|
|
||||||
log4cpp::Category &logger;
|
log4cpp::Category &logger;
|
||||||
|
|
||||||
ISamplesBuffer &samplesBuffer;
|
|
||||||
|
|
||||||
std::shared_ptr<mumlib::Mumlib> mum;
|
std::shared_ptr<mumlib::Mumlib> mum;
|
||||||
|
|
||||||
std::unique_ptr<std::thread> senderThread;
|
|
||||||
|
|
||||||
SndfileHandle fileHandle;
|
|
||||||
|
|
||||||
std::unique_ptr<MumlibCallback> callback;
|
std::unique_ptr<MumlibCallback> callback;
|
||||||
|
|
||||||
bool quit;
|
|
||||||
|
|
||||||
friend class MumlibCallback;
|
friend class MumlibCallback;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //MUMSI_MUMBLECOMMUNICATOR_HPP
|
|
||||||
|
@ -3,22 +3,17 @@
|
|||||||
|
|
||||||
#include <pjlib.h>
|
#include <pjlib.h>
|
||||||
#include <pjsua-lib/pjsua.h>
|
#include <pjsua-lib/pjsua.h>
|
||||||
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
//todo wywalić
|
|
||||||
#define THIS_FILE "mumsi"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is global, because there's no way to pass it's value to onCallMediaState callback.
|
* This is global, because there's no way to pass it's value to onCallMediaState callback.
|
||||||
*/
|
*/
|
||||||
static int mediaPortSlot;
|
static int mediaPortSlot;
|
||||||
|
|
||||||
|
static log4cpp::Category &pjLogger = log4cpp::Category::getInstance("PjSip");
|
||||||
|
|
||||||
|
|
||||||
static void onCallMediaState(pjsua_call_id call_id) {
|
static void onCallMediaState(pjsua_call_id call_id) {
|
||||||
pjsua_call_info ci;
|
pjsua_call_info ci;
|
||||||
@ -41,9 +36,7 @@ static void onIncomingCall(pjsua_acc_id acc_id,
|
|||||||
|
|
||||||
pjsua_call_get_info(call_id, &ci);
|
pjsua_call_get_info(call_id, &ci);
|
||||||
|
|
||||||
PJ_LOG(3, (THIS_FILE, "Incoming call from %.*s!!",
|
pjLogger.notice("Incoming call from %s.", ci.remote_info.ptr);
|
||||||
(int) ci.remote_info.slen,
|
|
||||||
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);
|
||||||
@ -56,23 +49,30 @@ 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);
|
||||||
PJ_LOG(3, (THIS_FILE, "Call %d state=%.*s", call_id,
|
pjLogger.notice("Call %d state=%s.", call_id, ci.state_text.ptr);
|
||||||
(int) ci.state_text.slen,
|
}
|
||||||
ci.state_text.ptr));
|
|
||||||
|
static void pjLogToLog4CppBridgeFunction(int level, const char *data, int len) {
|
||||||
|
using namespace log4cpp;
|
||||||
|
std::map<int, Priority::Value> prioritiesMap = {
|
||||||
|
{1, Priority::ERROR},
|
||||||
|
{2, Priority::WARN},
|
||||||
|
{3, Priority::NOTICE},
|
||||||
|
{4, Priority::INFO},
|
||||||
|
{5, Priority::DEBUG},
|
||||||
|
{6, Priority::DEBUG}
|
||||||
|
};
|
||||||
|
|
||||||
|
string message(data);
|
||||||
|
|
||||||
|
message = message.substr(0, message.size() - 1); // remove newline
|
||||||
|
|
||||||
|
pjLogger << prioritiesMap.at(level) << message;
|
||||||
}
|
}
|
||||||
|
|
||||||
sip::PjsuaCommunicator::PjsuaCommunicator()
|
sip::PjsuaCommunicator::PjsuaCommunicator()
|
||||||
: logger(log4cpp::Category::getInstance("SipCommunicator")),
|
: logger(log4cpp::Category::getInstance("SipCommunicator")),
|
||||||
callbackLogger(log4cpp::Category::getInstance("SipCommunicatorCallback")) {
|
callbackLogger(log4cpp::Category::getInstance("SipCommunicatorCallback")) {
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void sip::PjsuaCommunicator::connect(
|
|
||||||
std::string host,
|
|
||||||
std::string user,
|
|
||||||
std::string password,
|
|
||||||
unsigned int port) {
|
|
||||||
|
|
||||||
pj_status_t status;
|
pj_status_t status;
|
||||||
|
|
||||||
status = pjsua_create();
|
status = pjsua_create();
|
||||||
@ -80,6 +80,8 @@ void sip::PjsuaCommunicator::connect(
|
|||||||
throw sip::Exception("Error in pjsua_create()", status);
|
throw sip::Exception("Error in pjsua_create()", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pj_log_set_log_func(pjLogToLog4CppBridgeFunction);
|
||||||
|
|
||||||
pjsua_config generalConfig;
|
pjsua_config generalConfig;
|
||||||
pjsua_config_default(&generalConfig);
|
pjsua_config_default(&generalConfig);
|
||||||
|
|
||||||
@ -90,11 +92,10 @@ void sip::PjsuaCommunicator::connect(
|
|||||||
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;
|
||||||
|
|
||||||
//todo zrobić coś z logami
|
|
||||||
pjsua_logging_config logConfig;
|
pjsua_logging_config logConfig;
|
||||||
pjsua_logging_config_default(&logConfig);
|
pjsua_logging_config_default(&logConfig);
|
||||||
|
logConfig.cb = pjLogToLog4CppBridgeFunction;
|
||||||
logConfig.console_level = 4;
|
logConfig.console_level = 5;
|
||||||
|
|
||||||
status = pjsua_init(&generalConfig, &logConfig, NULL);
|
status = pjsua_init(&generalConfig, &logConfig, NULL);
|
||||||
if (status != PJ_SUCCESS) {
|
if (status != PJ_SUCCESS) {
|
||||||
@ -103,7 +104,25 @@ void sip::PjsuaCommunicator::connect(
|
|||||||
|
|
||||||
pjsua_set_null_snd_dev();
|
pjsua_set_null_snd_dev();
|
||||||
|
|
||||||
/* Add UDP transport. */
|
pj_caching_pool cachingPool;
|
||||||
|
pj_caching_pool_init(&cachingPool, &pj_pool_factory_default_policy, 0);
|
||||||
|
pj_pool_t *pool = pj_pool_create(&cachingPool.factory, "wav", 32768, 8192, nullptr);
|
||||||
|
|
||||||
|
// todo calculate sizes
|
||||||
|
pjmedia_circ_buf_create(pool, 960 * 10, &inputBuff);
|
||||||
|
|
||||||
|
mediaPort = createMediaPort();
|
||||||
|
|
||||||
|
pjsua_conf_add_port(pool, mediaPort, &mediaPortSlot);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sip::PjsuaCommunicator::connect(
|
||||||
|
std::string host,
|
||||||
|
std::string user,
|
||||||
|
std::string password,
|
||||||
|
unsigned int port) {
|
||||||
|
pj_status_t status;
|
||||||
|
|
||||||
pjsua_transport_config transportConfig;
|
pjsua_transport_config transportConfig;
|
||||||
pjsua_transport_config_default(&transportConfig);
|
pjsua_transport_config_default(&transportConfig);
|
||||||
|
|
||||||
@ -114,18 +133,6 @@ void sip::PjsuaCommunicator::connect(
|
|||||||
throw sip::Exception("Error creating transport", status);
|
throw sip::Exception("Error creating transport", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
pj_caching_pool cachingPool;
|
|
||||||
pj_caching_pool_init(&cachingPool, &pj_pool_factory_default_policy, 0);
|
|
||||||
pj_pool_t *pool = pj_pool_create(&cachingPool.factory, "wav", 32768, 8192, nullptr);
|
|
||||||
|
|
||||||
// create circular buffers
|
|
||||||
pjmedia_circ_buf_create(pool, 960 * 10, &inputBuff);
|
|
||||||
pjmedia_circ_buf_create(pool, 960 * 10, &outputBuff);
|
|
||||||
|
|
||||||
mediaPort = createMediaPort();
|
|
||||||
|
|
||||||
pjsua_conf_add_port(pool, mediaPort, &mediaPortSlot);
|
|
||||||
|
|
||||||
/* Initialization is done, now start sip */
|
/* Initialization is done, now start sip */
|
||||||
status = pjsua_start();
|
status = pjsua_start();
|
||||||
if (status != PJ_SUCCESS) {
|
if (status != PJ_SUCCESS) {
|
||||||
@ -210,16 +217,9 @@ pj_status_t sip::PjsuaCommunicator::mediaPortGetFrame(pjmedia_frame *frame) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void sip::PjsuaCommunicator::mediaPortPutFrame(pj_int16_t *samples, pj_size_t count) {
|
void sip::PjsuaCommunicator::mediaPortPutFrame(pj_int16_t *samples, pj_size_t count) {
|
||||||
// std::unique_lock<std::mutex> lock(outBuffAccessMutex);
|
|
||||||
//
|
|
||||||
// callbackLogger.debug("Pushing %d samples to out-buff.", count);
|
|
||||||
// pjmedia_circ_buf_write(outputBuff, samples, count);
|
|
||||||
//
|
|
||||||
// lock.unlock();
|
|
||||||
//
|
|
||||||
// outBuffCondVar.notify_all();
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
onIncomingSamples(samples, count);
|
callbackLogger.debug("Calling onIncomingPcmSamples with %d samples.", count);
|
||||||
|
onIncomingPcmSamples(samples, count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +228,18 @@ void sip::PjsuaCommunicator::registerAccount(string host, string user, string pa
|
|||||||
pjsua_acc_config accConfig;
|
pjsua_acc_config accConfig;
|
||||||
pjsua_acc_config_default(&accConfig);
|
pjsua_acc_config_default(&accConfig);
|
||||||
|
|
||||||
accConfig.id = toPjString(string("sip:") + user + "@" + host);
|
string uri = string("sip:") + user + "@" + host;
|
||||||
|
|
||||||
|
pj_status_t status;
|
||||||
|
|
||||||
|
status = pjsua_verify_sip_url(uri.c_str());
|
||||||
|
if (status != PJ_SUCCESS) {
|
||||||
|
throw sip::Exception("failed to register account", status);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Registering account for URI: %s.", uri.c_str());
|
||||||
|
|
||||||
|
accConfig.id = toPjString(uri);
|
||||||
accConfig.reg_uri = toPjString(string("sip:") + host);
|
accConfig.reg_uri = toPjString(string("sip:") + host);
|
||||||
|
|
||||||
accConfig.cred_count = 1;
|
accConfig.cred_count = 1;
|
||||||
@ -240,32 +251,14 @@ void sip::PjsuaCommunicator::registerAccount(string host, string user, string pa
|
|||||||
|
|
||||||
pjsua_acc_id acc_id;
|
pjsua_acc_id acc_id;
|
||||||
|
|
||||||
pj_status_t status = pjsua_acc_add(&accConfig, PJ_TRUE, &acc_id);
|
status = pjsua_acc_add(&accConfig, PJ_TRUE, &acc_id);
|
||||||
if (status != PJ_SUCCESS) {
|
if (status != PJ_SUCCESS) {
|
||||||
throw sip::Exception("failed to register account", status);
|
throw sip::Exception("failed to register account", status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sip::PjsuaCommunicator::pushSamples(int16_t *samples, unsigned int length) {
|
void sip::PjsuaCommunicator::sendPcmSamples(int16_t *samples, unsigned int length) {
|
||||||
std::unique_lock<std::mutex> lock(inBuffAccessMutex);
|
std::unique_lock<std::mutex> lock(inBuffAccessMutex);
|
||||||
callbackLogger.debug("Pushing %d samples to in-buff.", length);
|
callbackLogger.debug("Pushing %d samples to in-buff.", length);
|
||||||
pjmedia_circ_buf_write(inputBuff, samples, length);
|
pjmedia_circ_buf_write(inputBuff, samples, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
//unsigned int sip::PjsuaCommunicator::pullSamples(int16_t *samples, unsigned int length, bool waitWhenEmpty) {
|
|
||||||
// std::unique_lock<std::mutex> lock(outBuffAccessMutex);
|
|
||||||
//
|
|
||||||
// unsigned int availableSamples;
|
|
||||||
//
|
|
||||||
// while ((availableSamples = pjmedia_circ_buf_get_len(inputBuff)) < length) {
|
|
||||||
// callbackLogger.debug("Not enough samples in buffer: %d, requested %d. Waiting.", availableSamples, length);
|
|
||||||
// outBuffCondVar.wait(lock);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// const int samplesToRead = std::min(length, availableSamples);
|
|
||||||
//
|
|
||||||
// callbackLogger.debug("Pulling %d samples from out-buff.", samplesToRead);
|
|
||||||
// pjmedia_circ_buf_read(inputBuff, samples, samplesToRead);
|
|
||||||
//
|
|
||||||
// return samplesToRead;
|
|
||||||
//}
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#ifndef MUMSI_PJSUACOMMUNICATOR_HPP
|
#pragma once
|
||||||
#define MUMSI_PJSUACOMMUNICATOR_HPP
|
|
||||||
|
|
||||||
#include "ISamplesBuffer.hpp"
|
#include "ICommunicator.hpp"
|
||||||
|
|
||||||
#include <pjmedia.h>
|
#include <pjmedia.h>
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ namespace sip {
|
|||||||
|
|
||||||
pj_status_t MediaPort_putFrameRawCallback(pjmedia_port *port, pjmedia_frame *frame);
|
pj_status_t MediaPort_putFrameRawCallback(pjmedia_port *port, pjmedia_frame *frame);
|
||||||
|
|
||||||
class PjsuaCommunicator : public ISamplesBuffer {
|
class PjsuaCommunicator : public ICommunicator {
|
||||||
public:
|
public:
|
||||||
PjsuaCommunicator();
|
PjsuaCommunicator();
|
||||||
|
|
||||||
@ -56,11 +55,7 @@ namespace sip {
|
|||||||
|
|
||||||
~PjsuaCommunicator();
|
~PjsuaCommunicator();
|
||||||
|
|
||||||
virtual void pushSamples(int16_t *samples, unsigned int length);
|
virtual void sendPcmSamples(int16_t *samples, unsigned int length);
|
||||||
|
|
||||||
std::function<void(int16_t *, int)> onIncomingSamples;
|
|
||||||
|
|
||||||
// virtual unsigned int pullSamples(int16_t *samples, unsigned int length, bool waitWhenEmpty);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
log4cpp::Category &logger;
|
log4cpp::Category &logger;
|
||||||
@ -70,14 +65,9 @@ namespace sip {
|
|||||||
pjmedia_port *mediaPort;
|
pjmedia_port *mediaPort;
|
||||||
|
|
||||||
pjmedia_circ_buf *inputBuff;
|
pjmedia_circ_buf *inputBuff;
|
||||||
pjmedia_circ_buf *outputBuff;
|
|
||||||
|
|
||||||
std::mutex inBuffAccessMutex;
|
std::mutex inBuffAccessMutex;
|
||||||
|
|
||||||
std::mutex outBuffAccessMutex;
|
|
||||||
std::condition_variable outBuffCondVar;
|
|
||||||
|
|
||||||
|
|
||||||
// todo make it completely stateless
|
// todo make it completely stateless
|
||||||
pjmedia_port *createMediaPort();
|
pjmedia_port *createMediaPort();
|
||||||
|
|
||||||
@ -101,5 +91,3 @@ namespace sip {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //MUMSI_PJSUACOMMUNICATOR_HPP
|
|
||||||
|
24
main.cpp
24
main.cpp
@ -26,27 +26,31 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
sip::PjsuaCommunicator pjsuaCommunicator;
|
sip::PjsuaCommunicator pjsuaCommunicator;
|
||||||
|
|
||||||
mumble::MumbleCommunicator mumbleCommunicator(
|
mumble::MumbleCommunicator mumbleCommunicator(ioService);
|
||||||
ioService,
|
|
||||||
pjsuaCommunicator,
|
using namespace std::placeholders;
|
||||||
|
pjsuaCommunicator.onIncomingPcmSamples = std::bind(
|
||||||
|
&mumble::MumbleCommunicator::sendPcmSamples,
|
||||||
|
&mumbleCommunicator,
|
||||||
|
_1, _2);
|
||||||
|
|
||||||
|
mumbleCommunicator.onIncomingPcmSamples = std::bind(
|
||||||
|
&sip::PjsuaCommunicator::sendPcmSamples,
|
||||||
|
&pjsuaCommunicator,
|
||||||
|
_1, _2);
|
||||||
|
|
||||||
|
mumbleCommunicator.connect(
|
||||||
conf.getString("mumble.user"),
|
conf.getString("mumble.user"),
|
||||||
conf.getString("mumble.password"),
|
conf.getString("mumble.password"),
|
||||||
conf.getString("mumble.host"),
|
conf.getString("mumble.host"),
|
||||||
conf.getInt("mumble.port"));
|
conf.getInt("mumble.port"));
|
||||||
|
|
||||||
using namespace std::placeholders;
|
|
||||||
pjsuaCommunicator.onIncomingSamples = std::bind(
|
|
||||||
&mumble::MumbleCommunicator::sendAudioFrame,
|
|
||||||
&mumbleCommunicator,
|
|
||||||
_1, _2);
|
|
||||||
|
|
||||||
pjsuaCommunicator.connect(
|
pjsuaCommunicator.connect(
|
||||||
conf.getString("sip.host"),
|
conf.getString("sip.host"),
|
||||||
conf.getString("sip.user"),
|
conf.getString("sip.user"),
|
||||||
conf.getString("sip.password"),
|
conf.getString("sip.password"),
|
||||||
conf.getInt("sip.port"));
|
conf.getInt("sip.port"));
|
||||||
|
|
||||||
|
|
||||||
logger.info("Application started.");
|
logger.info("Application started.");
|
||||||
|
|
||||||
ioService.run();
|
ioService.run();
|
||||||
|
Loading…
Reference in New Issue
Block a user