PjsuaMediaPort.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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_front(samples, count);
  10. mediaPort->fileHandle.write(samples, takenSamples);
  11. mediaPort->logger.debug("Pop %d samples from inputQueue.", takenSamples);
  12. for (int i = takenSamples; i < count; ++i) {
  13. samples[i] = 0;
  14. }
  15. // todo wrzucić sample do wav
  16. frame->type = PJMEDIA_FRAME_TYPE_AUDIO;
  17. return PJ_SUCCESS;
  18. }
  19. pj_status_t pjsua::MediaPort_putFrame(pjmedia_port *port,
  20. pjmedia_frame *frame) {
  21. PjsuaMediaPort *mediaPort = static_cast<PjsuaMediaPort *>(port->port_data.pdata);
  22. pj_int16_t *samples = static_cast<pj_int16_t *>(frame->buf);
  23. pj_size_t count = frame->size / 2 / PJMEDIA_PIA_CCNT(&port->info);
  24. // if (count > 0) {
  25. // mediaPort->outputQueue.push_back(samples, count);
  26. //
  27. // mediaPort->logger.debug("Push %d samples into outputQueue.", count);
  28. // }
  29. return PJ_SUCCESS;
  30. }
  31. PjsuaMediaPort::PjsuaMediaPort(
  32. SoundSampleQueue<SOUND_SAMPLE_TYPE> &inputQueue,
  33. SoundSampleQueue<SOUND_SAMPLE_TYPE> &outputQueue)
  34. : inputQueue(inputQueue),
  35. outputQueue(outputQueue),
  36. _pjmedia_port(nullptr),
  37. logger(log4cpp::Category::getInstance("PjsuaMediaPort")) {
  38. fileHandle = SndfileHandle("capture_pjsua.wav", SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 1, SAMPLING_RATE);
  39. }
  40. pjmedia_port *pjsua::PjsuaMediaPort::create_pjmedia_port() {
  41. _pjmedia_port = new pjmedia_port();
  42. pj_str_t name = toPjString("PjsuaMediaPort");
  43. pj_status_t status = pjmedia_port_info_init(&(_pjmedia_port->info),
  44. &name,
  45. PJMEDIA_SIG_CLASS_PORT_AUD('s', 'i'),
  46. SAMPLING_RATE,
  47. 1,
  48. 16,
  49. SAMPLING_RATE * 20 / 1000); // todo recalculate to match mumble specs
  50. if (status != PJ_SUCCESS) {
  51. throw pjsua::Exception("Error while calling pjmedia_port_info_init().", status);
  52. }
  53. _pjmedia_port->get_frame = &MediaPort_getFrame;
  54. _pjmedia_port->put_frame = &MediaPort_putFrame;
  55. _pjmedia_port->port_data.pdata = this;
  56. return _pjmedia_port;
  57. }
  58. pjsua::PjsuaMediaPort::~PjsuaMediaPort() {
  59. if (this->_pjmedia_port != nullptr) {
  60. delete _pjmedia_port;
  61. }
  62. }