AudioFramesMixer.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "AudioFramesMixer.hpp"
  2. //// Reset mix buffer.
  3. //Arrays.fill(tempMix, 0);
  4. //
  5. //// Sum the buffers.
  6. //for (final AudioUser user : mix) {
  7. //for (int i = 0; i < tempMix.length; i++) {
  8. //tempMix[i] += user.lastFrame[i];
  9. //}
  10. //}
  11. //
  12. //// Clip buffer for real output.
  13. //for (int i = 0; i < MumbleProtocol.FRAME_SIZE; i++) {
  14. //clipOut[i] = (short) (Short.MAX_VALUE * (tempMix[i] < -1.0f ? -1.0f
  15. //: (tempMix[i] > 1.0f ? 1.0f : tempMix[i])));
  16. //}
  17. mixer::AudioFramesMixer::AudioFramesMixer(pj_pool_factory &poolFactory)
  18. : logger(log4cpp::Category::getInstance("AudioFramesMixer")) {
  19. pool = pj_pool_create(&poolFactory, "media", 32768, 8192, nullptr);
  20. if (!pool) {
  21. throw mixer::Exception("error when creating memory pool");
  22. }
  23. // todo calculate sizes
  24. pj_status_t status = pjmedia_circ_buf_create(pool, 960 * 10, &inputBuff);
  25. if (status != PJ_SUCCESS) {
  26. throw mixer::Exception("error when creating circular buffer", status);
  27. }
  28. }
  29. mixer::AudioFramesMixer::~AudioFramesMixer() {
  30. if (pool != nullptr) {
  31. pj_pool_release(pool);
  32. }
  33. }
  34. void mixer::AudioFramesMixer::addFrameToBuffer(int sessionId, int sequenceNumber, int16_t *samples, int samplesLength) {
  35. std::unique_lock<std::mutex> lock(inBuffAccessMutex);
  36. logger.debug("Pushing %d samples to in-buff.", samplesLength);
  37. pjmedia_circ_buf_write(inputBuff, samples, samplesLength);
  38. }
  39. int mixer::AudioFramesMixer::getMixedSamples(int16_t *mixedSamples, int requestedLength) {
  40. std::unique_lock<std::mutex> lock(inBuffAccessMutex);
  41. int availableSamples = pjmedia_circ_buf_get_len(inputBuff);
  42. const int samplesToRead = std::min(requestedLength, availableSamples);
  43. logger.debug("Pulling %d samples from in-buff.", samplesToRead);
  44. pjmedia_circ_buf_read(inputBuff, mixedSamples, samplesToRead);
  45. return samplesToRead;
  46. }
  47. void mixer::AudioFramesMixer::clean() {
  48. }