From 993c5f3988b4185c83bfff5b7cabc8eb56fc64f4 Mon Sep 17 00:00:00 2001 From: Scott Hardin Date: Wed, 24 May 2017 22:38:45 +0200 Subject: [PATCH] initial multi-call support; improve channel joins --- MumbleChannelJoiner.cpp | 27 +++++++ MumbleChannelJoiner.hpp | 9 +++ MumbleCommunicator.cpp | 100 ++++++++++++++++++++---- MumbleCommunicator.hpp | 33 +++++++- PjsuaCommunicator.cpp | 106 +++++++++++++++++--------- PjsuaCommunicator.hpp | 39 ++++++---- README.md | 92 ++++++++++++++++++++++- main.cpp | 163 +++++++++++++++++++++++++++++++--------- main.hpp | 6 ++ media/prompt-pin.msg | 2 +- media/prompt-pin.wav | Bin 58238 -> 122604 bytes 11 files changed, 474 insertions(+), 103 deletions(-) create mode 100644 main.hpp diff --git a/MumbleChannelJoiner.cpp b/MumbleChannelJoiner.cpp index 30ad1b1..4f58a7c 100644 --- a/MumbleChannelJoiner.cpp +++ b/MumbleChannelJoiner.cpp @@ -5,12 +5,20 @@ using namespace std; mumble::MumbleChannelJoiner::MumbleChannelJoiner(std::string channelNameRegex) : channelNameRegex(boost::regex(channelNameRegex)), logger(log4cpp::Category::getInstance("MumbleChannelJoiner")){ + //std::vector *channels = new std::vector(); } +std::vector mumble::MumbleChannelJoiner::channels; + void mumble::MumbleChannelJoiner::checkChannel(std::string channel_name, int channel_id) { boost::smatch s; + ChannelEntry ent; logger.debug("Channel %s available (%d)", channel_name.c_str(), channel_id); + ent.name = channel_name; + ent.id = channel_id; + + channels.push_back(ent); if(boost::regex_match(channel_name, s, channelNameRegex)) { this->channel_id = channel_id; @@ -23,3 +31,22 @@ void mumble::MumbleChannelJoiner::maybeJoinChannel(mumble::MumbleCommunicator *m } } +/* This is a secondary channel-switching object that relys on updates to the + * class variable 'channels' for the channel list from the server. + */ +void mumble::MumbleChannelJoiner::findJoinChannel(mumble::MumbleCommunicator *mc) { + boost::smatch s; + + int found = -1; + + for(std::vector::iterator it = channels.begin(); it != channels.end(); ++it) { + if(boost::regex_match(it->name, s, channelNameRegex)) { + found = it->id; + } + } + + if(found > -1) { + mc->joinChannel(found); + } +} + diff --git a/MumbleChannelJoiner.hpp b/MumbleChannelJoiner.hpp index 356d022..1de5867 100644 --- a/MumbleChannelJoiner.hpp +++ b/MumbleChannelJoiner.hpp @@ -3,21 +3,30 @@ #include #include +#include #include #include #include "MumbleCommunicator.hpp" namespace mumble { class MumbleChannelJoiner : boost::noncopyable { + + struct ChannelEntry { + int id; + std::string name; + }; + public: MumbleChannelJoiner(std::string channelNameRegex); void checkChannel(std::string channel_name, int channel_id); void maybeJoinChannel(mumble::MumbleCommunicator *mc); + void findJoinChannel(mumble::MumbleCommunicator *mc); private: log4cpp::Category &logger; boost::regex channelNameRegex; int channel_id; + static std::vector channels; }; } diff --git a/MumbleCommunicator.cpp b/MumbleCommunicator.cpp index f52511b..ab115d2 100644 --- a/MumbleCommunicator.cpp +++ b/MumbleCommunicator.cpp @@ -9,13 +9,14 @@ namespace mumble { std::shared_ptr mum; MumbleCommunicator *communicator; + // called by Mumlib when receiving audio from mumble server virtual void audio( int target, int sessionId, int sequenceNumber, int16_t *pcm_data, uint32_t pcm_data_size) override { - communicator->onIncomingPcmSamples(sessionId, sequenceNumber, pcm_data, pcm_data_size); + communicator->onIncomingPcmSamples(communicator->callId, sessionId, sequenceNumber, pcm_data, pcm_data_size); } virtual void channelState( @@ -39,6 +40,26 @@ namespace mumble { communicator->onServerSync(); }; + /* + virtual void onUserState( + int32_t session, + int32_t actor, + std::string name, + int32_t user_id, + int32_t channel_id, + int32_t mute, + int32_t deaf, + int32_t suppress, + int32_t self_mute, + int32_t self_deaf, + std::string comment, + int32_t priority_speaker, + int32_t recording + ) override { + communicator->onUserState(); + }; + */ + }; } @@ -60,8 +81,37 @@ void mumble::MumbleCommunicator::connect(MumbleCommunicatorConfig &config) { callback->communicator = this; callback->mum = mum; - mum->connect(config.host, config.port, config.user, config.password); - mum->self_deaf(1); + // IMPORTANT: comment these out when experimenting with onConnect + if ( ! MUM_DELAYED_CONNECT ) { + mum->connect(config.host, config.port, config.user, config.password); + if ( mumbleConf.autodeaf ) { + mum->sendUserState(mumlib::UserState::SELF_DEAF, true); + } + } +} + +void mumble::MumbleCommunicator::onConnect() { + if ( MUM_DELAYED_CONNECT ) { + mum->connect(mumbleConf.host, mumbleConf.port, mumbleConf.user, mumbleConf.password); + } + + if ( mumbleConf.comment.size() > 0 ) { + mum->sendUserState(mumlib::UserState::COMMENT, mumbleConf.comment); + } + if ( mumbleConf.autodeaf ) { + mum->sendUserState(mumlib::UserState::SELF_DEAF, true); + } +} + +void mumble::MumbleCommunicator::onDisconnect() { + if ( MUM_DELAYED_CONNECT ) { + mum->disconnect(); + } else { + } +} + +void mumble::MumbleCommunicator::onCallerAuth() { + //onServerSync(); } void mumble::MumbleCommunicator::sendPcmSamples(int16_t *samples, unsigned int length) { @@ -76,21 +126,45 @@ void mumble::MumbleCommunicator::sendTextMessage(std::string message) { mum->sendTextMessage(message); } +/* +void mumble::MumbleCommunicator::onUserState( + int32_t session, + int32_t actor, + std::string name, + int32_t user_id, + int32_t channel_id, + int32_t mute, + int32_t deaf, + int32_t suppress, + int32_t self_mute, + int32_t self_deaf, + std::string comment, + int32_t priority_speaker, + int32_t recording) { + + logger::notice("Entered onUserState(...)"); + + userState.mute = mute; + userState.deaf = deaf; + userState.suppress = suppress; + userState.self_mute = self_mute; + userState.self_deaf = self_deaf; + userState.priority_speaker = priority_speaker; + userState.recording = recording; +} +*/ + + void mumble::MumbleCommunicator::joinChannel(int channel_id) { mum->joinChannel(channel_id); + if ( mumbleConf.autodeaf ) { - //mum->self_mute(1); - mum->self_deaf(1); + mum->sendUserState(mumlib::UserState::SELF_DEAF, true); } } -void mumble::MumbleCommunicator::mutedeaf(int status) { - if ( mumbleConf.autodeaf ) { - if ( status ) { - mum->self_deaf(status); - } else { - mum->self_mute(status); - } - } + +void mumble::MumbleCommunicator::sendUserState(mumlib::UserState field, bool val) { + mum->sendUserState(field, val); } diff --git a/MumbleCommunicator.hpp b/MumbleCommunicator.hpp index 8fef318..2ea5828 100644 --- a/MumbleCommunicator.hpp +++ b/MumbleCommunicator.hpp @@ -8,6 +8,9 @@ #include #include +// 0 = mumble users connected at start; 1 = connect at dial-in +// TODO: fix mumlib::TransportException when this option is enabled +#define MUM_DELAYED_CONNECT 0 namespace mumble { @@ -26,6 +29,20 @@ namespace mumble { int opusEncoderBitrate; int port = 0; bool autodeaf; + std::string comment; + int max_calls = 1; + std::string authchan; // config.ini: channelAuthExpression + }; + + // This is the subset that is of interest to us + struct MumbleUserState { + int32_t mute; + int32_t deaf; + int32_t suppress; + int32_t self_mute; + int32_t self_deaf; + int32_t priority_speaker; + int32_t recording; }; class MumbleCommunicator : boost::noncopyable { @@ -34,6 +51,10 @@ namespace mumble { boost::asio::io_service &ioService); void connect(MumbleCommunicatorConfig &config); + void onConnect(); + void onDisconnect(); + void onCallerAuth(); + //void onCallerUnauth(); virtual ~MumbleCommunicator(); @@ -41,9 +62,9 @@ namespace mumble { /** * This callback is called when communicator has received samples. - * Arguments: session ID, sequence number, PCM samples, length of samples + * Arguments: call ID, session ID, sequence number, PCM samples, length of samples */ - std::function onIncomingPcmSamples; + std::function onIncomingPcmSamples; /** * This callback is called when a channel state message (e.g. Channel @@ -53,11 +74,17 @@ namespace mumble { std::function onServerSync; + std::function onUserState; + void sendTextMessage(std::string message); void joinChannel(int channel_id); - void mutedeaf(int status); + void sendUserState(mumlib::UserState field, bool val); + + MumbleUserState userState; + + int callId; private: boost::asio::io_service &ioService; diff --git a/PjsuaCommunicator.cpp b/PjsuaCommunicator.cpp index 5d4d56d..abb02c5 100644 --- a/PjsuaCommunicator.cpp +++ b/PjsuaCommunicator.cpp @@ -6,6 +6,8 @@ #include #include +#include "main.hpp" + using namespace std; namespace sip { @@ -38,9 +40,9 @@ namespace sip { class _MumlibAudioMedia : public pj::AudioMedia { public: - _MumlibAudioMedia(sip::PjsuaCommunicator &comm, int frameTimeLength) + _MumlibAudioMedia(int call_id, sip::PjsuaCommunicator &comm, int frameTimeLength) : communicator(comm) { - createMediaPort(frameTimeLength); + createMediaPort(call_id, frameTimeLength); registerMediaPort(&mediaPort); } @@ -62,7 +64,7 @@ namespace sip { return communicator->mediaPortPutFrame(port, frame); } - void createMediaPort(int frameTimeLength) { + void createMediaPort(int call_id, int frameTimeLength) { auto name = pj_str((char *) "MumsiMediaPort"); @@ -88,6 +90,8 @@ namespace sip { } mediaPort.port_data.pdata = &communicator; + // track call id in port_data + mediaPort.port_data.ldata = (long) call_id; mediaPort.get_frame = &callback_getFrame; mediaPort.put_frame = &callback_putFrame; @@ -145,14 +149,19 @@ namespace sip { if (ci.state == PJSIP_INV_STATE_CONFIRMED) { auto msgText = "Incoming call from " + address + "."; + // first, login to Mumble (only matters if MUM_DELAYED_CONNECT) + communicator.calls[ci.id].onConnect(); + pj_thread_sleep(500); // sleep a moment to allow connection to stabilize + communicator.logger.notice(msgText); - communicator.onStateChange(msgText); + communicator.calls[ci.id].onStateChange(msgText); pj_thread_sleep(500); // sleep a moment to allow connection to stabilize this->playAudioFile(communicator.file_welcome); communicator.got_dtmf = ""; + communicator.logger.notice("MYDEBUG: pin length=%d", communicator.caller_pin.length()); /* * if no pin is set, go ahead and turn off mute/deaf * otherwise, wait for pin to be entered @@ -160,11 +169,18 @@ namespace sip { if ( communicator.caller_pin.length() == 0 ) { // No PIN set... enter DTMF root menu and turn off mute/deaf communicator.dtmf_mode = DTMF_MODE_ROOT; - communicator.onMuteDeafChange(0); + // turning off mute automatically turns off deaf + communicator.calls[ci.id].sendUserState(mumlib::UserState::SELF_MUTE, false); + pj_thread_sleep(500); // sleep a moment to allow connection to stabilize + this->playAudioFile(communicator.file_announce_new_caller, true); } else { // PIN set... enter DTMF unauth menu and play PIN prompt message communicator.dtmf_mode = DTMF_MODE_UNAUTH; + communicator.logger.notice("MYDEBUG: call joinDefaultChannel()"); + communicator.calls[ci.id].joinDefaultChannel(); pj_thread_sleep(500); // pause briefly after announcement + communicator.logger.notice("MYDEBUG: call play...()"); + this->playAudioFile(communicator.file_prompt_pin); } @@ -174,16 +190,23 @@ namespace sip { if (not acc.available) { auto msgText = "Call from " + address + " finished."; - communicator.mixer->clear(); + communicator.calls[ci.id].mixer->clear(); communicator.logger.notice(msgText); - communicator.onStateChange(msgText); - communicator.onMuteDeafChange(1); + communicator.calls[ci.id].onStateChange(msgText); + communicator.calls[ci.id].sendUserState(mumlib::UserState::SELF_DEAF, true); + communicator.logger.notice("MYDEBUG: call joinDefaultChannel()"); + communicator.calls[ci.id].joinDefaultChannel(); + + communicator.calls[ci.id].onDisconnect(); acc.available = true; } delete this; + } else { + communicator.logger.notice("MYDEBUG: onCallState() call:%d state:%d", + ci.id, ci.state); } } @@ -197,8 +220,8 @@ namespace sip { if (ci.media[0].status == PJSUA_CALL_MEDIA_ACTIVE) { auto *aud_med = static_cast(getMedia(0)); - communicator.media->startTransmit(*aud_med); - aud_med->startTransmit(*communicator.media); + communicator.calls[ci.id].media->startTransmit(*aud_med); + aud_med->startTransmit(*communicator.calls[ci.id].media); } else if (ci.media[0].status == PJSUA_CALL_MEDIA_NONE) { dynamic_cast<_Account &>(account).available = true; } @@ -244,14 +267,8 @@ namespace sip { pinfo = player.getInfo(); sleeptime = pinfo.sizeBytes / (pinfo.payloadBitsPerSample * 3); - /* - communicator.logger.notice("DEBUG: wavsize=%d pbps=%d bytes=%d samples=%d", - wavsize, pinfo.payloadBitsPerSample, pinfo.sizeBytes, pinfo.sizeSamples); - communicator.logger.notice("WAVE length in ms: %d", sleeptime); - */ - if ( in_chan ) { // choose the target sound output - player.startTransmit(*communicator.media); + player.startTransmit(*communicator.calls[ci.id].media); } else { player.startTransmit(*aud_med); } @@ -259,7 +276,7 @@ namespace sip { pj_thread_sleep(sleeptime); if ( in_chan ) { // choose the target sound output - player.stopTransmit(*communicator.media); + player.stopTransmit(*communicator.calls[ci.id].media); } else { player.stopTransmit(*aud_med); } @@ -277,6 +294,8 @@ namespace sip { // prm.digit.c_str(), getId()); pj::CallOpParam param; + auto ci = getInfo(); + /* * DTMF CALLER MENU */ @@ -295,8 +314,10 @@ namespace sip { if ( communicator.got_dtmf == communicator.caller_pin ) { communicator.logger.notice("Caller entered correct PIN"); communicator.dtmf_mode = DTMF_MODE_ROOT; + communicator.calls[ci.id].joinAuthChannel(); + this->playAudioFile(communicator.file_entering_channel); - communicator.onMuteDeafChange(0); + communicator.calls[ci.id].sendUserState(mumlib::UserState::SELF_MUTE, false); this->playAudioFile(communicator.file_announce_new_caller, true); } else { communicator.logger.notice("Caller entered wrong PIN"); @@ -357,18 +378,20 @@ namespace sip { * User already entered '*'; time to perform action */ switch ( prm.digit[0] ) { - /* case '5': // Mute line - communicator.onMuteChange(1); + communicator.calls[ci.id].sendUserState(mumlib::UserState::SELF_MUTE, true); this->playAudioFile(communicator.file_mute_on); break; case '6': // Un-mute line this->playAudioFile(communicator.file_mute_off); - communicator.onMuteChange(0); + communicator.calls[ci.id].sendUserState(mumlib::UserState::SELF_MUTE, false); + break; + case '0': + // play menu + this->playAudioFile(communicator.file_menu); break; - */ default: communicator.logger.notice("Unsupported DTMF digit '%s' in state STAR", prm.digit.c_str()); } @@ -405,7 +428,13 @@ namespace sip { param.statusCode = PJSIP_SC_OK; available = false; } else { - param.statusCode = PJSIP_SC_BUSY_EVERYWHERE; + /* + * EXPERIMENT WITH MULTI-LINE + */ + communicator.logger.info("MULTI-LINE Incoming call from %s.", uri.c_str()); + param.statusCode = PJSIP_SC_OK; + available = false; + //param.statusCode = PJSIP_SC_BUSY_EVERYWHERE; } call->answer(param); @@ -417,18 +446,19 @@ namespace sip { } } -sip::PjsuaCommunicator::PjsuaCommunicator(IncomingConnectionValidator &validator, int frameTimeLength) +sip::PjsuaCommunicator::PjsuaCommunicator(IncomingConnectionValidator &validator, int frameTimeLength, int maxCalls) : logger(log4cpp::Category::getInstance("SipCommunicator")), pjsuaLogger(log4cpp::Category::getInstance("Pjsua")), uriValidator(validator) { logWriter.reset(new sip::_LogWriter(pjsuaLogger)); + endpoint.libCreate(); pj::EpConfig endpointConfig; endpointConfig.uaConfig.userAgent = "Mumsi Mumble-SIP gateway"; - endpointConfig.uaConfig.maxCalls = 1; + endpointConfig.uaConfig.maxCalls = maxCalls; endpointConfig.logConfig.writer = logWriter.get(); endpointConfig.logConfig.level = 5; @@ -437,11 +467,12 @@ sip::PjsuaCommunicator::PjsuaCommunicator(IncomingConnectionValidator &validator endpoint.libInit(endpointConfig); - pj_caching_pool_init(&cachingPool, &pj_pool_factory_default_policy, 0); - - mixer.reset(new mixer::AudioFramesMixer(cachingPool.factory)); - - media.reset(new _MumlibAudioMedia(*this, frameTimeLength)); + for(int i=0; iaddFrameToBuffer(sessionId, sequenceNumber, samples, length); +void sip::PjsuaCommunicator::sendPcmSamples(int callId, int sessionId, int sequenceNumber, int16_t *samples, unsigned int length) { + calls[callId].mixer->addFrameToBuffer(sessionId, sequenceNumber, samples, length); } pj_status_t sip::PjsuaCommunicator::mediaPortGetFrame(pjmedia_port *port, pjmedia_frame *frame) { @@ -481,7 +512,8 @@ pj_status_t sip::PjsuaCommunicator::mediaPortGetFrame(pjmedia_port *port, pjmedi pj_int16_t *samples = static_cast(frame->buf); pj_size_t count = frame->size / 2 / PJMEDIA_PIA_CCNT(&(port->info)); - const int readSamples = mixer->getMixedSamples(samples, count); + int call_id = (int) port->port_data.ldata; + const int readSamples = calls[call_id].mixer->getMixedSamples(samples, count); if (readSamples < count) { pjsuaLogger.debug("Requested %d samples, available %d, filling remaining with zeros.", @@ -500,9 +532,11 @@ pj_status_t sip::PjsuaCommunicator::mediaPortPutFrame(pjmedia_port *port, pjmedi pj_size_t count = frame->size / 2 / PJMEDIA_PIA_CCNT(&port->info); frame->type = PJMEDIA_FRAME_TYPE_AUDIO; + int call_id = (int) port->port_data.ldata; + if (count > 0) { - pjsuaLogger.debug("Calling onIncomingPcmSamples with %d samples.", count); - onIncomingPcmSamples(samples, count); + pjsuaLogger.debug("Calling onIncomingPcmSamples with %d samples (call_id=%d).", count, call_id); + this->calls[call_id].onIncomingPcmSamples(samples, count); } return PJ_SUCCESS; diff --git a/PjsuaCommunicator.hpp b/PjsuaCommunicator.hpp index bd69979..3ee0113 100644 --- a/PjsuaCommunicator.hpp +++ b/PjsuaCommunicator.hpp @@ -18,6 +18,11 @@ #include #include +// for userState enum +#include + +#include "main.hpp" + enum dtmf_modes_t {DTMF_MODE_UNAUTH, DTMF_MODE_ROOT, DTMF_MODE_STAR}; namespace sip { @@ -62,9 +67,25 @@ namespace sip { class _MumlibAudioMedia; + struct call { + unsigned index; + std::unique_ptr mixer; + std::unique_ptr media; + pj_caching_pool cachingPool; + std::function onStateChange; + std::function onIncomingPcmSamples; + std::function onMuteDeafChange; + std::function sendUserState; + std::function onConnect; + std::function onDisconnect; + std::function onCallerAuth; + std::function joinAuthChannel; + std::function joinDefaultChannel; + }; + class PjsuaCommunicator : boost::noncopyable { public: - PjsuaCommunicator(IncomingConnectionValidator &validator, int frameTimeLength); + PjsuaCommunicator(IncomingConnectionValidator &validator, int frameTimeLength, int maxCalls); void connect( std::string host, @@ -75,6 +96,7 @@ namespace sip { virtual ~PjsuaCommunicator(); void sendPcmSamples( + int callId, int sessionId, int sequenceNumber, int16_t *samples, @@ -97,29 +119,18 @@ namespace sip { dtmf_modes_t dtmf_mode = DTMF_MODE_ROOT; int pin_fails = 0; - std::function onIncomingPcmSamples; - - std::function onStateChange; - - std::function onMuteDeafChange; - - std::function onMuteChange; - 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: log4cpp::Category &logger; log4cpp::Category &pjsuaLogger; - std::unique_ptr mixer; - std::unique_ptr<_LogWriter> logWriter; std::unique_ptr<_Account> account; - std::unique_ptr<_MumlibAudioMedia> media; - - pj_caching_pool cachingPool; pj::Endpoint endpoint; diff --git a/README.md b/README.md index 9a3dd99..d1b11e8 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,91 @@ Remember to add URIs which you want to make calls from. Calls from other URIs wo ./mumsi config.ini ``` +## Configuring + +### Multi-Line Support + +If your SIP provider allows multiple simultaneous calls, mumsi can be configured to accept +calls and map them to separate Mumble users. The max\_calls is configure in *config.ini*: + +``` +[sip] +... +max_calls = 32 +... +``` + +Currently, the Mumble connections are established at server start. For usability, the following +options are recommended: + +* caller\_pin +* autodeaf +* channelAuthExpression + +The maximum number of calls is set in *main.hpp* and should not exceed the +*PJSUA_MAX_CALLS* in *pjsua.h*, which by default is 32. This can also be recompiled to +more, if desired. + +When mumsi logs into Mumble, it uses the user name from *config.ini* and appends +the character '-', followed by the connection number (counter). + +*LIMITATIONS:* The code is _alpha_ and needs testing/debugging, especialy in +the code that uses mumlib::Transport. Also, there is initial work on connecting +the Mumble user only when the SIP call is active, so the UI for other users is +better, but this code is still very buggy and therefore disabled. + +### Caller PIN + +When the caller\_pin is set, the incoming SIP connection is mute/deaf until the +caller enters the correct PIN, followed by the '#' symbol. On three failed +attempts, the SIP connection is hung up. On success, the Mumble user is moved +into the channel matching channelAuthExpression, if specified, and then mute/deaf +is turned off. As a courtesy to the other users, a brief announcement audio +file is played in the Mumble channel. + +The caller\_pin is configured in *config.ini* in the *app* section: + +``` +[app] +caller_pin = 12345 +``` + +In addition to the caller\_pin, a channelAuthExpression can be set. After +the caller authenticates with the PIN, the mumsi Mumble user will switch +to the Mumble channel that matches this expression. When the call is +completed, the mumsi Mumble user will return to the default channel that +matches channelNameExpression. + +This helps keep the unused SIP connections from cluttering your channel. + +### Autodeaf + +By default (i.e. autodeaf=0), other Mumble users can only see whether the mumsi +connection has an active caller if they are in the same channel. This is becaue +the 'talking mouth' icon is not visible to users in other channels. The mute/deaf +icons, on the other hand, can be seen by Mumble users when they are in different +channels, making it easier to spot when a new caller has connected. + +Setting `autodeaf=1' causes the mumsi Mumble user to be mute/deaf when there +is no active SIP call. + +### Audio Files + +When certain events occur, it is user-friendly to provide some sort of prompting +confirmation to the user. An example set of WAV files is provided, but they +can easily be customized or replaced with local versions, if needed. If the +files are not found, no sound is played. The following events are supported: + +- welcome: Played to caller when first connecting to mumsi +- prompt\_pin: Prompt the caller to enter the PIN +- entering\_channel: Caller entered PIN and is now entering the Mumble channel +- announce\_new\_caller: Played to the Mumble channel when adding a new caller +- invalid\_pin: Let the caller know they entered the wrong PIN +- goodbye: Hanging up on the caller +- mute\_on: Self-mute has been turned on (not implemented) +- mute\_off: Self-mute has been turned off (not implemented) +- menu: Tell caller the menu options (not implemented) + ## Start at boot *mumsi* provides no *init.d* scripts, but you can use great daemon mangaer, [Supervisor](http://supervisord.org/). @@ -65,7 +150,6 @@ stdout_capture_maxbytes=1MB redirect_stderr=true ``` - ## Issues #### Port and NAT @@ -82,6 +166,12 @@ pjsua_conf_add_port(mediaPool, (pjmedia_port *)port, &id) error: Invalid operati Some older versions of PJSIP are affected (confirmed for 2.3). In this case you have to update PJSIP to most recent version (2.4.5). +#### mumlib::TrasportException + +The multi-caller code is _alpha_ and needs testing/debugging, especialy in +the code that uses mumlib::Transport. Also, there is initial work on connecting +the Mumble user only when the SIP call is active, so the UI for other users is +better, but this code is still very buggy and therefore disabled. ## TODO: diff --git a/main.cpp b/main.cpp index 8396f49..d76b6f0 100644 --- a/main.cpp +++ b/main.cpp @@ -10,6 +10,8 @@ #include +#include "main.hpp" + /* * Code from http://stackoverflow.com/a/77336/5419223 */ @@ -26,13 +28,15 @@ static void sigsegv_handler(int sig) { int main(int argc, char *argv[]) { signal(SIGSEGV, sigsegv_handler); + int max_calls; log4cpp::OstreamAppender appender("console", &std::cout); log4cpp::PatternLayout layout; layout.setConversionPattern("%d [%p] %c: %m%n"); appender.setLayout(&layout); log4cpp::Category &logger = log4cpp::Category::getRoot(); - logger.setPriority(log4cpp::Priority::NOTICE); + logger.setPriority(log4cpp::Priority::DEBUG); + //logger.setPriority(log4cpp::Priority::NOTICE); logger.addAppender(appender); if (argc == 1) { @@ -48,40 +52,13 @@ int main(int argc, char *argv[]) { boost::asio::io_service ioService; - sip::PjsuaCommunicator pjsuaCommunicator(connectionValidator, conf.getInt("sip.frameLength")); + try { + max_calls = conf.getInt("sip.max_calls"); + } catch (...) { + max_calls = 1; + } - mumble::MumbleCommunicator mumbleCommunicator(ioService); - - mumble::MumbleChannelJoiner mumbleChannelJoiner(conf.getString("mumble.channelNameExpression")); - - using namespace std::placeholders; - pjsuaCommunicator.onIncomingPcmSamples = std::bind( - &mumble::MumbleCommunicator::sendPcmSamples, - &mumbleCommunicator, - _1, _2); - - pjsuaCommunicator.onStateChange = std::bind( - &mumble::MumbleCommunicator::sendTextMessage, - &mumbleCommunicator, _1); - - pjsuaCommunicator.onMuteDeafChange = std::bind( - &mumble::MumbleCommunicator::mutedeaf, - &mumbleCommunicator, _1); - - mumbleCommunicator.onIncomingPcmSamples = std::bind( - &sip::PjsuaCommunicator::sendPcmSamples, - &pjsuaCommunicator, - _1, _2, _3, _4); - - mumbleCommunicator.onIncomingChannelState = std::bind( - &mumble::MumbleChannelJoiner::checkChannel, - &mumbleChannelJoiner, - _1, _2); - - mumbleCommunicator.onServerSync = std::bind( - &mumble::MumbleChannelJoiner::maybeJoinChannel, - &mumbleChannelJoiner, - &mumbleCommunicator); + sip::PjsuaCommunicator pjsuaCommunicator(connectionValidator, conf.getInt("sip.frameLength"), max_calls); mumble::MumbleCommunicatorConfig mumbleConf; mumbleConf.host = conf.getString("mumble.host"); @@ -96,6 +73,18 @@ int main(int argc, char *argv[]) { mumbleConf.autodeaf = false; } + try { + mumbleConf.comment = conf.getString("app.comment"); + } catch (...) { + mumbleConf.comment = ""; + } + + try { + mumbleConf.authchan = conf.getString("mumble.channelAuthExpression"); + } catch (...) { + mumbleConf.authchan = ""; + } + /* default to */ try { pjsuaCommunicator.caller_pin = conf.getString("app.caller_pin"); @@ -148,7 +137,111 @@ int main(int argc, char *argv[]) { pjsuaCommunicator.file_menu = "menu.wav"; } - mumbleCommunicator.connect(mumbleConf); + /* If the channelUnauthExpression is set, use this as the default + * channel and use channelNameExpression for the authchan. Otherwise, + * use the channelNameExpression for the default. + */ + std::string defaultChan = conf.getString("mumble.channelNameExpression"); + std::string authChan = ""; + + if ( pjsuaCommunicator.caller_pin.size() > 0 ) { + try { + authChan = conf.getString("mumble.channelAuthExpression"); + } catch (...) { + // defaultChan = conf.getString("mumble.channelNameExpression"); + } + } + + mumble::MumbleChannelJoiner mumbleChannelJoiner(defaultChan); + mumble::MumbleChannelJoiner mumbleAuthChannelJoiner(authChan); + + for (int i = 0; icallId = i; + + using namespace std::placeholders; + // Passing audio input from SIP to Mumble + pjsuaCommunicator.calls[i].onIncomingPcmSamples = std::bind( + &mumble::MumbleCommunicator::sendPcmSamples, + mumcom, + _1, _2); + + // PJ sends text message to Mumble + pjsuaCommunicator.calls[i].onStateChange = std::bind( + &mumble::MumbleCommunicator::sendTextMessage, + mumcom, + _1); + + /* + // Send mute/deaf to Mumble + pjsuaCommunicator.calls[i].onMuteDeafChange = std::bind( + &mumble::MumbleCommunicator::mutedeaf, + mumcom, + _1); + */ + + // Send UserState to Mumble + pjsuaCommunicator.calls[i].sendUserState = std::bind( + &mumble::MumbleCommunicator::sendUserState, + mumcom, + _1, _2); + + // PJ triggers Mumble connect + pjsuaCommunicator.calls[i].onConnect = std::bind( + &mumble::MumbleCommunicator::onConnect, + mumcom); + + // PJ triggers Mumble disconnect + pjsuaCommunicator.calls[i].onDisconnect = std::bind( + &mumble::MumbleCommunicator::onDisconnect, + mumcom); + + // PJ notifies Mumble that Caller Auth is done + pjsuaCommunicator.calls[i].onCallerAuth = std::bind( + &mumble::MumbleCommunicator::onCallerAuth, + mumcom); + + /* + // PJ notifies Mumble that Caller Auth is done + pjsuaCommunicator.calls[i].onCallerUnauth = std::bind( + &mumble::MumbleCommunicator::onCallerUnauth, + mumcom); + */ + + // PJ notifies Mumble that Caller Auth is done + pjsuaCommunicator.calls[i].joinDefaultChannel = std::bind( + &mumble::MumbleChannelJoiner::findJoinChannel, + &mumbleChannelJoiner, + mumcom); + + // PJ notifies Mumble that Caller Auth is done + pjsuaCommunicator.calls[i].joinAuthChannel = std::bind( + &mumble::MumbleChannelJoiner::findJoinChannel, + &mumbleAuthChannelJoiner, + mumcom); + + // Passing audio from Mumble to SIP + mumcom->onIncomingPcmSamples = std::bind( + &sip::PjsuaCommunicator::sendPcmSamples, + &pjsuaCommunicator, + _1, _2, _3, _4, _5); + + // Handle Channel State messages from Mumble + mumcom->onIncomingChannelState = std::bind( + &mumble::MumbleChannelJoiner::checkChannel, + &mumbleChannelJoiner, + _1, _2); + + // Handle Server Sync message from Mumble + mumcom->onServerSync = std::bind( + &mumble::MumbleChannelJoiner::maybeJoinChannel, + &mumbleChannelJoiner, + mumcom); + + mumbleConf.user = conf.getString("mumble.user") + '-' + std::to_string(i); + mumcom->connect(mumbleConf); + } pjsuaCommunicator.connect( conf.getString("sip.host"), diff --git a/main.hpp b/main.hpp new file mode 100644 index 0000000..501350c --- /dev/null +++ b/main.hpp @@ -0,0 +1,6 @@ +#pragma once + +// IMPORTANT: The default PJSUA_MAX_CALLS in pjsua.h is 32. +// If you need more, you'll need to re-compile pjsua, too. +// +#define MY_MAX_CALLS 32 diff --git a/media/prompt-pin.msg b/media/prompt-pin.msg index 75a9622..b64d9b8 100644 --- a/media/prompt-pin.msg +++ b/media/prompt-pin.msg @@ -1 +1 @@ -Please enter pin +Please enter pin, followed by the hash symbol diff --git a/media/prompt-pin.wav b/media/prompt-pin.wav index d3a6ebd8a73c5e5fde4d40e8405220b8a21858c8..fe5eecf26434e1633024c8662824ad0198a62612 100644 GIT binary patch delta 74932 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

n4v+d#gq@M>Po=kt#=ZM!i^bO&hAs)UjYWKWF;D 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 delta 19157 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 Xy@KvfhN(?ghP~ zd%(W`&)BKE>VE6`+*7CI6rH@2b{;v4&a`vKsb_1`3tL~a=k2KNv#-Uu*bx)rYjJJ8 z0H`Dm=&^2+Qn#(B^|zTb6XvWrX(r7yi}EbsJTUXPXOmvkn#Ey7Yf?NDt0E`X0l6e5 z?R|U5`Ne5;tE(zrvzw~NOL*_SRzw<_2*4J~*Hb$0_gp%WTI63DD!x&ES8Rx8Or2xB z^AmMLy;A#O@?&3>LLyq2)~59_c*M1g_D=hxh5b$B$f5Q|+u%qB7p>r^jP|%jJXaLi z7r=IqHbRT}40TIg;Qu?-2o_fLkou2uqHHJ+m42lO;Hwdwksp!^gK`M?A5+8sLM?xV zl44aGq=|SwMOx0e#L(l61`!E)#B-dj`nsPRf}F;=4|V69ncwBkCffKpM;1 z2}ai*+ZCV1u2|K9EJd5gk|JG$?-`%l;z(SJqLA3T?}{^#7q7(u-<$0rdxCbGHbjMV z-afMjoNea@ATPQPXzT7iE2r*5=^aS4q!A{$BTQDAaq8oPGs1HklqG#}CQ!EgZC^yj1p-kIDt--jN}3