1
0
Fork 0
forked from suyu/suyu

Signal buffer event on audio in/out system stop, and force remove all registered audio buffers

This commit is contained in:
Kelebek1 2022-12-16 16:01:35 +00:00
parent 9ff891ce71
commit 6a56f42f5d
5 changed files with 26 additions and 7 deletions

View file

@ -91,9 +91,10 @@ public:
* @param core_timing - The CoreTiming instance * @param core_timing - The CoreTiming instance
* @param session - The device session * @param session - The device session
* *
* @return Is the buffer was released. * @return If any buffer was released.
*/ */
bool ReleaseBuffers(const Core::Timing::CoreTiming& core_timing, const DeviceSession& session) { bool ReleaseBuffers(const Core::Timing::CoreTiming& core_timing, const DeviceSession& session,
bool force) {
std::scoped_lock l{lock}; std::scoped_lock l{lock};
bool buffer_released{false}; bool buffer_released{false};
while (registered_count > 0) { while (registered_count > 0) {
@ -103,7 +104,8 @@ public:
} }
// Check with the backend if this buffer can be released yet. // Check with the backend if this buffer can be released yet.
if (!session.IsBufferConsumed(buffers[index])) { // If we're shutting down, we don't care if it's been played or not.
if (!force && !session.IsBufferConsumed(buffers[index])) {
break; break;
} }

View file

@ -73,6 +73,12 @@ void DeviceSession::Stop() {
} }
} }
void DeviceSession::ClearBuffers() {
if (stream) {
stream->ClearQueue();
}
}
void DeviceSession::AppendBuffers(std::span<const AudioBuffer> buffers) const { void DeviceSession::AppendBuffers(std::span<const AudioBuffer> buffers) const {
for (const auto& buffer : buffers) { for (const auto& buffer : buffers) {
Sink::SinkBuffer new_buffer{ Sink::SinkBuffer new_buffer{

View file

@ -90,6 +90,11 @@ public:
*/ */
void Stop(); void Stop();
/**
* Clear out the underlying audio buffers in the backend stream.
*/
void ClearBuffers();
/** /**
* Set this device session's volume. * Set this device session's volume.
* *

View file

@ -23,7 +23,6 @@ System::~System() {
void System::Finalize() { void System::Finalize() {
Stop(); Stop();
session->Finalize(); session->Finalize();
buffer_event->Signal();
} }
void System::StartSession() { void System::StartSession() {
@ -102,6 +101,10 @@ Result System::Stop() {
if (state == State::Started) { if (state == State::Started) {
session->Stop(); session->Stop();
session->SetVolume(0.0f); session->SetVolume(0.0f);
session->ClearBuffers();
if (buffers.ReleaseBuffers(system.CoreTiming(), *session, true)) {
buffer_event->Signal();
}
state = State::Stopped; state = State::Stopped;
} }
@ -138,7 +141,7 @@ void System::RegisterBuffers() {
} }
void System::ReleaseBuffers() { void System::ReleaseBuffers() {
bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session)}; bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session, false)};
if (signal) { if (signal) {
// Signal if any buffer was released, or if none are registered, we need more. // Signal if any buffer was released, or if none are registered, we need more.

View file

@ -24,7 +24,6 @@ System::~System() {
void System::Finalize() { void System::Finalize() {
Stop(); Stop();
session->Finalize(); session->Finalize();
buffer_event->Signal();
} }
std::string_view System::GetDefaultOutputDeviceName() const { std::string_view System::GetDefaultOutputDeviceName() const {
@ -102,6 +101,10 @@ Result System::Stop() {
if (state == State::Started) { if (state == State::Started) {
session->Stop(); session->Stop();
session->SetVolume(0.0f); session->SetVolume(0.0f);
session->ClearBuffers();
if (buffers.ReleaseBuffers(system.CoreTiming(), *session, true)) {
buffer_event->Signal();
}
state = State::Stopped; state = State::Stopped;
} }
@ -138,7 +141,7 @@ void System::RegisterBuffers() {
} }
void System::ReleaseBuffers() { void System::ReleaseBuffers() {
bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session)}; bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session, false)};
if (signal) { if (signal) {
// Signal if any buffer was released, or if none are registered, we need more. // Signal if any buffer was released, or if none are registered, we need more.
buffer_event->Signal(); buffer_event->Signal();