linux/include/sound/timer.h
<<
>>
Prefs
   1#ifndef __SOUND_TIMER_H
   2#define __SOUND_TIMER_H
   3
   4/*
   5 *  Timer abstract layer
   6 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
   7 *                   Abramo Bagnara <abramo@alsa-project.org>
   8 *
   9 *
  10 *   This program is free software; you can redistribute it and/or modify
  11 *   it under the terms of the GNU General Public License as published by
  12 *   the Free Software Foundation; either version 2 of the License, or
  13 *   (at your option) any later version.
  14 *
  15 *   This program is distributed in the hope that it will be useful,
  16 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 *   GNU General Public License for more details.
  19 *
  20 *   You should have received a copy of the GNU General Public License
  21 *   along with this program; if not, write to the Free Software
  22 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  23 *
  24 */
  25
  26#include <sound/asound.h>
  27#include <linux/interrupt.h>
  28
  29#define snd_timer_chip(timer) ((timer)->private_data)
  30
  31#define SNDRV_TIMER_DEVICES     16
  32
  33#define SNDRV_TIMER_DEV_FLG_PCM 0x10000000
  34
  35#define SNDRV_TIMER_HW_AUTO     0x00000001      /* auto trigger is supported */
  36#define SNDRV_TIMER_HW_STOP     0x00000002      /* call stop before start */
  37#define SNDRV_TIMER_HW_SLAVE    0x00000004      /* only slave timer (variable resolution) */
  38#define SNDRV_TIMER_HW_FIRST    0x00000008      /* first tick can be incomplete */
  39#define SNDRV_TIMER_HW_TASKLET  0x00000010      /* timer is called from tasklet */
  40
  41#define SNDRV_TIMER_IFLG_SLAVE    0x00000001
  42#define SNDRV_TIMER_IFLG_RUNNING  0x00000002
  43#define SNDRV_TIMER_IFLG_START    0x00000004
  44#define SNDRV_TIMER_IFLG_AUTO     0x00000008    /* auto restart */
  45#define SNDRV_TIMER_IFLG_FAST     0x00000010    /* fast callback (do not use tasklet) */
  46#define SNDRV_TIMER_IFLG_CALLBACK 0x00000020    /* timer callback is active */
  47#define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040   /* exclusive owner - no more instances */
  48#define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080 /* write early event to the poll queue */
  49
  50#define SNDRV_TIMER_FLG_CHANGE  0x00000001
  51#define SNDRV_TIMER_FLG_RESCHED 0x00000002      /* need reschedule */
  52
  53struct snd_timer;
  54
  55struct snd_timer_hardware {
  56        /* -- must be filled with low-level driver */
  57        unsigned int flags;             /* various flags */
  58        unsigned long resolution;       /* average timer resolution for one tick in nsec */
  59        unsigned long resolution_min;   /* minimal resolution */
  60        unsigned long resolution_max;   /* maximal resolution */
  61        unsigned long ticks;            /* max timer ticks per interrupt */
  62        /* -- low-level functions -- */
  63        int (*open) (struct snd_timer * timer);
  64        int (*close) (struct snd_timer * timer);
  65        unsigned long (*c_resolution) (struct snd_timer * timer);
  66        int (*start) (struct snd_timer * timer);
  67        int (*stop) (struct snd_timer * timer);
  68        int (*set_period) (struct snd_timer * timer, unsigned long period_num, unsigned long period_den);
  69        int (*precise_resolution) (struct snd_timer * timer, unsigned long *num, unsigned long *den);
  70};
  71
  72struct snd_timer {
  73        int tmr_class;
  74        struct snd_card *card;
  75        struct module *module;
  76        int tmr_device;
  77        int tmr_subdevice;
  78        char id[64];
  79        char name[80];
  80        unsigned int flags;
  81        int running;                    /* running instances */
  82        unsigned long sticks;           /* schedule ticks */
  83        void *private_data;
  84        void (*private_free) (struct snd_timer *timer);
  85        struct snd_timer_hardware hw;
  86        spinlock_t lock;
  87        struct list_head device_list;
  88        struct list_head open_list_head;
  89        struct list_head active_list_head;
  90        struct list_head ack_list_head;
  91        struct list_head sack_list_head; /* slow ack list head */
  92        struct tasklet_struct task_queue;
  93        int max_instances;      /* upper limit of timer instances */
  94        int num_instances;      /* current number of timer instances */
  95};
  96
  97struct snd_timer_instance {
  98        struct snd_timer *timer;
  99        char *owner;
 100        unsigned int flags;
 101        void *private_data;
 102        void (*private_free) (struct snd_timer_instance *ti);
 103        void (*callback) (struct snd_timer_instance *timeri,
 104                          unsigned long ticks, unsigned long resolution);
 105        void (*ccallback) (struct snd_timer_instance * timeri,
 106                           int event,
 107                           struct timespec * tstamp,
 108                           unsigned long resolution);
 109        void (*disconnect)(struct snd_timer_instance *timeri);
 110        void *callback_data;
 111        unsigned long ticks;            /* auto-load ticks when expired */
 112        unsigned long cticks;           /* current ticks */
 113        unsigned long pticks;           /* accumulated ticks for callback */
 114        unsigned long resolution;       /* current resolution for tasklet */
 115        unsigned long lost;             /* lost ticks */
 116        int slave_class;
 117        unsigned int slave_id;
 118        struct list_head open_list;
 119        struct list_head active_list;
 120        struct list_head ack_list;
 121        struct list_head slave_list_head;
 122        struct list_head slave_active_head;
 123        struct snd_timer_instance *master;
 124};
 125
 126/*
 127 *  Registering
 128 */
 129
 130int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, struct snd_timer **rtimer);
 131void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp);
 132int snd_timer_global_new(char *id, int device, struct snd_timer **rtimer);
 133int snd_timer_global_free(struct snd_timer *timer);
 134int snd_timer_global_register(struct snd_timer *timer);
 135
 136int snd_timer_open(struct snd_timer_instance **ti, char *owner, struct snd_timer_id *tid, unsigned int slave_id);
 137int snd_timer_close(struct snd_timer_instance *timeri);
 138unsigned long snd_timer_resolution(struct snd_timer_instance *timeri);
 139int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks);
 140int snd_timer_stop(struct snd_timer_instance *timeri);
 141int snd_timer_continue(struct snd_timer_instance *timeri);
 142int snd_timer_pause(struct snd_timer_instance *timeri);
 143
 144void snd_timer_interrupt(struct snd_timer *timer, unsigned long ticks_left);
 145
 146#endif /* __SOUND_TIMER_H */
 147