ALSA: pcm: allow for trigger_tstamp snapshot in .trigger
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 6 Feb 2015 21:55:51 +0000 (15:55 -0600)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 Feb 2015 15:01:53 +0000 (16:01 +0100)
Don't use generic snapshot of trigger_tstamp if low-level driver or
hardware can get a more precise value for better audio/system time
synchronization.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/pcm.h
sound/core/pcm_native.c

index 07299b2952334b919fdb36f6ba5367e88c99bb9a..c0ddb7e69c2863a385b34212b29255df993131e5 100644 (file)
@@ -285,6 +285,7 @@ struct snd_pcm_runtime {
        /* -- Status -- */
        struct snd_pcm_substream *trigger_master;
        struct timespec trigger_tstamp; /* trigger timestamp */
+       bool trigger_tstamp_latched;     /* trigger timestamp latched in low-level driver/hardware */
        int overrange;
        snd_pcm_uframes_t avail_max;
        snd_pcm_uframes_t hw_ptr_base;  /* Position at buffer restart */
index 4ecd35fbfe3f9c1eba7e82409ed8fd2c7bd6ba8e..b03a638b420c18243776c45fda5884b422392c46 100644 (file)
@@ -810,7 +810,8 @@ static void snd_pcm_trigger_tstamp(struct snd_pcm_substream *substream)
        if (runtime->trigger_master == NULL)
                return;
        if (runtime->trigger_master == substream) {
-               snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
+               if (!runtime->trigger_tstamp_latched)
+                       snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
        } else {
                snd_pcm_trigger_tstamp(runtime->trigger_master);
                runtime->trigger_tstamp = runtime->trigger_master->runtime->trigger_tstamp;
@@ -979,6 +980,7 @@ static int snd_pcm_pre_start(struct snd_pcm_substream *substream, int state)
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
            !snd_pcm_playback_data(substream))
                return -EPIPE;
+       runtime->trigger_tstamp_latched = false;
        runtime->trigger_master = substream;
        return 0;
 }