Audio.hpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #pragma once
  2. #include "Transport.hpp"
  3. #include <opus/opus.h>
  4. #include <speex/speex_jitter.h>
  5. #include <chrono>
  6. namespace mumlib {
  7. class MumlibException;
  8. class AudioException : public MumlibException {
  9. public:
  10. explicit AudioException(string message) : MumlibException(message) { }
  11. };
  12. struct IncomingAudioPacket {
  13. AudioPacketType type;
  14. int target;
  15. int64_t sessionId;
  16. int64_t sequenceNumber;
  17. uint8_t *audioPayload;
  18. int audioPayloadLength;
  19. };
  20. class Audio : boost::noncopyable {
  21. public:
  22. explicit Audio(int sampleRate=DEFAULT_OPUS_SAMPLE_RATE,
  23. int bitrate=DEFAULT_OPUS_ENCODER_BITRATE,
  24. int channels=DEFAULT_OPUS_NUM_CHANNELS);
  25. virtual ~Audio();
  26. IncomingAudioPacket decodeIncomingAudioPacket(uint8_t *inputBuffer, int inputBufferLength);
  27. void addFrameToBuffer(uint8_t *inputBuffer, int inputLength, int sequence);
  28. // todo: mix audio
  29. void mixAudio(uint8_t *dest, uint8_t *src, int bufferOffset, int inputLength);
  30. void resizeBuffer();
  31. std::pair<int, bool> decodeOpusPayload(int16_t *pcmBuffer,
  32. int pcmBufferSize);
  33. std::pair<int, bool> decodeOpusPayload(uint8_t *inputBuffer,
  34. int inputLength,
  35. int16_t *pcmBuffer,
  36. int pcmBufferSize);
  37. int encodeAudioPacket(
  38. int target,
  39. int16_t *inputPcmBuffer,
  40. int inputLength,
  41. uint8_t *outputBuffer,
  42. int outputBufferSize = MAX_UDP_LENGTH);
  43. void setOpusEncoderBitrate(int bitrate);
  44. int getOpusEncoderBitrate();
  45. void resetEncoder();
  46. void resetJitterBuffer();
  47. private:
  48. log4cpp::Category &logger;
  49. OpusDecoder *opusDecoder;
  50. OpusEncoder *opusEncoder;
  51. JitterBuffer *jbBuffer;
  52. int64_t outgoingSequenceNumber;
  53. unsigned int iSampleRate;
  54. unsigned int iChannels;
  55. unsigned int iFrameSize;
  56. unsigned int iAudioBufferSize;
  57. float *fFadeIn;
  58. float *fFadeOut;
  59. std::chrono::time_point<std::chrono::system_clock> lastEncodedAudioPacketTimestamp;
  60. };
  61. }