Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 81535
b: refs/heads/master
c: b751eef
h: refs/heads/master
i:
  81533: 5b8b965
  81531: 8dbf9c4
  81527: ab4f1cc
  81519: 84e7ff4
  81503: ff14774
  81471: 0e06ee7
  81407: 3b11ce1
v: v3
  • Loading branch information
Jaroslav Kysela committed Jan 31, 2008
1 parent e7e79a0 commit 8cbf7ee
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 25543fa785a32ce22e7374ba403eb6d38854d037
refs/heads/master: b751eef1fdffca5532344285f2fad0c60d2f0158
10 changes: 8 additions & 2 deletions trunk/include/sound/asound.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ enum {
* *
*****************************************************************************/

#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 8)
#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 9)

typedef unsigned long snd_pcm_uframes_t;
typedef signed long snd_pcm_sframes_t;
Expand Down Expand Up @@ -434,10 +434,16 @@ struct snd_xfern {
snd_pcm_uframes_t frames;
};

enum {
SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0, /* gettimeofday equivalent */
SNDRV_PCM_TSTAMP_TYPE_MONOTONIC, /* posix_clock_monotonic equivalent */
SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,
};

enum {
SNDRV_PCM_IOCTL_PVERSION = _IOR('A', 0x00, int),
SNDRV_PCM_IOCTL_INFO = _IOR('A', 0x01, struct snd_pcm_info),
SNDRV_PCM_IOCTL_TSTAMP = _IOW('A', 0x02, int),
SNDRV_PCM_IOCTL_TTSTAMP = _IOW('A', 0x03, int),
SNDRV_PCM_IOCTL_HW_REFINE = _IOWR('A', 0x10, struct snd_pcm_hw_params),
SNDRV_PCM_IOCTL_HW_PARAMS = _IOWR('A', 0x11, struct snd_pcm_hw_params),
SNDRV_PCM_IOCTL_HW_FREE = _IO('A', 0x12),
Expand Down
10 changes: 10 additions & 0 deletions trunk/include/sound/pcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ struct snd_pcm_runtime {

/* -- timer -- */
unsigned int timer_resolution; /* timer resolution */
int tstamp_type; /* timestamp type */

/* -- DMA -- */
unsigned char *dma_area; /* DMA area */
Expand Down Expand Up @@ -952,6 +953,15 @@ void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream);
void snd_pcm_timer_init(struct snd_pcm_substream *substream);
void snd_pcm_timer_done(struct snd_pcm_substream *substream);

static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,
struct timespec *tv)
{
if (runtime->tstamp_type == SNDRV_PCM_TSTAMP_TYPE_MONOTONIC)
do_posix_clock_monotonic_gettime(tv);
else
getnstimeofday(tv);
}

/*
* Memory
*/
Expand Down
2 changes: 1 addition & 1 deletion trunk/sound/core/pcm_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ static inline int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *subs
snd_pcm_sframes_t delta;

if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_MMAP)
getnstimeofday((struct timespec *)&runtime->status->tstamp);
snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp);
pos = snd_pcm_update_hw_ptr_pos(substream, runtime);
if (pos == SNDRV_PCM_POS_XRUN) {
xrun(substream);
Expand Down
25 changes: 20 additions & 5 deletions trunk/sound/core/pcm_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -598,9 +598,9 @@ int snd_pcm_status(struct snd_pcm_substream *substream,
if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_MMAP)
status->tstamp = runtime->status->tstamp;
else
getnstimeofday(&status->tstamp);
snd_pcm_gettime(runtime, &status->tstamp);
} else
getnstimeofday(&status->tstamp);
snd_pcm_gettime(runtime, &status->tstamp);
status->appl_ptr = runtime->control->appl_ptr;
status->hw_ptr = runtime->status->hw_ptr;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Expand Down Expand Up @@ -688,7 +688,7 @@ static void snd_pcm_trigger_tstamp(struct snd_pcm_substream *substream)
if (runtime->trigger_master == NULL)
return;
if (runtime->trigger_master == substream) {
getnstimeofday(&runtime->trigger_tstamp);
snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
} else {
snd_pcm_trigger_tstamp(runtime->trigger_master);
runtime->trigger_tstamp = runtime->trigger_master->runtime->trigger_tstamp;
Expand Down Expand Up @@ -2519,6 +2519,21 @@ static int snd_pcm_sync_ptr(struct snd_pcm_substream *substream,
return -EFAULT;
return 0;
}

static int snd_pcm_tstamp(struct snd_pcm_substream *substream, int __user *_arg)
{
struct snd_pcm_runtime *runtime = substream->runtime;
int arg;

if (get_user(arg, _arg))
return -EFAULT;
if (arg < 0 || arg > SNDRV_PCM_TSTAMP_TYPE_LAST)
return -EINVAL;
runtime->tstamp_type = SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY;
if (arg == SNDRV_PCM_TSTAMP_TYPE_MONOTONIC)
runtime->tstamp_type = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC;
return 0;
}

static int snd_pcm_common_ioctl1(struct file *file,
struct snd_pcm_substream *substream,
Expand All @@ -2531,8 +2546,8 @@ static int snd_pcm_common_ioctl1(struct file *file,
return put_user(SNDRV_PCM_VERSION, (int __user *)arg) ? -EFAULT : 0;
case SNDRV_PCM_IOCTL_INFO:
return snd_pcm_info_user(substream, arg);
case SNDRV_PCM_IOCTL_TSTAMP: /* just for compatibility */
return 0;
case SNDRV_PCM_IOCTL_TTSTAMP:
return snd_pcm_tstamp(substream, arg);
case SNDRV_PCM_IOCTL_HW_REFINE:
return snd_pcm_hw_refine_user(substream, arg);
case SNDRV_PCM_IOCTL_HW_PARAMS:
Expand Down
16 changes: 13 additions & 3 deletions trunk/sound/core/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,14 @@
#endif

static int timer_limit = DEFAULT_TIMER_LIMIT;
static int timer_tstamp_monotonic = 1;
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.de>");
MODULE_DESCRIPTION("ALSA timer interface");
MODULE_LICENSE("GPL");
module_param(timer_limit, int, 0444);
MODULE_PARM_DESC(timer_limit, "Maximum global timers in system.");
module_param(timer_tstamp_monotonic, int, 0444);
MODULE_PARM_DESC(timer_tstamp_monotonic, "Use posix monotonic clock source for timestamps (default).");

struct snd_timer_user {
struct snd_timer_instance *timeri;
Expand Down Expand Up @@ -381,7 +384,10 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)
struct snd_timer_instance *ts;
struct timespec tstamp;

getnstimeofday(&tstamp);
if (timer_tstamp_monotonic)
do_posix_clock_monotonic_gettime(&tstamp);
else
getnstimeofday(&tstamp);
snd_assert(event >= SNDRV_TIMER_EVENT_START &&
event <= SNDRV_TIMER_EVENT_PAUSE, return);
if (event == SNDRV_TIMER_EVENT_START ||
Expand Down Expand Up @@ -1182,8 +1188,12 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
spin_unlock(&tu->qlock);
return;
}
if (tu->last_resolution != resolution || ticks > 0)
getnstimeofday(&tstamp);
if (tu->last_resolution != resolution || ticks > 0) {
if (timer_tstamp_monotonic)
do_posix_clock_monotonic_gettime(&tstamp);
else
getnstimeofday(&tstamp);
}
if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) &&
tu->last_resolution != resolution) {
r1.event = SNDRV_TIMER_EVENT_RESOLUTION;
Expand Down

0 comments on commit 8cbf7ee

Please sign in to comment.