Audio.hpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #pragma once
  2. #include "Transport.hpp"
  3. #include <opus/opus.h>
  4. #include <chrono>
  5. namespace mumlib {
  6. class MumlibException;
  7. class AudioException : public MumlibException {
  8. public:
  9. explicit AudioException(string message) : MumlibException(message) { }
  10. };
  11. struct IncomingAudioPacket {
  12. AudioPacketType type;
  13. int target;
  14. int64_t sessionId;
  15. int64_t sequenceNumber;
  16. uint8_t *audioPayload;
  17. int audioPayloadLength;
  18. };
  19. class Audio : boost::noncopyable {
  20. public:
  21. Audio(int opusSampleRate, int opusEncoderBitrate);
  22. virtual ~Audio();
  23. IncomingAudioPacket decodeIncomingAudioPacket(uint8_t *inputBuffer, int inputBufferLength);
  24. std::pair<int, bool> decodeOpusPayload(uint8_t *inputBuffer,
  25. int inputLength,
  26. int16_t *pcmBuffer,
  27. int pcmBufferSize);
  28. int encodeAudioPacket(
  29. int target,
  30. int16_t *inputPcmBuffer,
  31. int inputLength,
  32. uint8_t *outputBuffer,
  33. int outputBufferSize = MAX_UDP_LENGTH);
  34. void setOpusEncoderBitrate(int bitrate);
  35. int getOpusEncoderBitrate();
  36. void resetEncoder();
  37. private:
  38. log4cpp::Category &logger;
  39. OpusDecoder *opusDecoder;
  40. OpusEncoder *opusEncoder;
  41. int64_t outgoingSequenceNumber;
  42. int sampleRate;
  43. std::chrono::time_point<std::chrono::system_clock> lastEncodedAudioPacketTimestamp;
  44. };
  45. }