PjsuaCommunicator.hpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #pragma once
  2. #include "ICommunicator.hpp"
  3. #include "IncomingConnectionValidator.hpp"
  4. #include <pjmedia.h>
  5. #include <pjsua-lib/pjsua.h>
  6. #include <pjsua2.hpp>
  7. #undef isblank
  8. #include <log4cpp/Category.hh>
  9. #include <boost/noncopyable.hpp>
  10. #include <string>
  11. #include <stdexcept>
  12. #include <mutex>
  13. #include <climits>
  14. #include <bits/unique_ptr.h>
  15. namespace sip {
  16. constexpr int DEFAULT_PORT = 5060;
  17. constexpr int SAMPLING_RATE = 48000;
  18. class Exception : public std::runtime_error {
  19. public:
  20. Exception(const char *title) : std::runtime_error(title) {
  21. mesg += title;
  22. }
  23. Exception(const char *title, pj_status_t status) : std::runtime_error(title) {
  24. char errorMsgBuffer[500];
  25. pj_strerror(status, errorMsgBuffer, sizeof(errorMsgBuffer));
  26. mesg += title;
  27. mesg += ": ";
  28. mesg += errorMsgBuffer;
  29. }
  30. virtual const char *what() const throw() override {
  31. return mesg.c_str();
  32. }
  33. private:
  34. std::string mesg;
  35. };
  36. class _LogWriter;
  37. class _Account;
  38. class _Call;
  39. class _MumlibAudioMedia;
  40. class PjsuaCommunicator : public ICommunicator, boost::noncopyable {
  41. public:
  42. PjsuaCommunicator(IncomingConnectionValidator &validator);
  43. void connect(
  44. std::string host,
  45. std::string user,
  46. std::string password,
  47. unsigned int port = DEFAULT_PORT);
  48. ~PjsuaCommunicator();
  49. virtual void sendPcmSamples(int16_t *samples, unsigned int length) override;
  50. std::function<void(std::string)> onStateChange;
  51. pj_status_t mediaPortGetFrame(pjmedia_port *port, pjmedia_frame *frame);
  52. pj_status_t mediaPortPutFrame(pjmedia_port *port, pjmedia_frame *frame);
  53. private:
  54. log4cpp::Category &logger;
  55. log4cpp::Category &pjsuaLogger;
  56. std::unique_ptr<_LogWriter> logWriter;
  57. std::unique_ptr<_Account> account;
  58. std::unique_ptr<_MumlibAudioMedia> media;
  59. pj::Endpoint endpoint;
  60. pj_pool_t *pool = nullptr;
  61. pjmedia_circ_buf *inputBuff;
  62. std::mutex inBuffAccessMutex;
  63. IncomingConnectionValidator &uriValidator;
  64. void registerAccount(std::string host,
  65. std::string user,
  66. std::string password);
  67. friend class _Call;
  68. friend class _Account;
  69. friend class _MumlibAudioMedia;
  70. };
  71. }