mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-11-13 07:17:28 +00:00
[idd] audio: stop paused streams after playback
Keep initial playback prewarming, but announce STOP when a stream that has already run enters PAUSE or ACQUIRE. Restart it when RUN returns. Keep RUN history across owner changes so a paused stream is not mistaken for a new prewarm generation. Only announce capture while it is running. Derive active status flags from the stream generations successfully announced to the client.
This commit is contained in:
@@ -802,12 +802,12 @@ void CLGMPAudioTransport::BeginRelease(const char * reason)
|
|||||||
{
|
{
|
||||||
DEBUG_INFO("Audio owner %u generation %u releasing: %s",
|
DEBUG_INFO("Audio owner %u generation %u releasing: %s",
|
||||||
m_ownerClientID, m_ownerGeneration, reason);
|
m_ownerClientID, m_ownerGeneration, reason);
|
||||||
m_ownerState = OwnerState::RELEASING;
|
m_ownerState = OwnerState::RELEASING;
|
||||||
m_releaseGeneration = m_state.generation;
|
m_releaseGeneration = m_state.generation;
|
||||||
m_deactivationIssued = false;
|
m_deactivationIssued = false;
|
||||||
m_statusDirty = false;
|
m_statusDirty = false;
|
||||||
m_announcedPlayback = 0;
|
m_announcedPlayback = 0;
|
||||||
m_announcedCapture = 0;
|
m_announcedCapture = 0;
|
||||||
ClearBlockedPlayback(true);
|
ClearBlockedPlayback(true);
|
||||||
if (!m_captureCallbackInFlight)
|
if (!m_captureCallbackInFlight)
|
||||||
ReleasePendingCapture();
|
ReleasePendingCapture();
|
||||||
@@ -833,28 +833,28 @@ void CLGMPAudioTransport::ResetOwner()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ownerState = OwnerState::NONE;
|
m_ownerState = OwnerState::NONE;
|
||||||
m_ownerClientID = 0;
|
m_ownerClientID = 0;
|
||||||
m_ownerGeneration = 0;
|
m_ownerGeneration = 0;
|
||||||
m_clientCapabilities = 0;
|
m_clientCapabilities = 0;
|
||||||
m_ownerToken = 0;
|
m_ownerToken = 0;
|
||||||
m_ownerDeadline = 0;
|
m_ownerDeadline = 0;
|
||||||
m_releaseGeneration = 0;
|
m_releaseGeneration = 0;
|
||||||
m_responseAdmitted = false;
|
m_responseAdmitted = false;
|
||||||
m_clientReady = false;
|
m_clientReady = false;
|
||||||
m_activationIssued = false;
|
m_activationIssued = false;
|
||||||
m_deactivationIssued = false;
|
m_deactivationIssued = false;
|
||||||
m_ownerResponse = {};
|
m_ownerResponse = {};
|
||||||
m_statusDirty = false;
|
m_statusDirty = false;
|
||||||
m_announcedPlayback = 0;
|
m_announcedPlayback = 0;
|
||||||
m_announcedCapture = 0;
|
m_announcedCapture = 0;
|
||||||
m_hostSequence = 0;
|
m_hostSequence = 0;
|
||||||
m_nextClientSequence = 0;
|
m_nextClientSequence = 0;
|
||||||
m_clientSequenceKnown = false;
|
m_clientSequenceKnown = false;
|
||||||
m_captureDiscontinuity = false;
|
m_captureDiscontinuity = false;
|
||||||
m_captureCallbackInFlight = false;
|
m_captureCallbackInFlight = false;
|
||||||
m_pendingCapture = {};
|
m_pendingCapture = {};
|
||||||
m_ownerSerial = NextSerial(m_ownerSerial);
|
m_ownerSerial = NextSerial(m_ownerSerial);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLGMPAudioTransport::MaintainOwner(uint64_t now)
|
void CLGMPAudioTransport::MaintainOwner(uint64_t now)
|
||||||
@@ -890,25 +890,25 @@ void CLGMPAudioTransport::MaintainOwner(uint64_t now)
|
|||||||
void CLGMPAudioTransport::InitializeOwner(uint32_t clientID,
|
void CLGMPAudioTransport::InitializeOwner(uint32_t clientID,
|
||||||
const KVMFRAudioClaim& claim)
|
const KVMFRAudioClaim& claim)
|
||||||
{
|
{
|
||||||
m_ownerState = OwnerState::BOUND;
|
m_ownerState = OwnerState::BOUND;
|
||||||
m_ownerClientID = clientID;
|
m_ownerClientID = clientID;
|
||||||
m_ownerGeneration = claim.requestGeneration;
|
m_ownerGeneration = claim.requestGeneration;
|
||||||
m_clientCapabilities = claim.clientCapabilities;
|
m_clientCapabilities = claim.clientCapabilities;
|
||||||
m_ownerToken = claim.claimToken;
|
m_ownerToken = claim.claimToken;
|
||||||
m_responseAdmitted = false;
|
m_responseAdmitted = false;
|
||||||
m_clientReady = false;
|
m_clientReady = false;
|
||||||
m_activationIssued = false;
|
m_activationIssued = false;
|
||||||
m_deactivationIssued = false;
|
m_deactivationIssued = false;
|
||||||
m_statusDirty = true;
|
m_statusDirty = true;
|
||||||
m_announcedPlayback = 0;
|
m_announcedPlayback = 0;
|
||||||
m_announcedCapture = 0;
|
m_announcedCapture = 0;
|
||||||
m_hostSequence = 0;
|
m_hostSequence = 0;
|
||||||
m_nextClientSequence = 0;
|
m_nextClientSequence = 0;
|
||||||
m_clientSequenceKnown = false;
|
m_clientSequenceKnown = false;
|
||||||
m_captureDiscontinuity = false;
|
m_captureDiscontinuity = false;
|
||||||
ClearBlockedPlayback(false);
|
ClearBlockedPlayback(false);
|
||||||
m_pendingCapture = {};
|
m_pendingCapture = {};
|
||||||
m_ownerSerial = NextSerial(m_ownerSerial);
|
m_ownerSerial = NextSerial(m_ownerSerial);
|
||||||
RenewLease();
|
RenewLease();
|
||||||
if (!m_inboundStopping && m_inboundWakeEvent)
|
if (!m_inboundStopping && m_inboundWakeEvent)
|
||||||
SetEvent(m_inboundWakeEvent);
|
SetEvent(m_inboundWakeEvent);
|
||||||
@@ -1051,15 +1051,9 @@ KVMFRAudioStatus CLGMPAudioTransport::WireStatus() const
|
|||||||
status.flags |= KVMFR_AUDIO_STATUS_PLAYBACK_AVAILABLE;
|
status.flags |= KVMFR_AUDIO_STATUS_PLAYBACK_AVAILABLE;
|
||||||
if (status.capabilities & KVMFR_AUDIO_CAP_CAPTURE)
|
if (status.capabilities & KVMFR_AUDIO_CAP_CAPTURE)
|
||||||
status.flags |= KVMFR_AUDIO_STATUS_CAPTURE_AVAILABLE;
|
status.flags |= KVMFR_AUDIO_STATUS_CAPTURE_AVAILABLE;
|
||||||
if ((status.capabilities & KVMFR_AUDIO_CAP_PLAYBACK) &&
|
if (m_announcedPlayback)
|
||||||
m_state.available && m_state.active &&
|
|
||||||
m_state.playback.state != AudioStreamState::UNAVAILABLE &&
|
|
||||||
m_state.playback.state != AudioStreamState::STOPPED)
|
|
||||||
status.flags |= KVMFR_AUDIO_STATUS_PLAYBACK_ACTIVE;
|
status.flags |= KVMFR_AUDIO_STATUS_PLAYBACK_ACTIVE;
|
||||||
if ((status.capabilities & KVMFR_AUDIO_CAP_CAPTURE) &&
|
if (m_announcedCapture)
|
||||||
m_state.available && m_state.active &&
|
|
||||||
m_state.capture.state != AudioStreamState::UNAVAILABLE &&
|
|
||||||
m_state.capture.state != AudioStreamState::STOPPED)
|
|
||||||
status.flags |= KVMFR_AUDIO_STATUS_CAPTURE_ACTIVE;
|
status.flags |= KVMFR_AUDIO_STATUS_CAPTURE_ACTIVE;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -1154,13 +1148,20 @@ void CLGMPAudioTransport::PumpState()
|
|||||||
m_playbackCreditValid)
|
m_playbackCreditValid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (m_state.playback.state == AudioStreamState::RUNNING)
|
||||||
|
m_playbackRunGeneration = m_state.playback.generation;
|
||||||
|
|
||||||
|
const bool playbackPrewarm =
|
||||||
|
(m_state.playback.state == AudioStreamState::ACQUIRED ||
|
||||||
|
m_state.playback.state == AudioStreamState::PAUSED) &&
|
||||||
|
m_playbackRunGeneration != m_state.playback.generation;
|
||||||
const bool playbackCurrent = m_state.available && m_state.active &&
|
const bool playbackCurrent = m_state.available && m_state.active &&
|
||||||
(m_clientCapabilities & KVMFR_AUDIO_CAP_PLAYBACK) &&
|
(m_clientCapabilities & KVMFR_AUDIO_CAP_PLAYBACK) &&
|
||||||
(m_state.capabilities & AUDIO_CAP_PLAYBACK) &&
|
(m_state.capabilities & AUDIO_CAP_PLAYBACK) &&
|
||||||
m_state.playback.formatValid &&
|
m_state.playback.formatValid &&
|
||||||
ValidFormat(m_state.playback.format) &&
|
ValidFormat(m_state.playback.format) &&
|
||||||
m_state.playback.state != AudioStreamState::UNAVAILABLE &&
|
(m_state.playback.state == AudioStreamState::RUNNING ||
|
||||||
m_state.playback.state != AudioStreamState::STOPPED;
|
playbackPrewarm);
|
||||||
if (m_announcedPlayback &&
|
if (m_announcedPlayback &&
|
||||||
(!playbackCurrent ||
|
(!playbackCurrent ||
|
||||||
m_announcedPlayback != m_state.playback.generation))
|
m_announcedPlayback != m_state.playback.generation))
|
||||||
@@ -1176,8 +1177,7 @@ void CLGMPAudioTransport::PumpState()
|
|||||||
(m_state.capabilities & AUDIO_CAP_CAPTURE) &&
|
(m_state.capabilities & AUDIO_CAP_CAPTURE) &&
|
||||||
m_state.capture.formatValid &&
|
m_state.capture.formatValid &&
|
||||||
ValidFormat(m_state.capture.format) &&
|
ValidFormat(m_state.capture.format) &&
|
||||||
m_state.capture.state != AudioStreamState::UNAVAILABLE &&
|
m_state.capture.state == AudioStreamState::RUNNING;
|
||||||
m_state.capture.state != AudioStreamState::STOPPED;
|
|
||||||
if (m_announcedCapture &&
|
if (m_announcedCapture &&
|
||||||
(!captureCurrent ||
|
(!captureCurrent ||
|
||||||
m_announcedCapture != m_state.capture.generation))
|
m_announcedCapture != m_state.capture.generation))
|
||||||
@@ -1860,6 +1860,9 @@ void CLGMPAudioTransport::AudioState(
|
|||||||
if (!m_started)
|
if (!m_started)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (state.playback.state == AudioStreamState::RUNNING)
|
||||||
|
m_playbackRunGeneration = state.playback.generation;
|
||||||
|
|
||||||
if (m_playbackBlocked)
|
if (m_playbackBlocked)
|
||||||
{
|
{
|
||||||
const bool playbackCurrent = state.available && state.active &&
|
const bool playbackCurrent = state.available && state.active &&
|
||||||
|
|||||||
@@ -132,24 +132,25 @@ private:
|
|||||||
KVMFRAudioStreamResponse m_ownerResponse = {};
|
KVMFRAudioStreamResponse m_ownerResponse = {};
|
||||||
|
|
||||||
AudioEndpointStatus m_state;
|
AudioEndpointStatus m_state;
|
||||||
bool m_stateKnown = false;
|
bool m_stateKnown = false;
|
||||||
bool m_statusDirty = false;
|
bool m_statusDirty = false;
|
||||||
uint64_t m_announcedPlayback = 0;
|
uint64_t m_announcedPlayback = 0;
|
||||||
uint64_t m_announcedCapture = 0;
|
uint64_t m_playbackRunGeneration = 0;
|
||||||
uint64_t m_hostSequence = 0;
|
uint64_t m_announcedCapture = 0;
|
||||||
uint64_t m_nextClientSequence = 0;
|
uint64_t m_hostSequence = 0;
|
||||||
bool m_clientSequenceKnown = false;
|
uint64_t m_nextClientSequence = 0;
|
||||||
bool m_captureDiscontinuity = false;
|
bool m_clientSequenceKnown = false;
|
||||||
bool m_captureCallbackInFlight = false;
|
bool m_captureDiscontinuity = false;
|
||||||
bool m_playbackBlocked = false;
|
bool m_captureCallbackInFlight = false;
|
||||||
bool m_playbackReadyPending = false;
|
bool m_playbackBlocked = false;
|
||||||
bool m_playbackCreditValid = false;
|
bool m_playbackReadyPending = false;
|
||||||
LGMPStreamBuffer m_playbackCredit = {};
|
bool m_playbackCreditValid = false;
|
||||||
AudioPacket m_blockedPlayback = {};
|
LGMPStreamBuffer m_playbackCredit = {};
|
||||||
size_t m_blockedPlaybackSize = 0;
|
AudioPacket m_blockedPlayback = {};
|
||||||
uint64_t m_captureReadySerial = 0;
|
size_t m_blockedPlaybackSize = 0;
|
||||||
uint64_t m_inboundActivitySerial = 0;
|
uint64_t m_captureReadySerial = 0;
|
||||||
PendingCapture m_pendingCapture;
|
uint64_t m_inboundActivitySerial = 0;
|
||||||
|
PendingCapture m_pendingCapture;
|
||||||
|
|
||||||
bool InitializeStreams();
|
bool InitializeStreams();
|
||||||
void FreeStreams();
|
void FreeStreams();
|
||||||
|
|||||||
Reference in New Issue
Block a user