PjsuaCommunicator.hpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #pragma once
  2. #include "IncomingConnectionValidator.hpp"
  3. #include "AudioFramesMixer.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 <climits>
  13. #include <bits/unique_ptr.h>
  14. namespace sip {
  15. constexpr int DEFAULT_PORT = 5060;
  16. constexpr int SAMPLING_RATE = 48000;
  17. class Exception : public std::runtime_error {
  18. public:
  19. Exception(const char *title) : std::runtime_error(title) {
  20. mesg += title;
  21. }
  22. Exception(std::string title) : std::runtime_error(title) {
  23. mesg += title;
  24. }
  25. Exception(const char *title, pj_status_t status) : std::runtime_error(title) {
  26. char errorMsgBuffer[500];
  27. pj_strerror(status, errorMsgBuffer, sizeof(errorMsgBuffer));
  28. mesg += title;
  29. mesg += ": ";
  30. mesg += errorMsgBuffer;
  31. }
  32. virtual const char *what() const throw() override {
  33. return mesg.c_str();
  34. }
  35. private:
  36. std::string mesg;
  37. };
  38. class _LogWriter;
  39. class _Account;
  40. class _Call;
  41. class _MumlibAudioMedia;
  42. class PjsuaCommunicator : boost::noncopyable {
  43. public:
  44. PjsuaCommunicator(IncomingConnectionValidator &validator, int frameTimeLength);
  45. void connect(
  46. std::string host,
  47. std::string user,
  48. std::string password,
  49. unsigned int port = DEFAULT_PORT);
  50. virtual ~PjsuaCommunicator();
  51. void sendPcmSamples(
  52. int sessionId,
  53. int sequenceNumber,
  54. int16_t *samples,
  55. unsigned int length);
  56. std::string pin;
  57. std::string got_dtmf;
  58. std::function<void(int16_t *, int)> onIncomingPcmSamples;
  59. std::function<void(std::string)> onStateChange;
  60. std::function<void(int)> onMuteDeafChange;
  61. pj_status_t mediaPortGetFrame(pjmedia_port *port, pjmedia_frame *frame);
  62. pj_status_t mediaPortPutFrame(pjmedia_port *port, pjmedia_frame *frame);
  63. private:
  64. log4cpp::Category &logger;
  65. log4cpp::Category &pjsuaLogger;
  66. std::unique_ptr<mixer::AudioFramesMixer> mixer;
  67. std::unique_ptr<_LogWriter> logWriter;
  68. std::unique_ptr<_Account> account;
  69. std::unique_ptr<_MumlibAudioMedia> media;
  70. pj_caching_pool cachingPool;
  71. pj::Endpoint endpoint;
  72. IncomingConnectionValidator &uriValidator;
  73. void registerAccount(std::string host,
  74. std::string user,
  75. std::string password);
  76. friend class _Call;
  77. friend class _Account;
  78. friend class _MumlibAudioMedia;
  79. };
  80. }