]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fix timestamp in status in PCM direct plugins
authorTakashi Iwai <tiwai@suse.de>
Wed, 21 Nov 2007 11:10:35 +0000 (12:10 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 21 Nov 2007 11:10:35 +0000 (12:10 +0100)
PCM direct plugins didn't update the timestamp properly.
Now it always starts the slave PCM with MMAP tstamp_mode so that the
timestamp will be being updated.  When a client is set up as MMAP
tstamp_mode as well, simply copy this slave timestamp.  Otherwise
status callback calculates the current timestamp as usual.

src/pcm/pcm_direct.c
src/pcm/pcm_dmix.c
src/pcm/pcm_dshare.c
src/pcm/pcm_dsnoop.c

index 519ec02ed510ab5f45c8111ea2f3a7fcca563d2f..64003a0d3bd054fde7487d54e4bcd477160a0a5a 100644 (file)
@@ -1001,6 +1001,17 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
                return ret;
        }
 
+       /* set timestamp mode to MMAP
+        * the slave timestamp is copied appropriately in dsnoop/dmix/dshare
+        * based on the tstamp_mode of each client
+        */
+       ret = snd_pcm_sw_params_set_tstamp_mode(spcm, sw_params,
+                                               SND_PCM_TSTAMP_MMAP);
+       if (ret < 0) {
+               SNDERR("unable to tstamp mode MMAP");
+               return ret;
+       }
+
        if (dmix->type != SND_PCM_TYPE_DMIX)
                goto __skip_silencing;
 
index 63a98d2fd537995127ba32f0663ad26ce061f671..e8f837acfbc6c7dddbbfc32609be77c3bae64bc2 100644 (file)
@@ -420,7 +420,14 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
        memset(status, 0, sizeof(*status));
        status->state = snd_pcm_dmix_state(pcm);
        status->trigger_tstamp = dmix->trigger_tstamp;
-       status->tstamp = snd_pcm_hw_fast_tstamp(dmix->spcm);
+       if (pcm->tstamp_mode == SND_PCM_TSTAMP_MMAP)
+               status->tstamp = snd_pcm_hw_fast_tstamp(dmix->spcm);
+       else {
+               struct timeval tv;
+               gettimeofday(&tv, 0);
+               status->tstamp.tv_sec = tv.tv_sec;
+               status->tstamp.tv_nsec = tv.tv_usec * 1000L;
+       }
        status->avail = snd_pcm_mmap_playback_avail(pcm);
        status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max;
        dmix->avail_max = 0;
index 5791bee3a4b2873faabc26eb7f6a6385d3223429..ccbe47931d34f308e8d2c68bc7f0cd3215f4203c 100644 (file)
@@ -229,7 +229,14 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
        memset(status, 0, sizeof(*status));
        status->state = snd_pcm_state(dshare->spcm);
        status->trigger_tstamp = dshare->trigger_tstamp;
-       status->tstamp = snd_pcm_hw_fast_tstamp(dshare->spcm);
+       if (pcm->tstamp_mode == SND_PCM_TSTAMP_MMAP)
+               status->tstamp = snd_pcm_hw_fast_tstamp(dshare->spcm);
+       else {
+               struct timeval tv;
+               gettimeofday(&tv, 0);
+               status->tstamp.tv_sec = tv.tv_sec;
+               status->tstamp.tv_nsec = tv.tv_usec * 1000L;
+       }
        status->avail = snd_pcm_mmap_playback_avail(pcm);
        status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
        dshare->avail_max = 0;
index 62885313eacef163b52b88faee902c1af94d6506..16334d567f2792b9816fe4c668212ac80a5ddc88 100644 (file)
@@ -175,7 +175,14 @@ static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
        state = snd_pcm_state(dsnoop->spcm);
        status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state;
        status->trigger_tstamp = dsnoop->trigger_tstamp;
-       status->tstamp = snd_pcm_hw_fast_tstamp(dsnoop->spcm);
+       if (pcm->tstamp_mode == SND_PCM_TSTAMP_MMAP)
+               status->tstamp = snd_pcm_hw_fast_tstamp(dsnoop->spcm);
+       else {
+               struct timeval tv;
+               gettimeofday(&tv, 0);
+               status->tstamp.tv_sec = tv.tv_sec;
+               status->tstamp.tv_nsec = tv.tv_usec * 1000L;
+       }
        status->avail = snd_pcm_mmap_capture_avail(pcm);
        status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max;
        dsnoop->avail_max = 0;