Browse Source
Merge pull request #9455 from Kelebek1/audio_signal
[audio_core] Signal buffer event on audio in/out system stop
pull/15/merge
liamwhite
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with
26 additions and
7 deletions
-
src/audio_core/device/audio_buffers.h
-
src/audio_core/device/device_session.cpp
-
src/audio_core/device/device_session.h
-
src/audio_core/in/audio_in_system.cpp
-
src/audio_core/out/audio_out_system.cpp
|
|
|
@ -91,9 +91,10 @@ public: |
|
|
|
* @param core_timing - The CoreTiming instance |
|
|
|
* @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}; |
|
|
|
bool buffer_released{false}; |
|
|
|
while (registered_count > 0) { |
|
|
|
@ -103,7 +104,8 @@ public: |
|
|
|
} |
|
|
|
|
|
|
|
// 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; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -73,6 +73,12 @@ void DeviceSession::Stop() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void DeviceSession::ClearBuffers() { |
|
|
|
if (stream) { |
|
|
|
stream->ClearQueue(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void DeviceSession::AppendBuffers(std::span<const AudioBuffer> buffers) const { |
|
|
|
for (const auto& buffer : buffers) { |
|
|
|
Sink::SinkBuffer new_buffer{ |
|
|
|
|
|
|
|
@ -90,6 +90,11 @@ public: |
|
|
|
*/ |
|
|
|
void Stop(); |
|
|
|
|
|
|
|
/** |
|
|
|
* Clear out the underlying audio buffers in the backend stream. |
|
|
|
*/ |
|
|
|
void ClearBuffers(); |
|
|
|
|
|
|
|
/** |
|
|
|
* Set this device session's volume. |
|
|
|
* |
|
|
|
|
|
|
|
@ -23,7 +23,6 @@ System::~System() { |
|
|
|
void System::Finalize() { |
|
|
|
Stop(); |
|
|
|
session->Finalize(); |
|
|
|
buffer_event->Signal(); |
|
|
|
} |
|
|
|
|
|
|
|
void System::StartSession() { |
|
|
|
@ -102,6 +101,10 @@ Result System::Stop() { |
|
|
|
if (state == State::Started) { |
|
|
|
session->Stop(); |
|
|
|
session->SetVolume(0.0f); |
|
|
|
session->ClearBuffers(); |
|
|
|
if (buffers.ReleaseBuffers(system.CoreTiming(), *session, true)) { |
|
|
|
buffer_event->Signal(); |
|
|
|
} |
|
|
|
state = State::Stopped; |
|
|
|
} |
|
|
|
|
|
|
|
@ -138,7 +141,7 @@ void System::RegisterBuffers() { |
|
|
|
} |
|
|
|
|
|
|
|
void System::ReleaseBuffers() { |
|
|
|
bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session)}; |
|
|
|
bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session, false)}; |
|
|
|
|
|
|
|
if (signal) { |
|
|
|
// Signal if any buffer was released, or if none are registered, we need more.
|
|
|
|
|
|
|
|
@ -24,7 +24,6 @@ System::~System() { |
|
|
|
void System::Finalize() { |
|
|
|
Stop(); |
|
|
|
session->Finalize(); |
|
|
|
buffer_event->Signal(); |
|
|
|
} |
|
|
|
|
|
|
|
std::string_view System::GetDefaultOutputDeviceName() const { |
|
|
|
@ -102,6 +101,10 @@ Result System::Stop() { |
|
|
|
if (state == State::Started) { |
|
|
|
session->Stop(); |
|
|
|
session->SetVolume(0.0f); |
|
|
|
session->ClearBuffers(); |
|
|
|
if (buffers.ReleaseBuffers(system.CoreTiming(), *session, true)) { |
|
|
|
buffer_event->Signal(); |
|
|
|
} |
|
|
|
state = State::Stopped; |
|
|
|
} |
|
|
|
|
|
|
|
@ -138,7 +141,7 @@ void System::RegisterBuffers() { |
|
|
|
} |
|
|
|
|
|
|
|
void System::ReleaseBuffers() { |
|
|
|
bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session)}; |
|
|
|
bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session, false)}; |
|
|
|
if (signal) { |
|
|
|
// Signal if any buffer was released, or if none are registered, we need more.
|
|
|
|
buffer_event->Signal(); |
|
|
|
|