aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@suse.cz>2004-05-17 19:34:43 +0200
committerJaroslav Kysela <perex@suse.cz>2004-05-17 19:34:43 +0200
commitdcc6460a2a426102896f2342e132ecd0edcd137f (patch)
treeaa07f176baa453f3070ee3d6ebe4f7591b1e804e /sound
parent4ba2128a9d524e15ecb0dcdf577324173bccba71 (diff)
downloadhistory-dcc6460a2a426102896f2342e132ecd0edcd137f.tar.gz
ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
PCM Midlevel,ALSA Core Added SYNC_PTR ioctl for the PCM interface.
Diffstat (limited to 'sound')
-rw-r--r--sound/core/pcm_native.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 0c913201d6984a..c7d23b39d5995f 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -2335,6 +2335,37 @@ static int snd_pcm_delay(snd_pcm_substream_t *substream, snd_pcm_sframes_t *res)
return err;
}
+static int snd_pcm_sync_ptr(snd_pcm_substream_t *substream, struct sndrv_pcm_sync_ptr *_sync_ptr)
+{
+ snd_pcm_runtime_t *runtime = substream->runtime;
+ struct sndrv_pcm_sync_ptr sync_ptr;
+ volatile struct sndrv_pcm_mmap_status *status;
+ volatile struct sndrv_pcm_mmap_control *control;
+
+ memset(&sync_ptr, 0, sizeof(sync_ptr));
+ if (get_user(sync_ptr.flags, (unsigned int *) &(_sync_ptr->flags)))
+ return -EFAULT;
+ if (copy_from_user(&sync_ptr.c.control, &(_sync_ptr->c.control), sizeof(struct sndrv_pcm_mmap_control)))
+ return -EFAULT;
+ status = runtime->status;
+ control = runtime->control;
+ snd_pcm_stream_lock_irq(substream);
+ control->appl_ptr = sync_ptr.c.control.appl_ptr;
+ control->avail_min = sync_ptr.c.control.avail_min;
+ sync_ptr.s.status.state = status->state;
+ sync_ptr.s.status.hw_ptr = status->hw_ptr;
+ sync_ptr.s.status.tstamp = status->tstamp;
+ sync_ptr.s.status.suspended_state = status->suspended_state;
+ snd_pcm_stream_unlock_irq(substream);
+ if (copy_to_user(_sync_ptr, &sync_ptr, sizeof(sync_ptr))) {
+ return -EFAULT;
+ } else {
+ if (sync_ptr.flags & SNDRV_PCM_SYNC_PTR_HWSYNC)
+ return snd_pcm_hwsync(substream);
+ }
+ return 0;
+}
+
static int snd_pcm_playback_ioctl1(snd_pcm_substream_t *substream,
unsigned int cmd, void *arg);
static int snd_pcm_capture_ioctl1(snd_pcm_substream_t *substream,
@@ -2388,6 +2419,8 @@ static int snd_pcm_common_ioctl1(snd_pcm_substream_t *substream,
return snd_pcm_hwsync(substream);
case SNDRV_PCM_IOCTL_DELAY:
return snd_pcm_delay(substream, (snd_pcm_sframes_t *) arg);
+ case SNDRV_PCM_IOCTL_SYNC_PTR:
+ return snd_pcm_sync_ptr(substream, (struct sndrv_pcm_sync_ptr *) arg);
case SNDRV_PCM_IOCTL_HW_REFINE_OLD:
return snd_pcm_hw_refine_old_user(substream, (struct sndrv_pcm_hw_params_old *) arg);
case SNDRV_PCM_IOCTL_HW_PARAMS_OLD: