From 7379b061eb3e7eac28b08ad59bcf76d44feb60ad Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 21 Nov 2007 12:10:35 +0100 Subject: [PATCH] Fix timestamp in status in PCM direct plugins 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 | 11 +++++++++++ src/pcm/pcm_dmix.c | 9 ++++++++- src/pcm/pcm_dshare.c | 9 ++++++++- src/pcm/pcm_dsnoop.c | 9 ++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index 519ec02e..64003a0d 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -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; diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index 63a98d2f..e8f837ac 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -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; diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c index 5791bee3..ccbe4793 100644 --- a/src/pcm/pcm_dshare.c +++ b/src/pcm/pcm_dshare.c @@ -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; diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c index 62885313..16334d56 100644 --- a/src/pcm/pcm_dsnoop.c +++ b/src/pcm/pcm_dsnoop.c @@ -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; -- 2.47.1