home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / sound / timer.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  5.4 KB  |  145 lines

  1. #ifndef __SOUND_TIMER_H
  2. #define __SOUND_TIMER_H
  3.  
  4. /*
  5.  *  Timer abstract layer
  6.  *  Copyright (c) by Jaroslav Kysela <perex@suse.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.  
  53. struct snd_timer;
  54.  
  55. struct 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.  
  72. struct 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. };
  94.  
  95. struct snd_timer_instance {
  96.     struct snd_timer *timer;
  97.     char *owner;
  98.     unsigned int flags;
  99.     void *private_data;
  100.     void (*private_free) (struct snd_timer_instance *ti);
  101.     void (*callback) (struct snd_timer_instance *timeri,
  102.               unsigned long ticks, unsigned long resolution);
  103.     void (*ccallback) (struct snd_timer_instance * timeri,
  104.                int event,
  105.                struct timespec * tstamp,
  106.                unsigned long resolution);
  107.     void *callback_data;
  108.     unsigned long ticks;        /* auto-load ticks when expired */
  109.     unsigned long cticks;        /* current ticks */
  110.     unsigned long pticks;        /* accumulated ticks for callback */
  111.     unsigned long resolution;    /* current resolution for tasklet */
  112.     unsigned long lost;        /* lost ticks */
  113.     int slave_class;
  114.     unsigned int slave_id;
  115.     struct list_head open_list;
  116.     struct list_head active_list;
  117.     struct list_head ack_list;
  118.     struct list_head slave_list_head;
  119.     struct list_head slave_active_head;
  120.     struct snd_timer_instance *master;
  121. };
  122.  
  123. /*
  124.  *  Registering
  125.  */
  126.  
  127. int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, struct snd_timer **rtimer);
  128. void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp);
  129. int snd_timer_global_new(char *id, int device, struct snd_timer **rtimer);
  130. int snd_timer_global_free(struct snd_timer *timer);
  131. int snd_timer_global_register(struct snd_timer *timer);
  132. int snd_timer_global_unregister(struct snd_timer *timer);
  133.  
  134. int snd_timer_open(struct snd_timer_instance **ti, char *owner, struct snd_timer_id *tid, unsigned int slave_id);
  135. int snd_timer_close(struct snd_timer_instance *timeri);
  136. unsigned long snd_timer_resolution(struct snd_timer_instance *timeri);
  137. int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks);
  138. int snd_timer_stop(struct snd_timer_instance *timeri);
  139. int snd_timer_continue(struct snd_timer_instance *timeri);
  140. int snd_timer_pause(struct snd_timer_instance *timeri);
  141.  
  142. void snd_timer_interrupt(struct snd_timer *timer, unsigned long ticks_left);
  143.  
  144. #endif /* __SOUND_TIMER_H */
  145.