PjsuaMediaPort.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "PjsuaMediaPort.hpp"
  2. using namespace std;
  3. using namespace pjsua;
  4. pj_status_t pjsua::MediaPort_getFrame(pjmedia_port *port,
  5. pjmedia_frame *frame) {
  6. PjsuaMediaPort *mediaPort = static_cast<PjsuaMediaPort *>(port->port_data.pdata);
  7. pj_int16_t *samples = static_cast<pj_int16_t *>(frame->buf);
  8. pj_size_t count = frame->size / 2 / PJMEDIA_PIA_CCNT(&port->info);
  9. int takenSamples = mediaPort->inputQueue.pop(samples, count);
  10. mediaPort->logger.debug("Pop %d samples from inputQueue.", takenSamples);
  11. for (int i = takenSamples; i < count; ++i) {
  12. samples[i] = 0;
  13. }
  14. frame->type = PJMEDIA_FRAME_TYPE_AUDIO;
  15. return PJ_SUCCESS;
  16. }
  17. pj_status_t pjsua::MediaPort_putFrame(pjmedia_port *port,
  18. pjmedia_frame *frame) {
  19. PjsuaMediaPort *mediaPort = static_cast<PjsuaMediaPort *>(port->port_data.pdata);
  20. pj_int16_t *samples = static_cast<pj_int16_t *>(frame->buf);
  21. pj_size_t count = frame->size / 2 / PJMEDIA_PIA_CCNT(&port->info);
  22. mediaPort->outputQueue.push(samples, count);
  23. mediaPort->logger.debug("Push %d samples into outputQueue.", count);
  24. return PJ_SUCCESS;
  25. }
  26. pjmedia_port *pjsua::PjsuaMediaPort::create_pjmedia_port() {
  27. _pjmedia_port = new pjmedia_port();
  28. pj_str_t name = toPjString("PjsuaMediaPort");
  29. pj_status_t status = pjmedia_port_info_init(&(_pjmedia_port->info),
  30. &name,
  31. PJMEDIA_SIG_CLASS_PORT_AUD('s', 'i'),
  32. SAMPLING_RATE,
  33. 1,
  34. 16,
  35. SAMPLING_RATE * 20 / 1000); // todo recalculate to match mumble specs
  36. if (status != PJ_SUCCESS) {
  37. throw pjsua::Exception("Error while calling pjmedia_port_info_init().", status);
  38. }
  39. _pjmedia_port->get_frame = &MediaPort_getFrame;
  40. _pjmedia_port->put_frame = &MediaPort_putFrame;
  41. _pjmedia_port->port_data.pdata = this;
  42. return _pjmedia_port;
  43. }
  44. pjsua::PjsuaMediaPort::~PjsuaMediaPort() {
  45. if (this->_pjmedia_port != nullptr) {
  46. delete _pjmedia_port;
  47. }
  48. }