]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: direct: Add generic hw_ptr_alignment function for dmix, dshare and dsnoop
authorVanitha Channaiah <vanitha.channaiah@in.bosch.com>
Wed, 15 May 2019 06:26:32 +0000 (11:56 +0530)
committerTakashi Iwai <tiwai@suse.de>
Wed, 15 May 2019 08:31:20 +0000 (10:31 +0200)
Move the code snd_pcm_direct_reset_slave_ptr() from pcm_dmix.c
to pcm_direct.c and its header so that the helper function can be
re-used by other direct-pcm plugins.
There is no change in the behavior or the functionality.

Signed-off-by: Vanitha Channaiah <vanitha.channaiah@in.bosch.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_direct.c
src/pcm/pcm_direct.h
src/pcm/pcm_dmix.c

index 666a8ce5b13074b2ff4d12d5a5e47aa1955532cf..411a035b32edae701ade87c63a0fc8327d953bd0 100644 (file)
@@ -2040,3 +2040,22 @@ int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf,
 
        return 0;
 }
+
+void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix)
+{
+       dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr;
+
+       if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDUP ||
+               (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO &&
+               pcm->buffer_size <= pcm->period_size * 2))
+               dmix->slave_appl_ptr =
+                       ((dmix->slave_appl_ptr + dmix->slave_period_size - 1) /
+                       dmix->slave_period_size) * dmix->slave_period_size;
+       else if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDDOWN ||
+               (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO &&
+               (dmix->slave_period_size * SEC_TO_MS) /
+               pcm->rate < LOW_LATENCY_PERIOD_TIME))
+               dmix->slave_appl_ptr = dmix->slave_hw_ptr =
+                       ((dmix->slave_hw_ptr / dmix->slave_period_size) *
+                       dmix->slave_period_size);
+}
index da5e280e711d9bb00c3f0d572ec631b3f88de4ee..a71aab13afa9e524da15392be94776fe3e1997bc 100644 (file)
 
 #define DIRECT_IPC_SEMS         1
 #define DIRECT_IPC_SEM_CLIENT   0
+/* Seconds representing in Milli seconds */
+#define SEC_TO_MS               1000
+/* slave_period time for low latency requirements in ms */
+#define LOW_LATENCY_PERIOD_TIME 10
+
 
 typedef void (mix_areas_t)(unsigned int size,
                           volatile void *dst, void *src,
@@ -257,6 +262,8 @@ struct snd_pcm_direct {
        snd1_pcm_direct_get_chmap
 #define snd_pcm_direct_set_chmap \
        snd1_pcm_direct_set_chmap
+#define snd_pcm_direct_reset_slave_ptr \
+       snd1_pcm_direct_reset_slave_ptr
 
 int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix);
 
@@ -341,6 +348,7 @@ int snd_pcm_direct_slave_recover(snd_pcm_direct_t *direct);
 int snd_pcm_direct_client_chk_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm);
 int snd_timer_async(snd_timer_t *timer, int sig, pid_t pid);
 struct timespec snd_pcm_hw_fast_tstamp(snd_pcm_t *pcm);
+void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix);
 
 struct snd_pcm_direct_open_conf {
        key_t ipc_key;
index c5592cdba3c4f4ef90eff5afaf70afe70e402a87..dcde40d9976ec15cf5568487e90befb183c9289f 100644 (file)
@@ -55,9 +55,6 @@ const char *_snd_module_pcm_dmix = "";
 #define STATE_RUN_PENDING      1024
 #endif
 
-#define SEC_TO_MS      1000                    /* Seconds representing in Milli seconds */
-#define LOW_LATENCY_PERIOD_TIME        10      /* slave_period time for low latency requirements in ms */
-
 /*
  *
  */
@@ -560,30 +557,12 @@ static int snd_pcm_dmix_hwsync(snd_pcm_t *pcm)
        }
 }
 
-static void reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix)
-{
-       dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr;
-
-       if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDUP ||
-           (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO &&
-            pcm->buffer_size <= pcm->period_size * 2))
-               dmix->slave_appl_ptr =
-                       ((dmix->slave_appl_ptr + dmix->slave_period_size - 1)
-                        / dmix->slave_period_size) * dmix->slave_period_size;
-       else if (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_ROUNDDOWN ||
-                (dmix->hw_ptr_alignment == SND_PCM_HW_PTR_ALIGNMENT_AUTO &&
-                 (dmix->slave_period_size * SEC_TO_MS) / pcm->rate < LOW_LATENCY_PERIOD_TIME))
-               dmix->slave_appl_ptr = dmix->slave_hw_ptr =
-                       ((dmix->slave_hw_ptr / dmix->slave_period_size) *
-                        dmix->slave_period_size);
-}
-
 static int snd_pcm_dmix_reset(snd_pcm_t *pcm)
 {
        snd_pcm_direct_t *dmix = pcm->private_data;
        dmix->hw_ptr %= pcm->period_size;
        dmix->appl_ptr = dmix->last_appl_ptr = dmix->hw_ptr;
-       reset_slave_ptr(pcm, dmix);
+       snd_pcm_direct_reset_slave_ptr(pcm, dmix);
        return 0;
 }
 
@@ -592,7 +571,7 @@ static int snd_pcm_dmix_start_timer(snd_pcm_t *pcm, snd_pcm_direct_t *dmix)
        int err;
 
        snd_pcm_hwsync(dmix->spcm);
-       reset_slave_ptr(pcm, dmix);
+       snd_pcm_direct_reset_slave_ptr(pcm, dmix);
        err = snd_timer_start(dmix->timer);
        if (err < 0)
                return err;