Add config file support.
This commit is contained in:
parent
690f95820c
commit
da3000f1ad
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,2 +1,4 @@
|
||||
*.iml
|
||||
.idea/
|
||||
.idea/
|
||||
|
||||
config.ini
|
@ -26,7 +26,9 @@ set(SOURCE_FILES
|
||||
PjsuaCommunicator.hpp
|
||||
MumbleCommunicator.cpp
|
||||
MumbleCommunicator.hpp
|
||||
ISamplesBuffer.hpp)
|
||||
ISamplesBuffer.hpp
|
||||
Configuration.cpp
|
||||
Configuration.hpp)
|
||||
|
||||
#set(TEST_SOURCE_FILES
|
||||
# SoundSampleQueueTest.cpp
|
||||
|
52
Configuration.cpp
Normal file
52
Configuration.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
#include <fstream>
|
||||
#include <boost/property_tree/ptree.hpp>
|
||||
#include <boost/property_tree/ini_parser.hpp>
|
||||
|
||||
#include "Configuration.hpp"
|
||||
|
||||
using namespace config;
|
||||
|
||||
namespace config {
|
||||
struct ConfigurationImpl {
|
||||
boost::property_tree::ptree ptree;
|
||||
};
|
||||
|
||||
template<typename TYPE>
|
||||
TYPE get(boost::property_tree::ptree tree, const std::string &property) {
|
||||
try {
|
||||
return tree.get<TYPE>(property);
|
||||
} catch (boost::property_tree::ptree_bad_path) {
|
||||
throw ConfigException(std::string(typeid(TYPE).name()) + " key \'" + property + "\' not found");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
config::Configuration::Configuration(const std::string fileName)
|
||||
: impl(new ConfigurationImpl()) {
|
||||
boost::property_tree::read_ini(fileName, impl->ptree);
|
||||
}
|
||||
|
||||
config::Configuration::Configuration(std::vector<std::string> const fileNames)
|
||||
: impl(new ConfigurationImpl()) {
|
||||
for (auto &name : fileNames) {
|
||||
boost::property_tree::read_ini(name, impl->ptree);
|
||||
}
|
||||
}
|
||||
|
||||
config::Configuration::~Configuration() {
|
||||
delete impl;
|
||||
}
|
||||
|
||||
int config::Configuration::getInt(const std::string &property) {
|
||||
return get<int>(impl->ptree, property);
|
||||
}
|
||||
|
||||
bool config::Configuration::getBool(const std::string &property) {
|
||||
return get<bool>(impl->ptree, property);
|
||||
}
|
||||
|
||||
std::string config::Configuration::getString(const std::string &property) {
|
||||
return get<std::string>(impl->ptree, property);
|
||||
}
|
||||
|
||||
|
39
Configuration.hpp
Normal file
39
Configuration.hpp
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef CONFIGURATION_HPP_
|
||||
#define CONFIGURATION_HPP_
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
|
||||
namespace config {
|
||||
|
||||
class ConfigException : public std::runtime_error {
|
||||
public:
|
||||
ConfigException(const std::string &message)
|
||||
: std::runtime_error(message) {
|
||||
}
|
||||
};
|
||||
|
||||
struct ConfigurationImpl;
|
||||
|
||||
class Configuration : boost::noncopyable {
|
||||
public:
|
||||
Configuration(const std::string fileName);
|
||||
|
||||
Configuration(const std::vector<std::string> fileNames);
|
||||
|
||||
~Configuration();
|
||||
|
||||
int getInt(const std::string &property);
|
||||
|
||||
bool getBool(const std::string &property);
|
||||
|
||||
std::string getString(const std::string &property);
|
||||
|
||||
private:
|
||||
ConfigurationImpl *impl;
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* CONFIGURATION_HPP_ */
|
@ -57,6 +57,18 @@ static void mumble_serversync_callback(char *welcome_text,
|
||||
printf("%s\n", welcome_text);
|
||||
}
|
||||
|
||||
void mumble_cryptsetup_callback(uint32_t key_size,
|
||||
uint8_t *key,
|
||||
uint32_t client_nonce_size,
|
||||
uint8_t *client_nonce,
|
||||
uint32_t server_nonce_size,
|
||||
uint8_t *server_nonce,
|
||||
void *userData) {
|
||||
mumble::MumbleCommunicator *mumbleCommunicator = static_cast<mumble::MumbleCommunicator *>(userData);
|
||||
printf("received crypto nonce\n");
|
||||
}
|
||||
|
||||
|
||||
static int verify_cert(uint8_t *, uint32_t) {
|
||||
// Accept every cert
|
||||
return 1;
|
||||
@ -98,6 +110,7 @@ mumble::MumbleCommunicator::MumbleCommunicator(
|
||||
config.ssl_verification_callback = verify_cert;
|
||||
config.audio_callback = mumble_audio_callback;
|
||||
config.serversync_callback = mumble_serversync_callback;
|
||||
config.cryptsetup_callback = mumble_cryptsetup_callback;
|
||||
|
||||
mumble = mumble_connect(nullptr, &config);
|
||||
|
||||
@ -112,7 +125,7 @@ mumble::MumbleCommunicator::~MumbleCommunicator() {
|
||||
|
||||
void mumble::MumbleCommunicator::loop() {
|
||||
|
||||
//senderThread.reset(new std::thread(&MumbleCommunicator::senderThreadFunction, this));
|
||||
senderThread.reset(new std::thread(&MumbleCommunicator::senderThreadFunction, this));
|
||||
|
||||
while (!quit) {
|
||||
int status = mumble_tick(mumble);
|
||||
@ -131,7 +144,7 @@ void mumble::MumbleCommunicator::senderThreadFunction() {
|
||||
opus_int16 pcmData[1024];
|
||||
unsigned char outputBuffer[1024];
|
||||
|
||||
int pcmLength = samplesBuffer.pullSamples(pcmData, 960, true);
|
||||
int pcmLength = samplesBuffer.pullSamples(pcmData, 480, true);
|
||||
|
||||
logger.debug("Pop %d samples from inputQueue.", pcmLength);
|
||||
|
||||
@ -140,13 +153,13 @@ void mumble::MumbleCommunicator::senderThreadFunction() {
|
||||
if (encodedSamples < 1) {
|
||||
logger.warn("opus_encode returned %d: %s", encodedSamples, opus_strerror(encodedSamples));
|
||||
} else {
|
||||
// logger.debug("Sending %d bytes of Opus audio data (seq %d).", encodedSamples,
|
||||
// outgoingAudioSequenceNumber);
|
||||
//
|
||||
// //todo to powinno dać się bezpiecznie wykonać w osobnym wątku
|
||||
// mumble_send_audio_data(mumble, outgoingAudioSequenceNumber, outputBuffer, encodedSamples);
|
||||
//
|
||||
// outgoingAudioSequenceNumber += 1;
|
||||
logger.debug("Sending %d bytes of Opus audio data (seq %d).", encodedSamples,
|
||||
outgoingAudioSequenceNumber);
|
||||
|
||||
//todo to powinno dać się bezpiecznie wykonać w osobnym wątku
|
||||
mumble_send_audio_data(mumble, outgoingAudioSequenceNumber, outputBuffer, encodedSamples);
|
||||
|
||||
outgoingAudioSequenceNumber += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,8 +64,9 @@ static void onCallState(pjsua_call_id call_id,
|
||||
sip::PjsuaCommunicator::PjsuaCommunicator(
|
||||
std::string host,
|
||||
std::string user,
|
||||
std::string password) : logger(log4cpp::Category::getInstance("SipCommunicator")),
|
||||
callbackLogger(log4cpp::Category::getInstance("SipCommunicatorCallback")) {
|
||||
std::string password,
|
||||
unsigned int port) : logger(log4cpp::Category::getInstance("SipCommunicator")),
|
||||
callbackLogger(log4cpp::Category::getInstance("SipCommunicatorCallback")) {
|
||||
|
||||
pj_status_t status;
|
||||
|
||||
@ -101,7 +102,7 @@ sip::PjsuaCommunicator::PjsuaCommunicator(
|
||||
pjsua_transport_config transportConfig;
|
||||
pjsua_transport_config_default(&transportConfig);
|
||||
|
||||
transportConfig.port = sip::SIP_PORT;
|
||||
transportConfig.port = port;
|
||||
|
||||
status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &transportConfig, NULL);
|
||||
if (status != PJ_SUCCESS) {
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
namespace sip {
|
||||
|
||||
constexpr int SIP_PORT = 5060;
|
||||
constexpr int DEFAULT_PORT = 5060;
|
||||
constexpr int SAMPLING_RATE = 48000;
|
||||
|
||||
class Exception : public std::runtime_error {
|
||||
@ -49,7 +49,8 @@ namespace sip {
|
||||
PjsuaCommunicator(
|
||||
std::string host,
|
||||
std::string user,
|
||||
std::string password);
|
||||
std::string password,
|
||||
unsigned int port = DEFAULT_PORT);
|
||||
|
||||
~PjsuaCommunicator();
|
||||
|
||||
|
11
config.ini.example
Normal file
11
config.ini.example
Normal file
@ -0,0 +1,11 @@
|
||||
[sip]
|
||||
host = sip.example.org
|
||||
port = 5060
|
||||
user = mumsi
|
||||
password = foobar
|
||||
|
||||
[mumble]
|
||||
host = example.org
|
||||
port = 64738
|
||||
user = mumsi
|
||||
password = foobar
|
26
main.cpp
26
main.cpp
@ -5,29 +5,35 @@
|
||||
#include "PjsuaCommunicator.hpp"
|
||||
#include "MumbleCommunicator.hpp"
|
||||
|
||||
#define SIP_DOMAIN "sip.antisip.com"
|
||||
#define SIP_USER "melangtone"
|
||||
#define SIP_PASSWD "b8DU9AZXbd9tVCWg"
|
||||
|
||||
#define MUMBLE_DOMAIN "1con.pl"
|
||||
#define MUMBLE_USER "mumsi"
|
||||
#define MUMBLE_PASSWD "kiwi"
|
||||
#include "Configuration.hpp"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout);
|
||||
appender1->setLayout(new log4cpp::BasicLayout());
|
||||
log4cpp::Category &logger = log4cpp::Category::getRoot();
|
||||
logger.setPriority(log4cpp::Priority::INFO);
|
||||
logger.setPriority(log4cpp::Priority::DEBUG);
|
||||
logger.addAppender(appender1);
|
||||
|
||||
if (argc == 1) {
|
||||
logger.crit("No configuration file provided. Use %s {config file}", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
config::Configuration conf(argv[1]);
|
||||
|
||||
sip::PjsuaCommunicator pjsuaCommunicator(
|
||||
SIP_DOMAIN, SIP_USER, SIP_PASSWD);
|
||||
conf.getString("sip.host"),
|
||||
conf.getString("sip.user"),
|
||||
conf.getString("sip.password"),
|
||||
conf.getInt("sip.port"));
|
||||
|
||||
mumble::MumbleCommunicator mumbleCommunicator(
|
||||
pjsuaCommunicator,
|
||||
MUMBLE_USER, MUMBLE_PASSWD, MUMBLE_DOMAIN);
|
||||
conf.getString("mumble.user"),
|
||||
conf.getString("mumble.password"),
|
||||
conf.getString("mumble.host"),
|
||||
conf.getInt("mumble.port"));
|
||||
|
||||
logger.info("Application started.");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user