diff options
author | Jaroslav Kysela <perex@suse.cz> | 2004-05-17 19:34:43 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2004-05-17 19:34:43 +0200 |
commit | dcc6460a2a426102896f2342e132ecd0edcd137f (patch) | |
tree | aa07f176baa453f3070ee3d6ebe4f7591b1e804e /sound | |
parent | 4ba2128a9d524e15ecb0dcdf577324173bccba71 (diff) | |
download | history-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.c | 33 |
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: |