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
	 Michał Słomkowski
						Michał Słomkowski