|
|
|
|
@ -68,7 +68,7 @@ bool AudioDevice::init(ma_context* context, ma_device_config config, const char*
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
m_device = device; |
|
|
|
|
m_frames = 0; m_bufferGlitches = 0; m_resizePending = false; |
|
|
|
|
m_frames = 0; m_bufferGlitches = 0; m_pendingGlitches = 0; m_glitchReportAt = -5000; m_resizePending = false; |
|
|
|
|
m_route = 0; m_reportedRoute = 0; |
|
|
|
|
m_timingMeasured = false; m_reportedTiming = -1; |
|
|
|
|
m_seenFrames = 0; |
|
|
|
|
@ -198,14 +198,16 @@ bool AudioDevice::needsRecovery() {
|
|
|
|
|
} |
|
|
|
|
bool stopped = ma_device_get_state(m_device) == ma_device_state_stopped; |
|
|
|
|
unsigned glitches = m_bufferGlitches.exchange(0, std::memory_order_relaxed); |
|
|
|
|
if (glitches) { |
|
|
|
|
auto result = m_suspended.load() || stopped ? AudioBufferTuning::Unchanged : m_bufferTuning.observe(now, glitches); |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CALL, "audio: %s backend glitches=%u period=%ums periods=%u action=%s requested_period=%ums", |
|
|
|
|
m_role, glitches, m_bufferTuning.actualMs, m_bufferTuning.periods, |
|
|
|
|
auto result = m_suspended.load() || stopped ? AudioBufferTuning::Unchanged : m_bufferTuning.observe(now, glitches); |
|
|
|
|
m_pendingGlitches += glitches; |
|
|
|
|
if (m_pendingGlitches && (result != AudioBufferTuning::Unchanged || now - m_glitchReportAt >= 5000)) { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CALL, "audio: %s backend glitches=%llu period=%ums periods=%u action=%s requested_period=%ums", |
|
|
|
|
m_role, (unsigned long long)m_pendingGlitches, m_bufferTuning.actualMs, m_bufferTuning.periods, |
|
|
|
|
result == AudioBufferTuning::Increase ? "increase-buffer" : result == AudioBufferTuning::Limit ? "buffer-limit" : "observe", |
|
|
|
|
m_bufferTuning.requestedMs); |
|
|
|
|
if (result == AudioBufferTuning::Increase) { m_resizePending = true; return true; } |
|
|
|
|
m_pendingGlitches = 0; m_glitchReportAt = now; |
|
|
|
|
} |
|
|
|
|
if (result == AudioBufferTuning::Increase) { m_resizePending = true; return true; } |
|
|
|
|
if (!stopped && now - m_progressAt < 1000) return false; |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CALL, "audio: %s recovery reason=%s idle=%lldms frames=%llu suspended=%d", |
|
|
|
|
m_role, stopped ? "stopped" : "no-progress", (long long)(now - m_progressAt), |
|
|
|
|
|