Add sequence reset after silence time. #2
This commit is contained in:
parent
a1bb86036c
commit
a67dcedf0c
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include <opus.h>
|
#include <opus.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
namespace mumlib {
|
namespace mumlib {
|
||||||
|
|
||||||
constexpr int SAMPLE_RATE = 48000;
|
constexpr int SAMPLE_RATE = 48000;
|
||||||
@ -32,6 +34,8 @@ namespace mumlib {
|
|||||||
uint8_t *outputBuffer,
|
uint8_t *outputBuffer,
|
||||||
int outputBufferSize = MAX_UDP_LENGTH);
|
int outputBufferSize = MAX_UDP_LENGTH);
|
||||||
|
|
||||||
|
void resetEncoder();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
log4cpp::Category &logger;
|
log4cpp::Category &logger;
|
||||||
|
|
||||||
@ -39,5 +43,7 @@ namespace mumlib {
|
|||||||
OpusEncoder *opusEncoder;
|
OpusEncoder *opusEncoder;
|
||||||
|
|
||||||
int64_t outgoingSequenceNumber;
|
int64_t outgoingSequenceNumber;
|
||||||
|
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> lastEncodedAudioPacketTimestamp;
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -2,12 +2,13 @@
|
|||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
|
static boost::posix_time::seconds RESET_SEQUENCE_NUMBER_INTERVAL(5);
|
||||||
|
|
||||||
mumlib::Audio::Audio()
|
mumlib::Audio::Audio()
|
||||||
:
|
: logger(log4cpp::Category::getInstance("mumlib.Audio")),
|
||||||
logger(log4cpp::Category::getInstance("mumlib.Audio")),
|
opusDecoder(nullptr),
|
||||||
opusDecoder(nullptr),
|
opusEncoder(nullptr),
|
||||||
opusEncoder(nullptr),
|
outgoingSequenceNumber(0) {
|
||||||
outgoingSequenceNumber(1) {
|
|
||||||
|
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
@ -22,6 +23,8 @@ mumlib::Audio::Audio()
|
|||||||
}
|
}
|
||||||
|
|
||||||
opus_encoder_ctl(opusEncoder, OPUS_SET_VBR(0));
|
opus_encoder_ctl(opusEncoder, OPUS_SET_VBR(0));
|
||||||
|
|
||||||
|
resetEncoder();
|
||||||
}
|
}
|
||||||
|
|
||||||
mumlib::Audio::~Audio() {
|
mumlib::Audio::~Audio() {
|
||||||
@ -89,8 +92,16 @@ int mumlib::Audio::decodeAudioPacket(AudioPacketType type,
|
|||||||
|
|
||||||
int mumlib::Audio::encodeAudioPacket(int target, int16_t *inputPcmBuffer, int inputLength, uint8_t *outputBuffer,
|
int mumlib::Audio::encodeAudioPacket(int target, int16_t *inputPcmBuffer, int inputLength, uint8_t *outputBuffer,
|
||||||
int outputBufferSize) {
|
int outputBufferSize) {
|
||||||
//if (!bPreviousVoice)
|
|
||||||
// opus_encoder_ctl(opusState, OPUS_RESET_STATE, NULL); //todo do something with it
|
using namespace std::chrono;
|
||||||
|
|
||||||
|
const int lastAudioPacketSentInterval = duration_cast<milliseconds>(
|
||||||
|
system_clock::now() - lastEncodedAudioPacketTimestamp).count();
|
||||||
|
|
||||||
|
if (lastAudioPacketSentInterval > RESET_SEQUENCE_NUMBER_INTERVAL.total_milliseconds() + 1000) {
|
||||||
|
logger.debug("Last audio packet was sent %d ms ago, resetting encoder.", lastAudioPacketSentInterval);
|
||||||
|
resetEncoder();
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> header;
|
std::vector<uint8_t> header;
|
||||||
|
|
||||||
@ -118,7 +129,21 @@ int mumlib::Audio::encodeAudioPacket(int target, int16_t *inputPcmBuffer, int in
|
|||||||
memcpy(outputBuffer, &header[0], header.size());
|
memcpy(outputBuffer, &header[0], header.size());
|
||||||
memcpy(outputBuffer + header.size(), tmpOpusBuffer, outputSize);
|
memcpy(outputBuffer + header.size(), tmpOpusBuffer, outputSize);
|
||||||
|
|
||||||
outgoingSequenceNumber += 2;
|
int incrementNumber = 100 * inputLength / SAMPLE_RATE;
|
||||||
|
|
||||||
|
outgoingSequenceNumber += incrementNumber;
|
||||||
|
|
||||||
|
lastEncodedAudioPacketTimestamp = std::chrono::system_clock::now();
|
||||||
|
|
||||||
return outputSize + header.size();
|
return outputSize + header.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mumlib::Audio::resetEncoder() {
|
||||||
|
int status = opus_encoder_ctl(opusEncoder, OPUS_RESET_STATE, nullptr);
|
||||||
|
|
||||||
|
if (status != OPUS_OK) {
|
||||||
|
throw AudioException((boost::format("failed to reset encoder: %s") % opus_strerror(status)).str());
|
||||||
|
}
|
||||||
|
|
||||||
|
outgoingSequenceNumber = 0;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user