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.
This commit is contained in:
Takashi Iwai 2007-11-21 12:10:35 +01:00
parent b0b7d0280f
commit 7379b061eb
4 changed files with 35 additions and 3 deletions

View 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;

View 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;

View 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;

View 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;