Add autodeaf so users in other groups see status

This causes the user to be self_mute and self_deaf when there
is no SIP call active. Users in other Mumble groups can then
see whether the user is active without moving to same group.

Note: this needs the updated mumlib with the self_mute and self_deaf
methods
This commit is contained in:
Scott Hardin 2017-05-20 18:17:08 +02:00
parent c04ead2ff5
commit f112cca475
6 changed files with 43 additions and 2 deletions

View File

@ -51,6 +51,8 @@ void mumble::MumbleCommunicator::connect(MumbleCommunicatorConfig &config) {
callback.reset(new MumlibCallback());
mumbleConf = config;
mumConfig = mumlib::MumlibConfiguration();
mumConfig.opusEncoderBitrate = config.opusEncoderBitrate;
@ -59,6 +61,7 @@ void mumble::MumbleCommunicator::connect(MumbleCommunicatorConfig &config) {
callback->mum = mum;
mum->connect(config.host, config.port, config.user, config.password);
mum->self_deaf(1);
}
void mumble::MumbleCommunicator::sendPcmSamples(int16_t *samples, unsigned int length) {
@ -75,4 +78,15 @@ void mumble::MumbleCommunicator::sendTextMessage(std::string message) {
void mumble::MumbleCommunicator::joinChannel(int channel_id) {
mum->joinChannel(channel_id);
if ( mumbleConf.autodeaf ) {
mum->self_mute(1);
mum->self_deaf(1);
}
}
void mumble::MumbleCommunicator::mutedeaf(int status) {
if ( mumbleConf.autodeaf ) {
mum->self_mute(status);
mum->self_deaf(status);
}
}

View File

@ -8,8 +8,10 @@
#include <string>
#include <stdexcept>
namespace mumble {
class Exception : public std::runtime_error {
public:
Exception(const char *message) : std::runtime_error(message) { }
@ -23,6 +25,7 @@ namespace mumble {
std::string host;
int opusEncoderBitrate;
int port = 0;
bool autodeaf;
};
class MumbleCommunicator : boost::noncopyable {
@ -54,11 +57,15 @@ namespace mumble {
void joinChannel(int channel_id);
void mutedeaf(int status);
private:
boost::asio::io_service &ioService;
log4cpp::Category &logger;
MumbleCommunicatorConfig mumbleConf;
mumlib::MumlibConfiguration mumConfig;
std::shared_ptr<mumlib::Mumlib> mum;
@ -66,5 +73,6 @@ namespace mumble {
std::unique_ptr<MumlibCallback> callback;
friend class MumlibCallback;
};
}

View File

@ -144,6 +144,7 @@ namespace sip {
communicator.logger.notice(msgText);
communicator.onStateChange(msgText);
communicator.onMuteDeafChange(0);
} else if (ci.state == PJSIP_INV_STATE_DISCONNECTED) {
auto &acc = dynamic_cast<_Account &>(account);
@ -154,6 +155,7 @@ namespace sip {
communicator.logger.notice(msgText);
communicator.onStateChange(msgText);
communicator.onMuteDeafChange(1);
acc.available = true;
}

View File

@ -80,6 +80,8 @@ namespace sip {
std::function<void(std::string)> onStateChange;
std::function<void(int)> onMuteDeafChange;
pj_status_t mediaPortGetFrame(pjmedia_port *port, pjmedia_frame *frame);
pj_status_t mediaPortPutFrame(pjmedia_port *port, pjmedia_frame *frame);

View File

@ -23,6 +23,11 @@ user = mumsi
password = foobar
channelNameExpression =
# When here is no SIP connection, the mumble state is set to self_mute/self_deaf
# so the other users can easily see whether the SIP is connected even when not
# in the same group
autodeaf = 0
# Bitrate of Opus encoder in B/s
# Adjust it if you need to meet the specific bandwidth requirements of Murmur server
opusEncoderBitrate = 16000

View File

@ -64,6 +64,10 @@ int main(int argc, char *argv[]) {
&mumble::MumbleCommunicator::sendTextMessage,
&mumbleCommunicator, _1);
pjsuaCommunicator.onMuteDeafChange = std::bind(
&mumble::MumbleCommunicator::mutedeaf,
&mumbleCommunicator, _1);
mumbleCommunicator.onIncomingPcmSamples = std::bind(
&sip::PjsuaCommunicator::sendPcmSamples,
&pjsuaCommunicator,
@ -85,6 +89,12 @@ int main(int argc, char *argv[]) {
mumbleConf.user = conf.getString("mumble.user");
mumbleConf.password = conf.getString("mumble.password");
mumbleConf.opusEncoderBitrate = conf.getInt("mumble.opusEncoderBitrate");
/* default to 'false' if not found */
try {
mumbleConf.autodeaf = conf.getBool("mumble.autodeaf");
} catch (...) {
mumbleConf.autodeaf = false;
}
mumbleCommunicator.connect(mumbleConf);