]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: initialize pcm_dmix monotonic field
authorOlivier Langlois <olivier@trillion01.com>
Thu, 23 Jan 2014 00:04:45 +0000 (19:04 -0500)
committerTakashi Iwai <tiwai@suse.de>
Thu, 23 Jan 2014 08:42:01 +0000 (09:42 +0100)
not doing so, leaves the pcm object in an inconsistent state since
'info' field is copied from the slave which is then used when
snd_pcm_hw_params_is_monotonic() is called.

For instance, when using dmix with aplay and an underrun is occuring, the following
info is returned:

underrun!!! (at least 1248687948.256 ms long)
Status:
  state       : XRUN
  trigger_time: 1390347762.628483000
  tstamp      : 1390347766.184350000
  delay       : -635
  avail       : 15687
  avail_max   : 15675

now is computed from CLOCK_MONOTONIC while pcm status tstamps are from gettimeofday().

After the fix, underruns are still occuring on my setup but at least the displayed info
is correct:

underrun!!! (at least 7630.409 ms long)
Status:
  state       : XRUN
  trigger_time: 7652.739201431
  tstamp      : 7660.369600636
  delay       : -624
  avail       : 15676
  avail_max   : 15664

Signed-off-by: Olivier Langlois <olivier@trillion01.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_direct.c
src/pcm/pcm_dmix.c

index 899c250401df2d7ea6bbab312f09cc308ba7ce35..5416cf71674c7aadb9321ad8b7e1d264f677052e 100644 (file)
@@ -857,6 +857,7 @@ static void save_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
        COPY_SLAVE(buffer_time);
        COPY_SLAVE(sample_bits);
        COPY_SLAVE(frame_bits);
+       COPY_SLAVE(monotonic);
 }
 
 #undef COPY_SLAVE
@@ -1220,6 +1221,7 @@ static void copy_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
        COPY_SLAVE(buffer_time);
        COPY_SLAVE(sample_bits);
        COPY_SLAVE(frame_bits);
+       COPY_SLAVE(monotonic);
 
        spcm->info &= ~SND_PCM_INFO_PAUSE;
        spcm->boundary = recalc_boundary_size(dmix->shmptr->s.boundary, spcm->buffer_size);
index 2bd5d398d280c07eaf54d99afb053c3be29f602d..4aa6d4eab4a20e98787efa8cc6c17d9a53705a78 100644 (file)
@@ -1104,7 +1104,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
                
        pcm->poll_fd = dmix->poll_fd;
        pcm->poll_events = POLLIN;      /* it's different than other plugins */
-               
+       pcm->monotonic = spcm->monotonic;
        pcm->mmap_rw = 1;
        snd_pcm_set_hw_ptr(pcm, &dmix->hw_ptr, -1, 0);
        snd_pcm_set_appl_ptr(pcm, &dmix->appl_ptr, -1, 0);