Проблема: время от времени я слышу потрескивающие звуки. Похоже, что обратный вызов аудио не работает, хотя журналы сетевого трафика показывают, что пакеты поступают стабильно.
Вот упрощенная логика того, как я загружаю буфер. Я подозреваю, что я неправильно обрабатываю индексы записи/чтения или атомарные операции слишком медленны для обратного вызова.
C++
Код: Выделить всё
void ClientVoiceManager::OnPacketReceived(const Packet& packet) {
// ... payload extraction logic ...
// Validate sequence to handle out-of-order UDP packets
if (IsPacketSequential(packet.sequence_id)) {
// Push to ring buffer
// 'audioData' is a std::vector extracted from packet
bool result = m_ringBuffer->push(audioData.data(), audioData.size());
if (!result) {
// Log warning: Ring buffer overflow
}
}
// ...
}
Код: Выделить всё
void AudioPlayer::AudioCallback(void* outputBuffer, size_t frameCount) {
auto* out = static_cast(outputBuffer);
// Attempt to read 'frameCount' samples from the ring buffer
size_t samplesRead = m_ringBuffer->read(out, frameCount);
if (samplesRead < frameCount) {
// Buffer Underrun: Fill the rest with silence to avoid garbage noise
// (!) I think somewhere here might be the cause
std::memset(out + samplesRead, 0, (frameCount - samplesRead) * sizeof(int16_t));
}
// ...
}
- Увеличил размер LockFreeRingBuffer.
- Отключил rnnoise (шумоподавление), чтобы исключить задержку обработки.
- Проверено, что индексы чтения и записи в кольцевом буфере
std::atomic.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -stability
Мобильная версия