diff --git a/src/media/audio/ringbuffer.cpp b/src/media/audio/ringbuffer.cpp index 2c03e867e1c5135a43705362244fc8e7645a06f2..7ae81718b4e0b3c229aaf08e63d102714ad36f2b 100644 --- a/src/media/audio/ringbuffer.cpp +++ b/src/media/audio/ringbuffer.cpp @@ -266,11 +266,19 @@ size_t RingBuffer::waitForDataAvailable(const std::string &call_id, const size_t size_t getl = 0; if (deadline == std::chrono::high_resolution_clock::time_point()) { not_empty_.wait(l, [=, &getl] { - getl = (endPos_ + buffer_size - read_ptr->second) % buffer_size; + // Re-find read_ptr: it may be destroyed during the wait + const auto read_ptr = readoffsets_.find(call_id); + if (read_ptr == readoffsets_.end()) + return true; + getl = (endPos_ + buffer_size - read_ptr->second) % buffer_size; return getl >= min_data_length; }); } else { not_empty_.wait_until(l, deadline, [=, &getl]{ + // Re-find read_ptr: it may be destroyed during the wait + const auto read_ptr = readoffsets_.find(call_id); + if (read_ptr == readoffsets_.end()) + return true; getl = (endPos_ + buffer_size - read_ptr->second) % buffer_size; return getl >= min_data_length; });