module-rtp: Stop any ongoing timer when starting stream

This commit is contained in:
Carlos Rafael Giani 2025-08-06 13:39:07 +02:00 committed by Wim Taymans
parent 5f3ae4376e
commit 2f22c1d595
2 changed files with 15 additions and 0 deletions

View file

@ -450,6 +450,11 @@ done:
}
}
static void rtp_audio_stop_timer(struct impl *impl)
{
set_timer(impl, 0, 0);
}
static void rtp_audio_flush_timeout(struct impl *impl, uint64_t expirations)
{
if (expirations > 1)
@ -785,6 +790,7 @@ static int rtp_audio_init(struct impl *impl, struct pw_core *core, enum spa_dire
impl->stream_events.process = rtp_audio_process_playback;
impl->receive_rtp = rtp_audio_receive;
impl->stop_timer = rtp_audio_stop_timer;
impl->flush_timeout = rtp_audio_flush_timeout;
setup_ptp_sender(impl, core, direction, ptp_driver);

View file

@ -111,6 +111,7 @@ struct impl {
* requires filling the ring buffer with something other than nullbytes
* (this can happen with DSD for example). */
void (*reset_ringbuffer)(struct impl *impl);
void (*stop_timer)(struct impl *impl);
void (*flush_timeout)(struct impl *impl, uint64_t expirations);
void (*deinit)(struct impl *impl, enum spa_direction direction);
@ -195,6 +196,14 @@ static int stream_start(struct impl *impl)
impl->first = true;
/* Stop the timer now (if the timer is used). Any lingering timer
* will try to send data that is stale at this point, especially
* after the ring buffer contents get reset. Worse, the timer might
* emit a "stopped" state change after a "started" state change
* is emitted here, causing undefined behavior. */
if (impl->stop_timer)
impl->stop_timer(impl);
impl->reset_ringbuffer(impl);
rtp_stream_emit_state_changed(impl, true, NULL);