diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8b864 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs +/out +/temp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5886c77 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,40 @@ +# ITNOA +# CMakeList.txt : CMake project for SipCmd, include source and define +# project specific logic here. +# +cmake_minimum_required (VERSION 3.8) + +project ("SipCmd" VERSION 1.0 LANGUAGES CXX) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +set(PTLib_USE_STATIC_LIBS 1) +find_package(PTLib REQUIRED) + +set(OPAL_USE_STATIC_LIBS 1) +find_package(OPAL REQUIRED) + +find_package(date CONFIG REQUIRED) + +# Add source to this project's library. +add_library(SipCmdLib "src/commands.cpp" "src/channels.cpp") + +target_include_directories(SipCmdLib PUBLIC ${PTLIB_INCLUDE_DIRS}) +target_link_libraries(SipCmdLib PRIVATE ${PTLIB_LIBRARIES}) + +target_include_directories(SipCmdLib PUBLIC ${OPAL_INCLUDE_DIRS}) +target_link_libraries(SipCmdLib PRIVATE ${OPAL_LIBRARIES}) + +target_link_libraries(SipCmdLib PRIVATE date::date date::date-tz) + +# Add source to this project's executable. +add_executable (SipCmd "src/main.cpp") + +target_link_libraries(SipCmd PRIVATE SipCmdLib) +message(${PTLIB_INCLUDE_DIRS}) + +if (CMAKE_VERSION VERSION_GREATER 3.10) + set_property(TARGET SipCmdLib PROPERTY CXX_STANDARD 14) + set_property(TARGET SipCmd PROPERTY CXX_STANDARD 14) +endif() + +# TODO: Add tests and install targets if needed. diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..dd02e97 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,108 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "all-base", + "hidden": true, + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + }, + { + "name": "windows-base", + "inherits": "all-base", + "hidden": true, + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + } + }, + { + "name": "x64-debug", + "displayName": "x64 Debug", + "inherits": "windows-base", + "architecture": { + "value": "x64", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "x64-release", + "displayName": "x64 Release", + "inherits": "x64-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "x86-debug", + "displayName": "x86 Debug", + "inherits": "windows-base", + "architecture": { + "value": "x86", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "x86-release", + "displayName": "x86 Release", + "inherits": "x86-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "linux-debug", + "inherits": "all-base", + "displayName": "Linux Debug", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Linux" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + }, + { + "name": "macos-debug", + "displayName": "macOS Debug", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Darwin" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + } + ] +} diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 0000000..a8d0f6b --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,2 @@ +echo "export VCPKG_ROOT=~/vcpkg" >> ~/.env +source ~/.env \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..2f978a5 --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=/home/ssoroosh/vcpkg/scripts/buildsystems/vcpkg.cmake \ No newline at end of file diff --git a/cmake/Modules/FindOPAL.cmake b/cmake/Modules/FindOPAL.cmake new file mode 100644 index 0000000..23c3346 --- /dev/null +++ b/cmake/Modules/FindOPAL.cmake @@ -0,0 +1,161 @@ +#------------------------------------------------------------------------------------ +# ITNOA +# +# This file is based on https://github.com/snikulov/cmake-modules +# +# Locate OPAL library (http://www.opalvoip.org/) +# This module defines +# OPAL_FOUND, if false, do not try to link to OPAL +# OPAL_LIBRARIES +# OPAL_INCLUDE_DIRS, where to find opal headers +# +# 2013/03/19 - aagenosov +# Module created +# 2013/03/21 - aagenosov +# Added macro to define version of OPAL +# 2015/08/13 - snikulov +# Added linux support +#------------------------------------------------------------------------------------- + +# get version macro +# first param - path to include +macro(opal_get_version _include_PATH version) + if (EXISTS "${_include_PATH}/opal/buildopts.h") + file(STRINGS "${_include_PATH}/opal/buildopts.h" _VER_STRING_AUX REGEX ".*#define[ ]+OPAL_VERSION[ ]+") + else() + file(STRINGS "${_include_PATH}/opal_config.h" _VER_STRING_AUX REGEX ".*#define[ ]+OPAL_VERSION[ ]+") + endif() + string(REGEX MATCHALL "[0-9]+[.][0-9]+[.][0-9]+" ${version} "${_VER_STRING_AUX}") +endmacro() + +find_package(PTLib REQUIRED) + +include(FindPkgConfig) +PKG_CHECK_MODULES(PC_OPAL "opal") + +find_path(OPAL_INCLUDE_DIRS opal.h + PATHS + ${PC_OPAL_INCLUDE_DIRS} + /usr/local/include + /usr/include + /opt/local/include + /opt/csw/include + /opt/include + $ENV{OPAL_DIR}/include + ${OPAL_DIR}/include + ) + +if(PC_OPAL_FOUND) + + set(OPAL_VERSION ${PC_OPAL_VERSION}) + set(OPAL_INCLUDE_DIRS ${PC_OPAL_INCLUDE_DIRS}) + + find_library(OPAL_LIBRARIES + NAMES ${PC_OPAL_LIBRARIES} + PATH ${PC_OPAL_LIBRARY_DIRS}) + +else() + + if(OPAL_USE_STATIC_LIBS) + set(opal_postfix "${opal_postfix}S") + endif() + + set(OPAL_NAME_RELEASE "opal${opal_postfix}") + set(OPAL_NAME_DEBUG "opal${opal_postfix}D") + set(OPAL64_NAME_RELEASE "opal64${opal_postfix}") + set(OPAL64_NAME_DEBUG "opal64${opal_postfix}D") + + + find_library(OPAL_LIBRARY_RELEASE + NAMES + ${OPAL_NAME_RELEASE} + ${OPAL64_NAME_RELEASE} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{OPAL_DIR}/lib + ${OPAL_DIR}/lib + NO_DEFAULT_PATH + ) + + find_library(OPAL_LIBRARY_DEBUG + NAMES + ${OPAL_NAME_DEBUG} + ${OPAL64_NAME_DEBUG} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{OPAL_DIR}/lib + ${OPAL_DIR}/lib + NO_DEFAULT_PATH + ) + + if(OPAL_INCLUDE_DIRS) + opal_get_version(${OPAL_INCLUDE_DIRS} OPAL_VERSION) + endif() + + if(OPAL_LIBRARY_DEBUG AND OPAL_LIBRARY_RELEASE) + set(OPAL_LIBRARIES + debug ${OPAL_LIBRARY_DEBUG} + optimized ${OPAL_LIBRARY_RELEASE} + CACHE STRING "OPAL Libraries") + endif() +endif() + +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set OPAL_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPAL DEFAULT_MSG OPAL_LIBRARIES OPAL_INCLUDE_DIRS) + +MARK_AS_ADVANCED(OPAL_INCLUDE_DIRS OPAL_LIBRARIES + OPAL_LIBRARY_DEBUG OPAL_LIBRARY_RELEASE) + +if(OPAL_FOUND) + message("-- OPAL version is: ${OPAL_VERSION}") + # short hack for install and copy + if(NOT OPAL_USE_STATIC_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Windows") + find_file(OPAL_DLL_RELEASE + NAMES + ${OPAL_NAME_RELEASE}.dll ${OPAL64_NAME_RELEASE}.dll + PATHS + $ENV{OPAL_DIR}/bin + ${OPAL_DIR}/bin + NO_DEFAULT_PATH + ) + + find_file(OPAL_DLL_DEBUG + NAMES + ${OPAL_NAME_DEBUG}.dll ${OPAL64_NAME_DEBUG}.dll + PATHS + $ENV{OPAL_DIR}/bin + ${OPAL_DIR}/bin + NO_DEFAULT_PATH + ) + get_filename_component(OPAL_RUNTIME_DIR ${OPAL_DLL_DEBUG} PATH) + MARK_AS_ADVANCED(OPAL_DLL_DEBUG OPAL_DLL_RELEASE OPAL_RUNTIME_DIR) + endif() + + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(PATH_TO_OPAL_PLUGINS ${OPAL_RUNTIME_DIR}/plugins) + + if (EXISTS ${PATH_TO_OPAL_PLUGINS} AND IS_DIRECTORY ${PATH_TO_OPAL_PLUGINS}) + file(GLOB _opal_plugins_ "${PATH_TO_OPAL_PLUGINS}/*.dll") + endif() + + set(OPAL_PLUGINS) + foreach(_plugin ${_opal_plugins_}) + list(APPEND OPAL_PLUGINS ${_plugin}) + endforeach() + message("-- OPAL plugins: ${OPAL_PLUGINS}") + MARK_AS_ADVANCED(PATH_TO_OPAL_PLUGINS OPAL_PLUGINS) + endif() +endif() diff --git a/cmake/Modules/FindPTLib.cmake b/cmake/Modules/FindPTLib.cmake new file mode 100644 index 0000000..e0c5727 --- /dev/null +++ b/cmake/Modules/FindPTLib.cmake @@ -0,0 +1,147 @@ +#------------------------------------------------------------------------------------- +# ITNOA +# +# This file is based on https://github.com/snikulov/cmake-modules +# +# Locate PTLib library (http://www.opalvoip.org/) +# This module defines +# PTLIB_FOUND, if false, do not try to link to PTLib +# PTLIB_LIBRARIES +# PTLIB_INCLUDE_DIRS, where to find ptlib headers +# +# 2013/03/19 - aagenosov +# Module created +# 2013/03/21 - aagenosov +# Added macro to define version of PTLib +## 2015/08/13 - snikulov +# Added linux support +#------------------------------------------------------------------------------------- + +# get version macro +# first param - path to include +macro(ptlib_get_version _include_PATH version) + if(EXISTS "${_include_PATH}/ptbuildopts.h") + file(STRINGS "${_include_PATH}/ptbuildopts.h" _VER_STRING_AUX REGEX ".*#define[ ]+PTLIB_VERSION[ ]+") + else() + file(STRINGS "${_include_PATH}/ptlib_config.h" _VER_STRING_AUX REGEX ".*#define[ ]+PTLIB_VERSION[ ]+") + endif() + string(REGEX MATCHALL "[0-9]+[.][0-9]+[.][0-9]+" ${version} "${_VER_STRING_AUX}") +endmacro() + +include(FindPkgConfig) +PKG_CHECK_MODULES(PC_PTLIB "ptlib") + +find_path(PTLIB_INCLUDE_DIRS ptlib.h + PATHS + ${PC_PTLIB_INCLUDE_DIRS} + /usr/local/include + /usr/include + /opt/local/include + /opt/csw/include + /opt/include + $ENV{PTLIB_DIR}/include + ${PTLIB_DIR}/include + ) + +if(PC_PTLIB_FOUND) + + set(PTLIB_VERSION ${PC_PTLIB_VERSION}) + set(PTLIB_INCULDE_DIRS ${PC_PTLIB_INCLUDE_DIRS}) + + find_library(PTLIB_LIBRARIES + NAMES ${PC_PTLIB_LIBRARIES} + PATH ${PC_PTLIB_LIBRARY_DIRS}) + +else() + + if(PTLib_USE_STATIC_LIBS) + set(ptlib_postfix "${ptlib_postfix}S") + endif() + + set(PTLIB_NAME_RELEASE "ptlib${ptlib_postfix}") + set(PTLIB_NAME_DEBUG "ptlib${ptlib_postfix}D") + set(PTLIB64_NAME_RELEASE "ptlib64${ptlib_postfix}") + set(PTLIB64_NAME_DEBUG "ptlib64${ptlib_postfix}D") + + + find_library(PTLIB_LIBRARY_RELEASE + NAMES + ${PTLIB_NAME_RELEASE} + ${PTLIB64_NAME_RELEASE} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{PTLIB_DIR}/lib + ${PTLIB_DIR}/lib + NO_DEFAULT_PATH + ) + + find_library(PTLIB_LIBRARY_DEBUG + NAMES + ${PTLIB_NAME_DEBUG} + ${PTLIB64_NAME_DEBUG} + PATHS + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt + $ENV{PTLIB_DIR}/lib + ${PTLIB_DIR}/lib + NO_DEFAULT_PATH + ) + + if(PTLIB_INCLUDE_DIRS) + ptlib_get_version(${PTLIB_INCLUDE_DIRS} PTLIB_VERSION) + endif() + + if(PTLIB_LIBRARY_DEBUG AND PTLIB_LIBRARY_RELEASE) + set(PTLIB_LIBRARIES + debug ${PTLIB_LIBRARY_DEBUG} + optimized ${PTLIB_LIBRARY_RELEASE} + CACHE STRING "PTLib Libraries") + endif() +endif() + +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set PTLIB_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PTLib DEFAULT_MSG PTLIB_LIBRARIES PTLIB_INCLUDE_DIRS) + +MARK_AS_ADVANCED(PTLIB_INCLUDE_DIRS PTLIB_LIBRARIES + PTLIB_LIBRARY_DEBUG PTLIB_LIBRARY_RELEASE PTLIB_VERSION) + +if(PTLIB_FOUND) + message("-- PTLib version is: ${PTLIB_VERSION}") + + # if we found the ptlib - and using dll's + # short hack for install and copy + if(NOT PTLib_USE_STATIC_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Windows") + find_file(PTLIB_DLL_RELEASE + NAMES + ${PTLIB_NAME_RELEASE}.dll ${PTLIB64_NAME_RELEASE}.dll + PATHS + $ENV{PTLIB_DIR}/bin + ${PTLIB_DIR}/bin + NO_DEFAULT_PATH + ) + + find_file(PTLIB_DLL_DEBUG + NAMES + ${PTLIB_NAME_DEBUG}.dll ${PTLIB64_NAME_DEBUG}.dll + PATHS + $ENV{PTLIB_DIR}/bin + ${PTLIB_DIR}/bin + NO_DEFAULT_PATH + ) + get_filename_component(PTLIB_RUNTIME_DIR ${PTLIB_DLL_DEBUG} PATH) + MARK_AS_ADVANCED(PTLIB_DLL_DEBUG PTLIB_DLL_RELEASE) + endif() + +endif() diff --git a/src/channels.cpp b/src/channels.cpp index 8b2fc80..33bcd8f 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -28,6 +28,8 @@ #include "main.h" #include "state.h" +using namespace std; + bool TestChanAudio::PlaybackAudio(const bool raw_rtp) { std::cout << __func__ << std::endl; @@ -399,7 +401,7 @@ OpalMediaStream *LocalConnection::CreateMediaStream( bool RawMediaStream::ReadData(BYTE *data, PINDEX size, PINDEX &length) { //cout << __func__ << endl; length = 0; - if (!isOpen) { + if (!IsOpen()) { cout << "channel not open!" << endl; return false; } @@ -430,7 +432,7 @@ bool RawMediaStream::WriteData(const BYTE *data, PINDEX length, PINDEX &written) { // cout << __func__ << endl; - if (!isOpen) { + if (!IsOpen()) { cout << "channel not open!" << endl; return false; } diff --git a/src/commands.cpp b/src/commands.cpp index 0a40a57..bae3b41 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -21,13 +21,19 @@ #include #include #include +#include #include -#include #include +#include + +#include #include "commands.h" #include "state.h" + using namespace date; + using namespace std::chrono; + //// // Command std::string Command::errorstring; @@ -157,12 +163,11 @@ bool Call::RunCommand(const std::string &loopsuffix) { // if one has been specified and there is no address for username PString rp = remoteparty; PString gw = TPState::Instance().GetGateway(); - char buf[256]; - time_t secsnow = time(NULL); + system_clock::time_point secsnow = system_clock::now(); if(rp.Find('@') == P_MAX_INDEX && !gw.IsEmpty()) { cout << "TestPhone::Main: calling \"" << rp << "\" using gateway \"" << gw << "\"" - << " at " << ctime_r(&secsnow, buf) << endl; + << " at " << secsnow << endl; switch (TPState::Instance().GetProtocol()) { case TPState::SIP: rp = "sip:" + rp + "@" + gw; break; @@ -176,7 +181,7 @@ bool Call::RunCommand(const std::string &loopsuffix) { } else { cout << "TestPhone::Main: calling \"" << rp << "\"" - << " at " << ctime_r(&secsnow, buf) << endl; + << " at " << secsnow << endl; } // dial out @@ -191,12 +196,12 @@ bool Call::RunCommand(const std::string &loopsuffix) { do { cout << "TestPhone::Main: calling \"" << rp << "\"" - << " for " << difftime(time(NULL), secsnow) << endl; + << " for " << duration_cast(system_clock::now() - secsnow).count() << endl; state = tpstate.WaitForStateChange(TPState::ESTABLISHED); if(state == TPState::TERMINATED) { errorstring = "Call: application terminated"; return false; - } else if (difftime(time(NULL), secsnow) > dialtimeout / 1000.0) { + } else if (duration_cast(system_clock::now() - secsnow).count() > dialtimeout / 1000.0) { errorstring = "Call: Dial timed out"; return false; } @@ -235,9 +240,7 @@ bool Answer::ParseCommand( bool Answer::RunCommand(const std::string &loopsuffix) { std::cout << "## Answer ##" << std::endl; - char buf[256]; - time_t secsnow = time(NULL); - cout << "Answer: starting at " << ctime_r(&secsnow, buf) << endl; + cout << "Answer: starting at " << system_clock::now() << endl; // set up PString token; @@ -282,9 +285,7 @@ bool Hangup::ParseCommand( bool Hangup::RunCommand(const std::string &loopsuffix) { std::cout << "## Hangup ##" << std::endl; - char buf[256]; - time_t secsnow = time(NULL); - cout << "Hangup: at " << ctime_r(&secsnow, buf) << endl; + cout << "Hangup: at " << system_clock::now() << endl; TPState &tpstate = TPState::Instance(); // hangup @@ -391,7 +392,7 @@ bool Record::ParseCommand( errorstring = "Record: No digits or invalid digits specified"; return false; } - sscanf(*cmds, "%u", &millis); + sscanf_s(*cmds, "%u", &millis); *cmds = &((*cmds)[i]); // filename for(i = 0U; (*cmds)[i] && (*cmds)[i] != ';'; i++); @@ -465,7 +466,7 @@ bool Wait::ParseCommand( return false; } - sscanf(*cmds, "%u", &millis); + sscanf_s(*cmds, "%llu", &millis); *cmds = &((*cmds)[i]); sequence.push_back(this); return true; @@ -497,7 +498,7 @@ bool Wait::RunCommand(const std::string &loopsuffix) { return true; } //cout << "Wait: usleep " << n << endl; - usleep(WAIT_SLEEP_ACCURACY * 1000); + std::this_thread::sleep_for(std::chrono::duration(WAIT_SLEEP_ACCURACY)); if(!closed && TPState::Instance().GetState() == TPState::TERMINATED) { errorstring = "Wait: application terminated"; @@ -553,7 +554,7 @@ bool Loop::ParseCommand( size_t numdigits = strspn(*cmds, "0123456789"); if(numdigits && numdigits < 8) - sscanf(*cmds, "%d", &loops); + sscanf_s(*cmds, "%d", &loops); (*cmds) += numdigits; if(tolower(**cmds) == 'l') { @@ -592,12 +593,10 @@ bool Loop::RunCommand(const std::string &loopsuffix) { int timesleft = 0; do { - char buf[256]; - time_t secsnow = time(NULL); stringstream newsuffix; newsuffix << loopsuffix << "_" << timesleft; cout << "Loop: iteration \"" << newsuffix.str() - << "\" at " << ctime_r(&secsnow, buf) << endl; + << "\" at " << system_clock::now() << endl; if(!Command::Run(loopedsequence, newsuffix.str())) return false; diff --git a/src/includes.h b/src/includes.h index 58c4938..734bc23 100644 --- a/src/includes.h +++ b/src/includes.h @@ -23,12 +23,18 @@ #include #include #include + +#ifdef WIN32 +#include +#include +#else #include +#endif #ifdef DEBUG -#define debug cout +#define debug std::cout #else -#define debug 0 && cout +#define debug 0 && std::cout #endif #endif diff --git a/src/main.cpp b/src/main.cpp index 2b63bce..a9b52a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include "main.h" #include "commands.h" @@ -162,12 +164,15 @@ void signalHandler(int sig) { } void initSignalHandling() { + // FIXME + /* struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_RESTART; sa.sa_handler = signalHandler; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); + */ } TestProcess::TestProcess() : @@ -459,10 +464,8 @@ bool Manager::SendDTMF(const PString &dtmf) // sleep a while std::cout << "sent DTMF: [" << dtmf[i] << "]" << std::endl; - struct timespec tp; - tp.tv_sec = 0; - tp.tv_nsec = 500 * 1000 * 1000; // half a second - nanosleep (&tp, 0); + using namespace std::chrono_literals; + std::this_thread::sleep_for(500ms); } } ok = (i == dtmf.GetSize() - 1 ? true : false); @@ -474,7 +477,7 @@ bool Manager::SendDTMF(const PString &dtmf) return ok; } -RTPSession::RTPSession(const Params& options) : RTP_UDP(options), m_audioformat(NULL) +RTPSession::RTPSession(const Init& options) : OpalRTPSession(options), m_audioformat(NULL) { std::cout << "RTP session created" << std::endl; } @@ -503,9 +506,8 @@ void RTPSession::SelectAudioFormat(const Payload payload) } } -RTP_Session::SendReceiveStatus RTPSession::OnReceiveData(RTP_DataFrame &frame) +OpalRTPSession::SendReceiveStatus RTPSession::OnReceiveData(RTP_DataFrame &frame) { - SendReceiveStatus ret = RTP_UDP::Internal_OnReceiveData(frame); #if 1 // master dump std::ostringstream os; frame.PrintOn(os); @@ -514,12 +516,11 @@ RTP_Session::SendReceiveStatus RTPSession::OnReceiveData(RTP_DataFrame &frame) TPState::Instance().GetRecordAudio().RecordFromBuffer( (const char*)frame.GetPayloadPtr(), frame.GetPayloadSize(), true); - return ret; + return OpalRTPSession::SendReceiveStatus::e_ProcessPacket; } -RTP_Session::SendReceiveStatus RTPSession::OnSendData(RTP_DataFrame &frame) +OpalRTPSession::SendReceiveStatus RTPSession::OnSendData(RTP_DataFrame &frame) { - SendReceiveStatus ret = RTP_UDP::Internal_OnSendData(frame); #if 1 // master dump std::ostringstream os; @@ -527,17 +528,16 @@ RTP_Session::SendReceiveStatus RTPSession::OnSendData(RTP_DataFrame &frame) std::cout << os.str() << std::endl; #endif - return ret; + return OpalRTPSession::SendReceiveStatus::e_IgnorePacket; } -RTP_Session::SendReceiveStatus RTPSession::OnReadTimeout(RTP_DataFrame &frame) { +OpalRTPSession::SendReceiveStatus RTPSession::OnReadTimeout(RTP_DataFrame &frame) { std::cout << __func__ << std::endl; TPState::Instance().GetRecordAudio().StopRecording(false); - return RTP_UDP::OnReadTimeout(frame); + return OpalRTPSession::SendReceiveStatus::e_AbortTransport; } - bool Manager::MakeCall(const PString &remoteParty) { cout << "Setting up a call to: " << remoteParty << endl; @@ -556,7 +556,7 @@ bool Manager::MakeCall(const PString &remoteParty) } // create rtp session - RTP_Session::Params p; + OpalRTPSession::Init p(); p.id = OpalMediaType::Audio().GetDefinition()->GetDefaultSessionId(); p.encoding = OpalMediaType::Audio().GetDefinition()->GetRTPEncoding(); p.userData = new RTPUserData; @@ -662,12 +662,6 @@ bool Manager::OnOpenMediaStream(OpalConnection &connection, return true; } -void RTPUserData::OnTxStatistics(const RTP_Session &session) -{ - cout << __func__ << endl; -} - - OpalConnection::AnswerCallResponse Manager::OnAnswerCall( OpalConnection &connection, const PString &caller) diff --git a/src/main.h b/src/main.h index 1d9407b..5445bfe 100644 --- a/src/main.h +++ b/src/main.h @@ -22,6 +22,7 @@ #define CS_MANAGER_H #include "includes.h" +#include "rtp/rtp_session.h" class Manager; @@ -73,8 +74,8 @@ class LocalEndPoint : public OpalLocalEndPoint { }; -class RTPSession : public RTP_UDP { - PCLASSINFO(RTPSession, RTP_UDP); +class RTPSession : public OpalRTPSession { + PCLASSINFO(RTPSession, OpalRTPSession); public: enum Payload { @@ -83,16 +84,16 @@ class RTPSession : public RTP_UDP { G711_ULAW }; - RTPSession(const Params& options); + RTPSession(const Init& options); virtual SendReceiveStatus OnReceiveData( - RTP_DataFrame &frame); + RTP_DataFrame &frame) override; virtual SendReceiveStatus OnSendData( - RTP_DataFrame &frame); + RTP_DataFrame &frame) override; virtual SendReceiveStatus OnReadTimeout( - RTP_DataFrame &frame); + RTP_DataFrame &frame) override; void SelectAudioFormat(const Payload p); OpalAudioFormat &GetAudioFormat() const { return *m_audioformat; } @@ -102,13 +103,6 @@ class RTPSession : public RTP_UDP { // xxx }; -class RTPUserData : public RTP_UserData { - public: - RTPUserData() : RTP_UserData() {} - - virtual void OnTxStatistics(const RTP_Session &session); -}; - class Manager : public OpalManager { PCLASSINFO(Manager, OpalManager); diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..7edb91f --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", + "name": "sipcmd", + "version-string": "0.1.0", + "dependencies": [ + "date" + ] +} \ No newline at end of file