From cf86277e671fa64c278cf3366406720e4f394e5c Mon Sep 17 00:00:00 2001 From: jenz Date: Sun, 12 Oct 2025 21:18:36 +0100 Subject: [PATCH] restoring ringbuffer to previous state. removing code that seems to leave no effect for now --- extension.cpp | 34 +-------- ringbuffer.cpp | 192 +++++++++++++++++++++++++------------------------ 2 files changed, 99 insertions(+), 127 deletions(-) diff --git a/extension.cpp b/extension.cpp index f4cc087..519d22a 100644 --- a/extension.cpp +++ b/extension.cpp @@ -300,8 +300,6 @@ bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late) //opus edit int err; - //m_OpusEncoder = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, &err); - //m_OpusEncoder = opus_encoder_create(48000, 2, OPUS_APPLICATION_AUDIO, &err);I //content, broadcast, and applications requiring less than 15 ms of coding delay. m_OpusEncoder = opus_encoder_create(48000, 1, OPUS_APPLICATION_VOIP, &err); if (err<0) { @@ -309,8 +307,8 @@ bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late) return false; } opus_encoder_ctl(m_OpusEncoder, OPUS_SET_BITRATE(48000)); - opus_encoder_ctl(m_OpusEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); // Force SILK mode - opus_encoder_ctl(m_OpusEncoder, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_encoder_ctl(m_OpusEncoder, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND)); + opus_encoder_ctl(m_OpusEncoder, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND)); opus_encoder_ctl(m_OpusEncoder, OPUS_SET_COMPLEXITY(10)); opus_encoder_ctl(m_OpusEncoder, OPUS_SET_VBR(0)); @@ -762,10 +760,6 @@ void CVoice::HandleVoiceData() { int16_t aBuffer[TotalSamplesPerFrame]; - size_t OldReadIdx = m_Buffer.m_ReadIndex; - size_t OldCurLength = m_Buffer.CurrentLength(); - size_t OldTotalLength = m_Buffer.TotalLength(); - if(!m_Buffer.Pop(aBuffer, TotalSamplesPerFrame)) { smutils->LogError(myself, "Buffer pop failed!"); @@ -790,22 +784,6 @@ void CVoice::HandleVoiceData() *pFrameSize = (uint16_t)nbBytes; *pTotalDataLength += sizeof(uint16_t) + nbBytes; FinalSize += nbBytes; - - // Buffer underrun check - for(int Client = 0; Client < MAX_CLIENTS; Client++) - { - CClient *pClient = &m_aClients[Client]; - if(pClient->m_Socket == -1 || pClient->m_New == true) - continue; - - m_Buffer.SetWriteIndex(pClient->m_BufferWriteIndex); - if(m_Buffer.CurrentLength() > pClient->m_LastLength) - { - pClient->m_BufferWriteIndex = m_Buffer.GetReadIndex(); - m_Buffer.SetWriteIndex(pClient->m_BufferWriteIndex); - pClient->m_LastLength = m_Buffer.CurrentLength(); - } - } } // 8. Add CRC32 @@ -813,14 +791,6 @@ void CVoice::HandleVoiceData() memcpy(&aFinal[FinalSize], &crc32_value, sizeof(uint32_t)); FinalSize += sizeof(uint32_t); - /* - smutils->LogMessage(myself, "=== OPUS PACKET ==="); - smutils->LogMessage(myself, "FinalSize: %d, Frames: %d", FinalSize, FramesAvailable); - smutils->LogMessage(myself, "Header bytes: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", - aFinal[0], aFinal[1], aFinal[2], aFinal[3], aFinal[4], aFinal[5], aFinal[6], - aFinal[7], aFinal[8], aFinal[9], aFinal[10], aFinal[11], aFinal[12], aFinal[13]); - */ - BroadcastVoiceData(pClient, FinalSize, aFinal); if (m_AvailableTime < getTime()) diff --git a/ringbuffer.cpp b/ringbuffer.cpp index 93d9185..2df026c 100644 --- a/ringbuffer.cpp +++ b/ringbuffer.cpp @@ -5,158 +5,160 @@ #undef NDEBUG #include -template inline T min(T a, T b) { return a < b ? a : b; } +template inline T min(T a, T b) { return a TotalLength()) - return false; + if(Samples > TotalLength()) + return false; - if(m_ReadIndex + Samples > m_BufferSize) - { - size_t TowardsEnd = m_BufferSize - m_ReadIndex; - memcpy(pBuffer, &m_aBuffer[m_ReadIndex], TowardsEnd * sizeof(*m_aBuffer)); - m_ReadIndex = 0; + if(m_ReadIndex + Samples > m_BufferSize) + { + size_t TowardsEnd = m_BufferSize - m_ReadIndex; + memcpy(pBuffer, &m_aBuffer[m_ReadIndex], TowardsEnd * sizeof(*m_aBuffer)); + m_ReadIndex = 0; - size_t Left = Samples - TowardsEnd; - memcpy(&pBuffer[TowardsEnd], m_aBuffer, Left * sizeof(*m_aBuffer)); - m_ReadIndex = Left; - } - else - { - memcpy(pBuffer, &m_aBuffer[m_ReadIndex], Samples * sizeof(*m_aBuffer)); - m_ReadIndex += Samples; - } + size_t Left = Samples - TowardsEnd; + memcpy(&pBuffer[TowardsEnd], m_aBuffer, Left * sizeof(*m_aBuffer)); + m_ReadIndex = Left; + } + else + { + memcpy(pBuffer, &m_aBuffer[m_ReadIndex], Samples * sizeof(*m_aBuffer)); + m_ReadIndex += Samples; + } - if(m_ReadIndex == m_BufferSize) - m_ReadIndex = 0; + if(m_ReadIndex == m_BufferSize) + m_ReadIndex = 0; - m_Length -= Samples; - return true; + m_Length -= Samples; + + return true; } -// Mix int16_t data into buffer at write index void CRingBuffer::Mix(int16_t *pData, size_t Samples) { - int16_t *pBuffer = &m_aBuffer[m_WriteIndex]; - while(Samples--) - { - int32_t Sample = *pBuffer; - Sample += *pData; + assert(!(m_WriteIndex + Samples > m_BufferSize)); - if(Sample > INT16_MAX) - *pBuffer = INT16_MAX; - else if(Sample < INT16_MIN) - *pBuffer = INT16_MIN; - else - *pBuffer = Sample; + int16_t *pBuffer = &m_aBuffer[m_WriteIndex]; + while(Samples--) + { + int32_t Sample = *pBuffer; + Sample += *pData; - pBuffer++; - pData++; - } + if(Sample > INT16_MAX) + *pBuffer = INT16_MAX; + else if(Sample < INT16_MIN) + *pBuffer = INT16_MIN; + else + *pBuffer = Sample; + + pBuffer++; + pData++; + } } -// Push `Samples` int16_t values into buffer bool CRingBuffer::Push(int16_t *pData, size_t Samples) { - if(Samples > CurrentFree()) - return false; + if(Samples > CurrentFree()) + return false; - // Mix with existing data - if(CurrentLength() < TotalLength()) - { - size_t ToMix = min(Samples, TotalLength() - CurrentLength()); + // Mix with data in front of us + if(CurrentLength() < TotalLength()) + { + // + size_t ToMix = min(Samples, TotalLength() - CurrentLength()); - if(m_WriteIndex + ToMix > m_BufferSize) - { - size_t TowardsEnd = m_BufferSize - m_WriteIndex; - Mix(pData, TowardsEnd); - m_WriteIndex = 0; + if(m_WriteIndex + ToMix > m_BufferSize) + { + size_t TowardsEnd = m_BufferSize - m_WriteIndex; + Mix(pData, TowardsEnd); + m_WriteIndex = 0; - size_t Left = ToMix - TowardsEnd; - Mix(&pData[TowardsEnd], Left); - m_WriteIndex = Left; - } - else - { - Mix(pData, ToMix); - m_WriteIndex += ToMix; - } + size_t Left = ToMix - TowardsEnd; + Mix(&pData[TowardsEnd], Left); + m_WriteIndex = Left; + } + else + { + Mix(pData, ToMix); + m_WriteIndex += ToMix; + } - if(m_WriteIndex == m_BufferSize) - m_WriteIndex = 0; + if(m_WriteIndex == m_BufferSize) + m_WriteIndex = 0; - pData += ToMix; - Samples -= ToMix; - } + pData += ToMix; + Samples -= ToMix; + } - if(!Samples) - return true; + // + if(!Samples) + return true; - if(m_WriteIndex + Samples > m_BufferSize) - { - size_t TowardsEnd = m_BufferSize - m_WriteIndex; - memcpy(&m_aBuffer[m_WriteIndex], pData, TowardsEnd * sizeof(*m_aBuffer)); - m_WriteIndex = 0; + if(m_WriteIndex + Samples > m_BufferSize) + { + size_t TowardsEnd = m_BufferSize - m_WriteIndex; + memcpy(&m_aBuffer[m_WriteIndex], pData, TowardsEnd * sizeof(*m_aBuffer)); + m_WriteIndex = 0; - size_t Left = Samples - TowardsEnd; - memcpy(m_aBuffer, &pData[TowardsEnd], Left * sizeof(*m_aBuffer)); - m_WriteIndex = Left; - } - else - { - memcpy(&m_aBuffer[m_WriteIndex], pData, Samples * sizeof(*m_aBuffer)); - m_WriteIndex += Samples; - } + size_t Left = Samples - TowardsEnd; + memcpy(m_aBuffer, &pData[TowardsEnd], Left * sizeof(*m_aBuffer)); + m_WriteIndex = Left; + } + else + { + memcpy(&m_aBuffer[m_WriteIndex], pData, Samples * sizeof(*m_aBuffer)); + m_WriteIndex += Samples; + } - if(m_WriteIndex == m_BufferSize) - m_WriteIndex = 0; + if(m_WriteIndex == m_BufferSize) + m_WriteIndex = 0; - m_Length += Samples; - return true; + m_Length += Samples; + + return true; } -// Helper functions size_t CRingBuffer::TotalLength() { - return m_Length; + return m_Length; } size_t CRingBuffer::TotalFree() { - return m_BufferSize - m_Length - 1; + return m_BufferSize - m_Length - 1; } size_t CRingBuffer::CurrentLength() { - return ((ssize_t)m_WriteIndex - (ssize_t)m_ReadIndex) % m_BufferSize; + return ((ssize_t)m_WriteIndex - (ssize_t)m_ReadIndex) % m_BufferSize; } size_t CRingBuffer::CurrentFree() { - size_t BufferFree = ((ssize_t)m_ReadIndex - (ssize_t)m_WriteIndex) % m_BufferSize; - return (BufferFree ? BufferFree : m_BufferSize) - 1; + size_t BufferFree = ((ssize_t)m_ReadIndex - (ssize_t)m_WriteIndex) % m_BufferSize; + return (BufferFree ? BufferFree : m_BufferSize) - 1; } size_t CRingBuffer::GetReadIndex() { - return m_ReadIndex; + return m_ReadIndex; } size_t CRingBuffer::GetWriteIndex() { - return m_WriteIndex; + return m_WriteIndex; } void CRingBuffer::SetWriteIndex(size_t WriteIndex) { - m_WriteIndex = WriteIndex % m_BufferSize; + m_WriteIndex = WriteIndex; }