Move add_port to call after incoming call.
This commit is contained in:
		
							parent
							
								
									237b4057ab
								
							
						
					
					
						commit
						c4e0ce5f14
					
				| @ -1,7 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <functional> | #include <functional> | ||||||
| #include <inttypes.h> | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| class ICommunicator { | class ICommunicator { | ||||||
| public: | public: | ||||||
|  | |||||||
| @ -11,18 +11,30 @@ using namespace std; | |||||||
| /**
 | /**
 | ||||||
|  * These are 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 = -1; | ||||||
| static sip::PjsuaCommunicator *pjsuaCommunicator = nullptr; | static sip::PjsuaCommunicator *pjsuaCommunicator = nullptr; | ||||||
| 
 | 
 | ||||||
| static log4cpp::Category &pjLogger = log4cpp::Category::getInstance("PjSip"); | static log4cpp::Category &pjLogger = log4cpp::Category::getInstance("PjSip"); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void onCallMediaState(pjsua_call_id call_id) { | void sip::PjsuaCommunicator_onCallMediaState(pjsua_call_id call_id) { | ||||||
|     pjsua_call_info ci; |     pjsua_call_info ci; | ||||||
| 
 | 
 | ||||||
|     pjsua_call_get_info(call_id, &ci); |     pjsua_call_get_info(call_id, &ci); | ||||||
| 
 | 
 | ||||||
|     if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) { |     if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) { | ||||||
|  | 
 | ||||||
|  |         if (mediaPortSlot == -1) { | ||||||
|  |             pj_status_t status = pjsua_conf_add_port( | ||||||
|  |                     pjsuaCommunicator->pool, | ||||||
|  |                     pjsuaCommunicator->mediaPort, | ||||||
|  |                     &mediaPortSlot); | ||||||
|  | 
 | ||||||
|  |             if (status != PJ_SUCCESS) { | ||||||
|  |                 throw sip::Exception("error when calling pjsua_conf_add_port", status); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         pjsua_conf_connect(ci.conf_slot, mediaPortSlot); |         pjsua_conf_connect(ci.conf_slot, mediaPortSlot); | ||||||
|         pjsua_conf_connect(mediaPortSlot, ci.conf_slot); |         pjsua_conf_connect(mediaPortSlot, ci.conf_slot); | ||||||
|     } |     } | ||||||
| @ -63,7 +75,9 @@ static void onCallState(pjsua_call_id call_id, | |||||||
|     pjLogger.info("Call %d state=%s.", call_id, ci.state_text.ptr); |     pjLogger.info("Call %d state=%s.", call_id, ci.state_text.ptr); | ||||||
| 
 | 
 | ||||||
|     string address = string(ci.remote_info.ptr); |     string address = string(ci.remote_info.ptr); | ||||||
|     address = address.substr(5, address.size() - 5 - 1); | 
 | ||||||
|  |     boost::replace_all(address, "<", ""); | ||||||
|  |     boost::replace_all(address, ">", ""); | ||||||
| 
 | 
 | ||||||
|     if (ci.state == PJSIP_INV_STATE_CONFIRMED) { |     if (ci.state == PJSIP_INV_STATE_CONFIRMED) { | ||||||
|         auto msgText = "Start call from " + address + "."; |         auto msgText = "Start call from " + address + "."; | ||||||
| @ -121,7 +135,7 @@ sip::PjsuaCommunicator::PjsuaCommunicator() | |||||||
| 
 | 
 | ||||||
|     generalConfig.cb.on_incoming_call = &onIncomingCall; |     generalConfig.cb.on_incoming_call = &onIncomingCall; | ||||||
|     generalConfig.cb.on_dtmf_digit = &onDtmfDigit; |     generalConfig.cb.on_dtmf_digit = &onDtmfDigit; | ||||||
|     generalConfig.cb.on_call_media_state = &onCallMediaState; |     generalConfig.cb.on_call_media_state = &PjsuaCommunicator_onCallMediaState; | ||||||
|     generalConfig.cb.on_call_state = &onCallState; |     generalConfig.cb.on_call_state = &onCallState; | ||||||
| 
 | 
 | ||||||
|     pjsua_logging_config logConfig; |     pjsua_logging_config logConfig; | ||||||
| @ -129,23 +143,28 @@ sip::PjsuaCommunicator::PjsuaCommunicator() | |||||||
|     logConfig.cb = pjLogToLog4CppBridgeFunction; |     logConfig.cb = pjLogToLog4CppBridgeFunction; | ||||||
|     logConfig.console_level = 5; |     logConfig.console_level = 5; | ||||||
| 
 | 
 | ||||||
|     status = pjsua_init(&generalConfig, &logConfig, NULL); |     pjsua_media_config mediaConfig; | ||||||
|  |     pjsua_media_config_default(&mediaConfig); | ||||||
|  |     mediaConfig.max_media_ports = 3; | ||||||
|  | 
 | ||||||
|  |     status = pjsua_init(&generalConfig, &logConfig, &mediaConfig); | ||||||
|     if (status != PJ_SUCCESS) { |     if (status != PJ_SUCCESS) { | ||||||
|         throw sip::Exception("Error in pjsua_init()", status); |         throw sip::Exception("error in pjsua_init", status); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pjsua_set_null_snd_dev(); |     status = pjsua_set_null_snd_dev(); | ||||||
|  |     if (status != PJ_SUCCESS) { | ||||||
|  |         throw sip::Exception("error setting null device", status); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     pj_caching_pool cachingPool; |     pj_caching_pool cachingPool; | ||||||
|     pj_caching_pool_init(&cachingPool, &pj_pool_factory_default_policy, 0); |     pj_caching_pool_init(&cachingPool, &pj_pool_factory_default_policy, 0); | ||||||
|     pj_pool_t *pool = pj_pool_create(&cachingPool.factory, "wav", 32768, 8192, nullptr); |     pool = pj_pool_create(&cachingPool.factory, "wav", 32768, 8192, nullptr); | ||||||
| 
 | 
 | ||||||
|     // todo calculate sizes
 |     // todo calculate sizes
 | ||||||
|     pjmedia_circ_buf_create(pool, 960 * 10, &inputBuff); |     pjmedia_circ_buf_create(pool, 960 * 10, &inputBuff); | ||||||
| 
 | 
 | ||||||
|     mediaPort = createMediaPort(); |     mediaPort = createMediaPort(); | ||||||
| 
 |  | ||||||
|     pjsua_conf_add_port(pool, mediaPort, &mediaPortSlot); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void sip::PjsuaCommunicator::connect( | void sip::PjsuaCommunicator::connect( | ||||||
| @ -166,7 +185,6 @@ void sip::PjsuaCommunicator::connect( | |||||||
|         throw sip::Exception("Error creating transport", status); |         throw sip::Exception("Error creating transport", status); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Initialization is done, now start sip */ |  | ||||||
|     status = pjsua_start(); |     status = pjsua_start(); | ||||||
|     if (status != PJ_SUCCESS) { |     if (status != PJ_SUCCESS) { | ||||||
|         throw sip::Exception("Error starting sip", status); |         throw sip::Exception("Error starting sip", status); | ||||||
| @ -177,6 +195,10 @@ void sip::PjsuaCommunicator::connect( | |||||||
| 
 | 
 | ||||||
| sip::PjsuaCommunicator::~PjsuaCommunicator() { | sip::PjsuaCommunicator::~PjsuaCommunicator() { | ||||||
|     pjsua_destroy(); |     pjsua_destroy(); | ||||||
|  | 
 | ||||||
|  |     if (mediaPort != nullptr) { | ||||||
|  |         delete mediaPort; | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pjmedia_port *sip::PjsuaCommunicator::createMediaPort() { | pjmedia_port *sip::PjsuaCommunicator::createMediaPort() { | ||||||
|  | |||||||
| @ -3,6 +3,9 @@ | |||||||
| #include "ICommunicator.hpp" | #include "ICommunicator.hpp" | ||||||
| 
 | 
 | ||||||
| #include <pjmedia.h> | #include <pjmedia.h> | ||||||
|  | #include <pjsua-lib/pjsua.h> | ||||||
|  | 
 | ||||||
|  | #undef isblank | ||||||
| 
 | 
 | ||||||
| #include <log4cpp/Category.hh> | #include <log4cpp/Category.hh> | ||||||
| #include <boost/noncopyable.hpp> | #include <boost/noncopyable.hpp> | ||||||
| @ -47,6 +50,8 @@ namespace sip { | |||||||
| 
 | 
 | ||||||
|     pj_status_t MediaPort_putFrameRawCallback(pjmedia_port *port, pjmedia_frame *frame); |     pj_status_t MediaPort_putFrameRawCallback(pjmedia_port *port, pjmedia_frame *frame); | ||||||
| 
 | 
 | ||||||
|  |     void PjsuaCommunicator_onCallMediaState(pjsua_call_id call_id); | ||||||
|  | 
 | ||||||
|     class PjsuaCommunicator : public ICommunicator, boost::noncopyable { |     class PjsuaCommunicator : public ICommunicator, boost::noncopyable { | ||||||
|     public: |     public: | ||||||
|         PjsuaCommunicator(); |         PjsuaCommunicator(); | ||||||
| @ -68,7 +73,9 @@ namespace sip { | |||||||
|         log4cpp::Category &callbackLogger; |         log4cpp::Category &callbackLogger; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         pjmedia_port *mediaPort; |         pjmedia_port *mediaPort = nullptr; | ||||||
|  | 
 | ||||||
|  |         pj_pool_t *pool = nullptr; | ||||||
| 
 | 
 | ||||||
|         pjmedia_circ_buf *inputBuff; |         pjmedia_circ_buf *inputBuff; | ||||||
| 
 | 
 | ||||||
| @ -94,6 +101,8 @@ namespace sip { | |||||||
| 
 | 
 | ||||||
|         friend pj_status_t MediaPort_putFrameRawCallback(pjmedia_port *port, |         friend pj_status_t MediaPort_putFrameRawCallback(pjmedia_port *port, | ||||||
|                                                          pjmedia_frame *frame); |                                                          pjmedia_frame *frame); | ||||||
|  | 
 | ||||||
|  |         friend void PjsuaCommunicator_onCallMediaState(pjsua_call_id call_id); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								main.cpp
									
									
									
									
									
								
							| @ -1,12 +1,10 @@ | |||||||
| #include "log4cpp/Category.hh" |  | ||||||
| #include "log4cpp/FileAppender.hh" |  | ||||||
| #include "log4cpp/OstreamAppender.hh" |  | ||||||
| 
 |  | ||||||
| #include "PjsuaCommunicator.hpp" | #include "PjsuaCommunicator.hpp" | ||||||
| #include "MumbleCommunicator.hpp" | #include "MumbleCommunicator.hpp" | ||||||
| 
 |  | ||||||
| #include "Configuration.hpp" | #include "Configuration.hpp" | ||||||
| 
 | 
 | ||||||
|  | #include <log4cpp/FileAppender.hh> | ||||||
|  | #include <log4cpp/OstreamAppender.hh> | ||||||
|  | 
 | ||||||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||||||
| 
 | 
 | ||||||
|     log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout); |     log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Michał Słomkowski
						Michał Słomkowski