]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: hw: add an arrangement for initialization of appl_ptr/avail_min
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 25 Jun 2017 04:41:20 +0000 (13:41 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 27 Jun 2017 09:11:03 +0000 (11:11 +0200)
Regardless of success/failure mapping of control/status data for runtime of
PCM substream, appl_ptr/avail_min parameters are initialized. In current
implementation, they are initialized in case-dependent, different places.
It's possible to collect them to one place.

This commit unifies relevant code in a place after all of trials for the
mappings are finished.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_hw.c

index abf4afe0fdb94ab6ec78bf299e93d8463c06c086..c60a521bf720d85347084958c1ff6fc9141cfbe4 100644 (file)
@@ -867,10 +867,8 @@ static snd_pcm_sframes_t snd_pcm_hw_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_u
        return xfern.result;
 }
 
-static int map_status_data(snd_pcm_t *pcm)
+static int map_status_data(snd_pcm_hw_t *hw)
 {
-       snd_pcm_hw_t *hw = pcm->private_data;
-       struct snd_pcm_sync_ptr sync_ptr;
        void *ptr;
        int err;
        ptr = MAP_FAILED;
@@ -879,15 +877,6 @@ static int map_status_data(snd_pcm_t *pcm)
                           PROT_READ, MAP_FILE|MAP_SHARED, 
                           hw->fd, SNDRV_PCM_MMAP_OFFSET_STATUS);
        if (ptr == MAP_FAILED || ptr == NULL) {
-               memset(&sync_ptr, 0, sizeof(sync_ptr));
-               sync_ptr.c.control.appl_ptr = 0;
-               sync_ptr.c.control.avail_min = 1;
-               err = ioctl(hw->fd, SNDRV_PCM_IOCTL_SYNC_PTR, &sync_ptr);
-               if (err < 0) {
-                       err = -errno;
-                       SYSMSG("SNDRV_PCM_IOCTL_SYNC_PTR failed (%i)", err);
-                       return err;
-               }
                hw->sync_ptr = calloc(1, sizeof(struct snd_pcm_sync_ptr));
                if (hw->sync_ptr == NULL)
                        return -ENOMEM;
@@ -897,13 +886,12 @@ static int map_status_data(snd_pcm_t *pcm)
        } else {
                hw->mmap_status = ptr;
        }
-       snd_pcm_set_hw_ptr(pcm, &hw->mmap_status->hw_ptr, hw->fd, SNDRV_PCM_MMAP_OFFSET_STATUS + offsetof(struct snd_pcm_mmap_status, hw_ptr));
+
        return 0;
 }
 
-static int map_control_data(snd_pcm_t *pcm)
+static int map_control_data(snd_pcm_hw_t *hw)
 {
-       snd_pcm_hw_t *hw = pcm->private_data;
        void *ptr;
        int err;
        if (hw->sync_ptr == NULL) {
@@ -916,10 +904,8 @@ static int map_control_data(snd_pcm_t *pcm)
                        return err;
                }
                hw->mmap_control = ptr;
-       } else {
-               hw->mmap_control->avail_min = 1;
        }
-       snd_pcm_set_appl_ptr(pcm, &hw->mmap_control->appl_ptr, hw->fd, SNDRV_PCM_MMAP_OFFSET_CONTROL);
+
        return 0;
 }
 
@@ -930,14 +916,30 @@ static int map_status_and_control_data(snd_pcm_t *pcm, bool force_fallback)
 
        hw->sync_ptr_ioctl = (int)force_fallback;
 
-       err = map_status_data(pcm);
+       err = map_status_data(hw);
        if (err < 0)
                return err;
 
-       err = map_control_data(pcm);
+       err = map_control_data(hw);
        if (err < 0)
                return err;
 
+       /* Initialize the data. */
+       hw->mmap_control->appl_ptr = 0;
+       hw->mmap_control->avail_min = 1;
+       snd_pcm_set_hw_ptr(pcm, &hw->mmap_status->hw_ptr, hw->fd,
+                          SNDRV_PCM_MMAP_OFFSET_STATUS +
+                               offsetof(struct snd_pcm_mmap_status, hw_ptr));
+       snd_pcm_set_appl_ptr(pcm, &hw->mmap_control->appl_ptr, hw->fd,
+                            SNDRV_PCM_MMAP_OFFSET_CONTROL);
+       if (hw->sync_ptr_ioctl) {
+               if (ioctl(hw->fd, SNDRV_PCM_IOCTL_SYNC_PTR, hw->sync_ptr) < 0) {
+                       err = -errno;
+                       SYSMSG("SNDRV_PCM_IOCTL_SYNC_PTR failed (%i)", err);
+                       return err;
+               }
+       }
+
        return 0;
 }