// Submits any buffers that have currently been queued, // assuming they are needed based on current queue depth void sound_xaudio2::submit_needed() { XAUDIO2_VOICE_STATE state; m_sourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); std::lock_guard<std::mutex> lock(m_buffer_lock); // If we have buffers queued into XAudio and our current in-memory buffer // isn't yet full, there's no need to submit it if (state.BuffersQueued >= 1 && m_queue.empty()) return; // We do however want to achieve some kind of minimal latency, so if the queued buffers // are greater than 2, flush them to re-sync the audio if (state.BuffersQueued > 2) { m_sourceVoice->FlushSourceBuffers(); m_overflows++; } // Roll the buffer roll_buffer(); // Submit the next buffer submit_next_queued(); }
// Submits any buffers that have currently been queued, // assuming they are needed based on current queue depth void sound_xaudio2::submit_needed() { XAUDIO2_VOICE_STATE state; m_sourceVoice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); // If we have a buffer on the queue, no reason to submit if (state.BuffersQueued >= 1) return; std::lock_guard<std::mutex> lock(m_buffer_lock); // Roll the buffer roll_buffer(); // Submit the next buffer submit_next_queued(); }