ASoC: SOF: ipc4-pcm: Invalidate the stream_start_offset in PAUSED state
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Thu, 21 Mar 2024 13:08:10 +0000 (15:08 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 25 Mar 2024 16:36:02 +0000 (16:36 +0000)
When the final state is SOF_IPC4_PIPE_PAUSED, it is possible that the
stream will be restarted (resume or start) in which case we need to update
the offset from the firmware.

Cc: stable@vger.kernel.org # 6.8
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://msgid.link/r/20240321130814.4412-14-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc4-pcm.c

index 4e41b16d320546c49c4054da7343dc3765f91ec1..905dbc4852b1eefe98cd9dd5baecc70f39f0d4d2 100644 (file)
@@ -437,8 +437,19 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
        }
 
        /* return if this is the final state */
-       if (state == SOF_IPC4_PIPE_PAUSED)
+       if (state == SOF_IPC4_PIPE_PAUSED) {
+               struct sof_ipc4_timestamp_info *time_info;
+
+               /*
+                * Invalidate the stream_start_offset to make sure that it is
+                * going to be updated if the stream resumes
+                */
+               time_info = spcm->stream[substream->stream].private;
+               if (time_info)
+                       time_info->stream_start_offset = SOF_IPC4_INVALID_STREAM_POSITION;
+
                goto free;
+       }
 skip_pause_transition:
        /* else set the RUNNING/RESET state in the DSP */
        ret = sof_ipc4_set_multi_pipeline_state(sdev, state, trigger_list);