PjsuaCommunicator.hpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #pragma once
  2. #include "ICommunicator.hpp"
  3. #include <pjmedia.h>
  4. #include <pjsua-lib/pjsua.h>
  5. #undef isblank
  6. #include <log4cpp/Category.hh>
  7. #include <boost/noncopyable.hpp>
  8. #include <string>
  9. #include <stdexcept>
  10. #include <mutex>
  11. #include <climits>
  12. namespace sip {
  13. constexpr int DEFAULT_PORT = 5060;
  14. constexpr int SAMPLING_RATE = 48000;
  15. class Exception : public std::runtime_error {
  16. public:
  17. Exception(const char *title) : std::runtime_error(title) {
  18. mesg += title;
  19. }
  20. Exception(const char *title, pj_status_t status) : std::runtime_error(title) {
  21. char errorMsgBuffer[500];
  22. pj_strerror(status, errorMsgBuffer, sizeof(errorMsgBuffer));
  23. mesg += title;
  24. mesg += ": ";
  25. mesg += errorMsgBuffer;
  26. }
  27. virtual const char *what() const throw() {
  28. return mesg.c_str();
  29. }
  30. private:
  31. std::string mesg;
  32. };
  33. inline pj_str_t toPjString(std::string &str) {
  34. return pj_str(const_cast<char *>(str.c_str()));
  35. }
  36. class PjsuaCommunicator : public ICommunicator, boost::noncopyable {
  37. public:
  38. PjsuaCommunicator();
  39. void connect(
  40. std::string host,
  41. std::string user,
  42. std::string password,
  43. unsigned int port = DEFAULT_PORT);
  44. ~PjsuaCommunicator();
  45. virtual void sendPcmSamples(int16_t *samples, unsigned int length);
  46. std::function<void(std::string)> onStateChange;
  47. void onCallMediaState(pjsua_call_id call_id);
  48. void onIncomingCall(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata);
  49. void onDtmfDigit(pjsua_call_id callId, int digit);
  50. void onCallState(pjsua_call_id call_id, pjsip_event *e);
  51. pj_status_t mediaPortGetFrame(pjmedia_port *port, pjmedia_frame *frame);
  52. pj_status_t mediaPortPutFrame(pjmedia_port *port, pjmedia_frame *frame);
  53. pj_status_t _mediaPortOnDestroy(pjmedia_port *port);
  54. private:
  55. log4cpp::Category &logger;
  56. log4cpp::Category &callbackLogger;
  57. pjmedia_port mediaPort;
  58. int mediaPortSlot = INT_MIN;
  59. bool eof = false;
  60. pj_pool_t *pool = nullptr;
  61. pjmedia_circ_buf *inputBuff;
  62. std::mutex inBuffAccessMutex;
  63. bool available = true;
  64. void createMediaPort();
  65. void registerAccount(std::string host,
  66. std::string user,
  67. std::string password);
  68. };
  69. }