diff mbox series

alsa-lib: snd_pcm_plugin_status() recently broken

Message ID 2101121120040.30404@stax.localdomain (mailing list archive)
State New, archived
Headers show
Series alsa-lib: snd_pcm_plugin_status() recently broken | expand

Commit Message

Mark Hills Jan. 12, 2021, 11:35 a.m. UTC
The following assertion:

  relay: pcm_plugin.c:570: snd_pcm_plugin_status: Assertion `status->appl_ptr == *pcm->appl.ptr' failed.

It bisects to 28cc099, the introduction of that assertion.

  #4  0x00007ffff7d0dd03 in snd_pcm_plugin_status (pcm=0x633560, 
      status=0x7fffffffe1e0) at pcm_plugin.c:570
  570                     assert(status->appl_ptr == *pcm->appl.ptr);
  (gdb) print status->appl_ptr
  $1 = 0
  (gdb) print pcm->appl.ptr
  $2 = (volatile snd_pcm_uframes_t *) 0x6334f8
  (gdb) print *pcm->appl.ptr
  $3 = 47936

The calling code is single threaded on a dmix device, with these 
operations in order:

  snd_pcm_avail_update();
  snd_pcm_status();
  snd_pcm_mmap_begin();

Commenting out the assertion leaves me with a credible result from the 
function as it did previously; snd_pcm_status_get_delay() == 64.
diff mbox series

Patch

diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 83793397..6a815145 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -553,14 +553,11 @@  static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
 	snd_pcm_plugin_t *plugin = pcm->private_data;
 	snd_pcm_sframes_t err;
 
-	/* sync with the latest hw and appl ptrs */
-	snd_pcm_plugin_avail_update(pcm);
-
 	err = snd_pcm_status(plugin->gen.slave, status);
 	if (err < 0)
 		return err;
-	status->appl_ptr = *pcm->appl.ptr;
-	status->hw_ptr = *pcm->hw.ptr;
+	assert(status->appl_ptr == *pcm->appl.ptr);
+	snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
 	return 0;
 }