Возникли проблемы со стабильностью воспроизведения звукаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Возникли проблемы со стабильностью воспроизведения звука

Сообщение Anonymous »

Некоторый контекст. Архитектура предполагает получение аудиопакетов по UDP, помещение их в пользовательский LockFreeRingBuffer и последующее использование их в обратном вызове вывода звука.
Проблема: время от времени я слышу потрескивающие звуки. Похоже, что обратный вызов аудио не работает, хотя журналы сетевого трафика показывают, что пакеты поступают стабильно.
Вот упрощенная логика того, как я загружаю буфер. Я подозреваю, что я неправильно обрабатываю индексы записи/чтения или атомарные операции слишком медленны для обратного вызова.
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
}
}
// ...
}
C++

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»