Blame view

include/sound/pcm.h 37.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  #ifndef __SOUND_PCM_H
  #define __SOUND_PCM_H
  
  /*
   *  Digital Audio (PCM) abstract layer
c1017a4cd   Jaroslav Kysela   [ALSA] Changed Ja...
6
   *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   *                   Abramo Bagnara <abramo@alsa-project.org>
   *
   *
   *   This program is free software; you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License as published by
   *   the Free Software Foundation; either version 2 of the License, or
   *   (at your option) any later version.
   *
   *   This program is distributed in the hope that it will be useful,
   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *   GNU General Public License for more details.
   *
   *   You should have received a copy of the GNU General Public License
   *   along with this program; if not, write to the Free Software
   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   *
   */
  
  #include <sound/asound.h>
  #include <sound/memalloc.h>
f90c06a2b   Pawel MOLL   ALSA: Fix limit o...
28
  #include <sound/minors.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  #include <linux/poll.h>
f23f6e08c   Al Viro   [PATCH] severing ...
30
  #include <linux/mm.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  #include <linux/bitops.h>
e8db0be12   Jean Pihet   PM QoS: Move and ...
32
  #include <linux/pm_qos.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
  #define snd_pcm_substream_chip(substream) ((substream)->private_data)
  #define snd_pcm_chip(pcm) ((pcm)->private_data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
39
40
41
42
  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
  #include "pcm_oss.h"
  #endif
  
  /*
   *  Hardware (lowlevel) section
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
43
  struct snd_pcm_hardware {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
48
49
50
51
52
53
54
55
56
  	unsigned int info;		/* SNDRV_PCM_INFO_* */
  	u64 formats;			/* SNDRV_PCM_FMTBIT_* */
  	unsigned int rates;		/* SNDRV_PCM_RATE_* */
  	unsigned int rate_min;		/* min rate */
  	unsigned int rate_max;		/* max rate */
  	unsigned int channels_min;	/* min channels */
  	unsigned int channels_max;	/* max channels */
  	size_t buffer_bytes_max;	/* max buffer size */
  	size_t period_bytes_min;	/* min period size */
  	size_t period_bytes_max;	/* max period size */
  	unsigned int periods_min;	/* min # of periods */
  	unsigned int periods_max;	/* max # of periods */
  	size_t fifo_size;		/* fifo size in bytes */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
57
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58

e0e6ce038   Randy Dunlap   [ALSA] add struct...
59
  struct snd_pcm_substream;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
60
61
62
63
  struct snd_pcm_ops {
  	int (*open)(struct snd_pcm_substream *substream);
  	int (*close)(struct snd_pcm_substream *substream);
  	int (*ioctl)(struct snd_pcm_substream * substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
  		     unsigned int cmd, void *arg);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
65
66
67
68
69
70
71
72
  	int (*hw_params)(struct snd_pcm_substream *substream,
  			 struct snd_pcm_hw_params *params);
  	int (*hw_free)(struct snd_pcm_substream *substream);
  	int (*prepare)(struct snd_pcm_substream *substream);
  	int (*trigger)(struct snd_pcm_substream *substream, int cmd);
  	snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
  	int (*copy)(struct snd_pcm_substream *substream, int channel,
  		    snd_pcm_uframes_t pos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  		    void __user *buf, snd_pcm_uframes_t count);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
74
  	int (*silence)(struct snd_pcm_substream *substream, int channel, 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  		       snd_pcm_uframes_t pos, snd_pcm_uframes_t count);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
76
77
78
79
80
  	struct page *(*page)(struct snd_pcm_substream *substream,
  			     unsigned long offset);
  	int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma);
  	int (*ack)(struct snd_pcm_substream *substream);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
  
  /*
   *
   */
f90c06a2b   Pawel MOLL   ALSA: Fix limit o...
85
86
87
88
89
  #if defined(CONFIG_SND_DYNAMIC_MINORS)
  #define SNDRV_PCM_DEVICES	(SNDRV_OS_MINORS-2)
  #else
  #define SNDRV_PCM_DEVICES	8
  #endif
896e6cc20   Jaroslav Kysela   sound: Revert "AL...
90

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
94
95
96
97
  #define SNDRV_PCM_IOCTL1_FALSE		((void *)0)
  #define SNDRV_PCM_IOCTL1_TRUE		((void *)1)
  
  #define SNDRV_PCM_IOCTL1_RESET		0
  #define SNDRV_PCM_IOCTL1_INFO		1
  #define SNDRV_PCM_IOCTL1_CHANNEL_INFO	2
  #define SNDRV_PCM_IOCTL1_GSTATE		3
8bea869c5   Jaroslav Kysela   ALSA: PCM midleve...
98
  #define SNDRV_PCM_IOCTL1_FIFO_SIZE	4
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  
  #define SNDRV_PCM_TRIGGER_STOP		0
  #define SNDRV_PCM_TRIGGER_START		1
  #define SNDRV_PCM_TRIGGER_PAUSE_PUSH	3
  #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE	4
  #define SNDRV_PCM_TRIGGER_SUSPEND	5
  #define SNDRV_PCM_TRIGGER_RESUME	6
  
  #define SNDRV_PCM_POS_XRUN		((snd_pcm_uframes_t)-1)
  
  /* If you change this don't forget to change rates[] table in pcm_native.c */
  #define SNDRV_PCM_RATE_5512		(1<<0)		/* 5512Hz */
  #define SNDRV_PCM_RATE_8000		(1<<1)		/* 8000Hz */
  #define SNDRV_PCM_RATE_11025		(1<<2)		/* 11025Hz */
  #define SNDRV_PCM_RATE_16000		(1<<3)		/* 16000Hz */
  #define SNDRV_PCM_RATE_22050		(1<<4)		/* 22050Hz */
  #define SNDRV_PCM_RATE_32000		(1<<5)		/* 32000Hz */
  #define SNDRV_PCM_RATE_44100		(1<<6)		/* 44100Hz */
  #define SNDRV_PCM_RATE_48000		(1<<7)		/* 48000Hz */
  #define SNDRV_PCM_RATE_64000		(1<<8)		/* 64000Hz */
  #define SNDRV_PCM_RATE_88200		(1<<9)		/* 88200Hz */
  #define SNDRV_PCM_RATE_96000		(1<<10)		/* 96000Hz */
  #define SNDRV_PCM_RATE_176400		(1<<11)		/* 176400Hz */
  #define SNDRV_PCM_RATE_192000		(1<<12)		/* 192000Hz */
  
  #define SNDRV_PCM_RATE_CONTINUOUS	(1<<30)		/* continuous range */
  #define SNDRV_PCM_RATE_KNOT		(1<<31)		/* supports more non-continuos rates */
  
  #define SNDRV_PCM_RATE_8000_44100	(SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
  					 SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
  					 SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
  #define SNDRV_PCM_RATE_8000_48000	(SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
  #define SNDRV_PCM_RATE_8000_96000	(SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
  					 SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
  #define SNDRV_PCM_RATE_8000_192000	(SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
  					 SNDRV_PCM_RATE_192000)
fea952e5c   Clemens Ladisch   ALSA: core: spars...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  #define _SNDRV_PCM_FMTBIT(fmt)		(1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt)
  #define SNDRV_PCM_FMTBIT_S8		_SNDRV_PCM_FMTBIT(S8)
  #define SNDRV_PCM_FMTBIT_U8		_SNDRV_PCM_FMTBIT(U8)
  #define SNDRV_PCM_FMTBIT_S16_LE		_SNDRV_PCM_FMTBIT(S16_LE)
  #define SNDRV_PCM_FMTBIT_S16_BE		_SNDRV_PCM_FMTBIT(S16_BE)
  #define SNDRV_PCM_FMTBIT_U16_LE		_SNDRV_PCM_FMTBIT(U16_LE)
  #define SNDRV_PCM_FMTBIT_U16_BE		_SNDRV_PCM_FMTBIT(U16_BE)
  #define SNDRV_PCM_FMTBIT_S24_LE		_SNDRV_PCM_FMTBIT(S24_LE)
  #define SNDRV_PCM_FMTBIT_S24_BE		_SNDRV_PCM_FMTBIT(S24_BE)
  #define SNDRV_PCM_FMTBIT_U24_LE		_SNDRV_PCM_FMTBIT(U24_LE)
  #define SNDRV_PCM_FMTBIT_U24_BE		_SNDRV_PCM_FMTBIT(U24_BE)
  #define SNDRV_PCM_FMTBIT_S32_LE		_SNDRV_PCM_FMTBIT(S32_LE)
  #define SNDRV_PCM_FMTBIT_S32_BE		_SNDRV_PCM_FMTBIT(S32_BE)
  #define SNDRV_PCM_FMTBIT_U32_LE		_SNDRV_PCM_FMTBIT(U32_LE)
  #define SNDRV_PCM_FMTBIT_U32_BE		_SNDRV_PCM_FMTBIT(U32_BE)
  #define SNDRV_PCM_FMTBIT_FLOAT_LE	_SNDRV_PCM_FMTBIT(FLOAT_LE)
  #define SNDRV_PCM_FMTBIT_FLOAT_BE	_SNDRV_PCM_FMTBIT(FLOAT_BE)
  #define SNDRV_PCM_FMTBIT_FLOAT64_LE	_SNDRV_PCM_FMTBIT(FLOAT64_LE)
  #define SNDRV_PCM_FMTBIT_FLOAT64_BE	_SNDRV_PCM_FMTBIT(FLOAT64_BE)
  #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_LE)
  #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_BE)
  #define SNDRV_PCM_FMTBIT_MU_LAW		_SNDRV_PCM_FMTBIT(MU_LAW)
  #define SNDRV_PCM_FMTBIT_A_LAW		_SNDRV_PCM_FMTBIT(A_LAW)
  #define SNDRV_PCM_FMTBIT_IMA_ADPCM	_SNDRV_PCM_FMTBIT(IMA_ADPCM)
  #define SNDRV_PCM_FMTBIT_MPEG		_SNDRV_PCM_FMTBIT(MPEG)
  #define SNDRV_PCM_FMTBIT_GSM		_SNDRV_PCM_FMTBIT(GSM)
  #define SNDRV_PCM_FMTBIT_SPECIAL	_SNDRV_PCM_FMTBIT(SPECIAL)
  #define SNDRV_PCM_FMTBIT_S24_3LE	_SNDRV_PCM_FMTBIT(S24_3LE)
  #define SNDRV_PCM_FMTBIT_U24_3LE	_SNDRV_PCM_FMTBIT(U24_3LE)
  #define SNDRV_PCM_FMTBIT_S24_3BE	_SNDRV_PCM_FMTBIT(S24_3BE)
  #define SNDRV_PCM_FMTBIT_U24_3BE	_SNDRV_PCM_FMTBIT(U24_3BE)
  #define SNDRV_PCM_FMTBIT_S20_3LE	_SNDRV_PCM_FMTBIT(S20_3LE)
  #define SNDRV_PCM_FMTBIT_U20_3LE	_SNDRV_PCM_FMTBIT(U20_3LE)
  #define SNDRV_PCM_FMTBIT_S20_3BE	_SNDRV_PCM_FMTBIT(S20_3BE)
  #define SNDRV_PCM_FMTBIT_U20_3BE	_SNDRV_PCM_FMTBIT(U20_3BE)
  #define SNDRV_PCM_FMTBIT_S18_3LE	_SNDRV_PCM_FMTBIT(S18_3LE)
  #define SNDRV_PCM_FMTBIT_U18_3LE	_SNDRV_PCM_FMTBIT(U18_3LE)
  #define SNDRV_PCM_FMTBIT_S18_3BE	_SNDRV_PCM_FMTBIT(S18_3BE)
  #define SNDRV_PCM_FMTBIT_U18_3BE	_SNDRV_PCM_FMTBIT(U18_3BE)
  #define SNDRV_PCM_FMTBIT_G723_24	_SNDRV_PCM_FMTBIT(G723_24)
  #define SNDRV_PCM_FMTBIT_G723_24_1B	_SNDRV_PCM_FMTBIT(G723_24_1B)
  #define SNDRV_PCM_FMTBIT_G723_40	_SNDRV_PCM_FMTBIT(G723_40)
  #define SNDRV_PCM_FMTBIT_G723_40_1B	_SNDRV_PCM_FMTBIT(G723_40_1B)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
  
  #ifdef SNDRV_LITTLE_ENDIAN
  #define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_LE
  #define SNDRV_PCM_FMTBIT_U16		SNDRV_PCM_FMTBIT_U16_LE
  #define SNDRV_PCM_FMTBIT_S24		SNDRV_PCM_FMTBIT_S24_LE
  #define SNDRV_PCM_FMTBIT_U24		SNDRV_PCM_FMTBIT_U24_LE
  #define SNDRV_PCM_FMTBIT_S32		SNDRV_PCM_FMTBIT_S32_LE
  #define SNDRV_PCM_FMTBIT_U32		SNDRV_PCM_FMTBIT_U32_LE
  #define SNDRV_PCM_FMTBIT_FLOAT		SNDRV_PCM_FMTBIT_FLOAT_LE
  #define SNDRV_PCM_FMTBIT_FLOAT64	SNDRV_PCM_FMTBIT_FLOAT64_LE
  #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
  #endif
  #ifdef SNDRV_BIG_ENDIAN
  #define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_BE
  #define SNDRV_PCM_FMTBIT_U16		SNDRV_PCM_FMTBIT_U16_BE
  #define SNDRV_PCM_FMTBIT_S24		SNDRV_PCM_FMTBIT_S24_BE
  #define SNDRV_PCM_FMTBIT_U24		SNDRV_PCM_FMTBIT_U24_BE
  #define SNDRV_PCM_FMTBIT_S32		SNDRV_PCM_FMTBIT_S32_BE
  #define SNDRV_PCM_FMTBIT_U32		SNDRV_PCM_FMTBIT_U32_BE
  #define SNDRV_PCM_FMTBIT_FLOAT		SNDRV_PCM_FMTBIT_FLOAT_BE
  #define SNDRV_PCM_FMTBIT_FLOAT64	SNDRV_PCM_FMTBIT_FLOAT64_BE
  #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
  #endif
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
201
202
  struct snd_pcm_file {
  	struct snd_pcm_substream *substream;
548a648b9   Takashi Iwai   [ALSA] Fix contro...
203
  	int no_compat_mmap;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  };
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
205
206
207
  struct snd_pcm_hw_rule;
  typedef int (*snd_pcm_hw_rule_func_t)(struct snd_pcm_hw_params *params,
  				      struct snd_pcm_hw_rule *rule);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
209
  struct snd_pcm_hw_rule {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
212
213
214
215
  	unsigned int cond;
  	snd_pcm_hw_rule_func_t func;
  	int var;
  	int deps[4];
  	void *private;
  };
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
216
217
  struct snd_pcm_hw_constraints {
  	struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
  			 SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
219
  	struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
221
222
  			     SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
  	unsigned int rules_num;
  	unsigned int rules_all;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
223
224
  	struct snd_pcm_hw_rule *rules;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
226
227
  static inline struct snd_mask *constrs_mask(struct snd_pcm_hw_constraints *constrs,
  					    snd_pcm_hw_param_t var)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
230
  {
  	return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
231
232
  static inline struct snd_interval *constrs_interval(struct snd_pcm_hw_constraints *constrs,
  						    snd_pcm_hw_param_t var)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
235
  {
  	return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
236
  struct snd_ratnum {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
  	unsigned int num;
  	unsigned int den_min, den_max, den_step;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
239
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
241
  struct snd_ratden {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
  	unsigned int num_min, num_max, num_step;
  	unsigned int den;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
244
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
246
  struct snd_pcm_hw_constraint_ratnums {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  	int nrats;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
248
249
  	struct snd_ratnum *rats;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
251
  struct snd_pcm_hw_constraint_ratdens {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252
  	int nrats;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
253
254
  	struct snd_ratden *rats;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
256
  struct snd_pcm_hw_constraint_list {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
258
259
  	unsigned int count;
  	unsigned int *list;
  	unsigned int mask;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
260
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261

4d96eb255   Jaroslav Kysela   ALSA: pcm_lib - a...
262
  struct snd_pcm_hwptr_log;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
263
  struct snd_pcm_runtime {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264
  	/* -- Status -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
265
  	struct snd_pcm_substream *trigger_master;
07799e756   Takashi Iwai   [ALSA] Use getnst...
266
  	struct timespec trigger_tstamp;	/* trigger timestamp */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
268
269
  	int overrange;
  	snd_pcm_uframes_t avail_max;
  	snd_pcm_uframes_t hw_ptr_base;	/* Position at buffer restart */
e76369257   Jaroslav Kysela   ALSA: pcm_lib - r...
270
  	snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */
bbf6ad139   Jaroslav Kysela   [ALSA] pcm-midlev...
271
  	unsigned long hw_ptr_jiffies;	/* Time when hw_ptr is updated */
bd76af0f8   Jaroslav Kysela   ALSA: pcm midleve...
272
  	unsigned long hw_ptr_buffer_jiffies; /* buffer time in jiffies */
4bbe1ddf8   Takashi Iwai   ALSA: Add extra d...
273
  	snd_pcm_sframes_t delay;	/* extra delay; typically FIFO size */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
275
276
277
278
279
280
281
282
283
  
  	/* -- HW params -- */
  	snd_pcm_access_t access;	/* access mode */
  	snd_pcm_format_t format;	/* SNDRV_PCM_FORMAT_* */
  	snd_pcm_subformat_t subformat;	/* subformat */
  	unsigned int rate;		/* rate in Hz */
  	unsigned int channels;		/* channels */
  	snd_pcm_uframes_t period_size;	/* period size */
  	unsigned int periods;		/* periods */
  	snd_pcm_uframes_t buffer_size;	/* buffer size */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
286
287
288
289
290
  	snd_pcm_uframes_t min_align;	/* Min alignment for the format */
  	size_t byte_align;
  	unsigned int frame_bits;
  	unsigned int sample_bits;
  	unsigned int info;
  	unsigned int rate_num;
  	unsigned int rate_den;
ab69a4904   Clemens Ladisch   ALSA: pcm: suppor...
291
  	unsigned int no_period_wakeup: 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
293
  
  	/* -- SW params -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
294
  	int tstamp_mode;		/* mmap timestamp is updated */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
    	unsigned int period_step;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
297
298
299
300
301
302
303
304
  	snd_pcm_uframes_t start_threshold;
  	snd_pcm_uframes_t stop_threshold;
  	snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
  						noise is nearest than this */
  	snd_pcm_uframes_t silence_size;	/* Silence filling size */
  	snd_pcm_uframes_t boundary;	/* pointers wrap point */
  
  	snd_pcm_uframes_t silence_start; /* starting pointer to silence area */
  	snd_pcm_uframes_t silence_filled; /* size filled with silence */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
305
  	union snd_pcm_sync_id sync;	/* hardware synchronization ID */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
307
  
  	/* -- mmap -- */
503fc85a3   Takashi Iwai   [ALSA] Kill usele...
308
309
  	struct snd_pcm_mmap_status *status;
  	struct snd_pcm_mmap_control *control;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
  
  	/* -- locking / scheduling -- */
5daeba34d   David Dillow   ALSA: pcm_lib: av...
312
  	snd_pcm_uframes_t twake; 	/* do transfer (!poll) wakeup if non-zero */
c91a988dc   Jaroslav Kysela   ALSA: pcm_core: F...
313
314
  	wait_queue_head_t sleep;	/* poll sleep */
  	wait_queue_head_t tsleep;	/* transfer sleep */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
318
  	struct fasync_struct *fasync;
  
  	/* -- private section -- */
  	void *private_data;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
319
  	void (*private_free)(struct snd_pcm_runtime *runtime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
321
  
  	/* -- hardware description -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
322
323
  	struct snd_pcm_hardware hw;
  	struct snd_pcm_hw_constraints hw_constraints;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
325
  
  	/* -- interrupt callbacks -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
326
327
  	void (*transfer_ack_begin)(struct snd_pcm_substream *substream);
  	void (*transfer_ack_end)(struct snd_pcm_substream *substream);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328
329
330
  
  	/* -- timer -- */
  	unsigned int timer_resolution;	/* timer resolution */
b751eef1f   Jaroslav Kysela   [ALSA] Use posix ...
331
  	int tstamp_type;		/* timestamp type */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
334
335
336
337
338
339
340
341
  
  	/* -- DMA -- */           
  	unsigned char *dma_area;	/* DMA area */
  	dma_addr_t dma_addr;		/* physical bus address (not accessible from main CPU) */
  	size_t dma_bytes;		/* size of DMA area */
  
  	struct snd_dma_buffer *dma_buffer_p;	/* allocated buffer */
  
  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
  	/* -- OSS things -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
342
  	struct snd_pcm_oss_runtime oss;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
343
  #endif
4d96eb255   Jaroslav Kysela   ALSA: pcm_lib - a...
344
345
346
347
  
  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
  	struct snd_pcm_hwptr_log *hwptr_log;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
348
  };
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
349
  struct snd_pcm_group {		/* keep linked substreams */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
352
  	spinlock_t lock;
  	struct list_head substreams;
  	int count;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
353
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354

e7373b702   Clemens Ladisch   sound: pcm: recor...
355
  struct pid;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
356
357
358
  struct snd_pcm_substream {
  	struct snd_pcm *pcm;
  	struct snd_pcm_str *pstr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
360
361
362
  	void *private_data;		/* copied from pcm->private_data */
  	int number;
  	char name[32];			/* substream name */
  	int stream;			/* stream (direction) */
cc7499861   Jean Pihet   PM QoS: Minor cle...
363
  	struct pm_qos_request latency_pm_qos_req; /* pm_qos request */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
365
366
367
368
  	size_t buffer_bytes_max;	/* limit ring buffer size */
  	struct snd_dma_buffer dma_buffer;
  	unsigned int dma_buf_id;
  	size_t dma_max;
  	/* -- hardware operations -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
369
  	struct snd_pcm_ops *ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
370
  	/* -- runtime information -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
371
  	struct snd_pcm_runtime *runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
          /* -- timer section -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
373
  	struct snd_timer *timer;		/* timer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
  	unsigned timer_running: 1;	/* time is running */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
  	/* -- next substream -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
376
  	struct snd_pcm_substream *next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377
378
  	/* -- linked substreams -- */
  	struct list_head link_list;	/* linked list member */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
379
380
  	struct snd_pcm_group self_group;	/* fake group for non linked substream (with substream lock inside) */
  	struct snd_pcm_group *group;		/* pointer to current group */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381
  	/* -- assigned files -- */
1576274d3   Takashi Iwai   [ALSA] Fix Oops o...
382
  	void *file;
0df63e44c   Takashi Iwai   [ALSA] Add O_APPE...
383
  	int ref_count;
9c323fcbc   Takashi Iwai   [ALSA] Fix mmap_c...
384
  	atomic_t mmap_count;
0df63e44c   Takashi Iwai   [ALSA] Add O_APPE...
385
  	unsigned int f_flags;
3bf75f9b9   Takashi Iwai   [ALSA] Clean up P...
386
  	void (*pcm_release)(struct snd_pcm_substream *);
e7373b702   Clemens Ladisch   sound: pcm: recor...
387
  	struct pid *pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
389
  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
  	/* -- OSS things -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
390
  	struct snd_pcm_oss_substream oss;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
  #endif
b7d90a356   Takashi Iwai   [ALSA] Fix Oops a...
392
  #ifdef CONFIG_SND_VERBOSE_PROCFS
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
393
394
395
396
397
398
  	struct snd_info_entry *proc_root;
  	struct snd_info_entry *proc_info_entry;
  	struct snd_info_entry *proc_hw_params_entry;
  	struct snd_info_entry *proc_sw_params_entry;
  	struct snd_info_entry *proc_status_entry;
  	struct snd_info_entry *proc_prealloc_entry;
c7132aeb7   Jaroslav Kysela   [ALSA] pcm core: ...
399
  	struct snd_info_entry *proc_prealloc_max_entry;
b7d90a356   Takashi Iwai   [ALSA] Fix Oops a...
400
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
401
  	/* misc flags */
3bf75f9b9   Takashi Iwai   [ALSA] Clean up P...
402
  	unsigned int hw_opened: 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
  };
0df63e44c   Takashi Iwai   [ALSA] Add O_APPE...
404
  #define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
405

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
406
  struct snd_pcm_str {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
  	int stream;				/* stream (direction) */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
408
  	struct snd_pcm *pcm;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
411
  	/* -- substreams -- */
  	unsigned int substream_count;
  	unsigned int substream_opened;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
412
  	struct snd_pcm_substream *substream;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
414
  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
  	/* -- OSS things -- */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
415
  	struct snd_pcm_oss_stream oss;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
  #endif
b7d90a356   Takashi Iwai   [ALSA] Fix Oops a...
417
  #ifdef CONFIG_SND_VERBOSE_PROCFS
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
418
419
  	struct snd_info_entry *proc_root;
  	struct snd_info_entry *proc_info_entry;
b7d90a356   Takashi Iwai   [ALSA] Fix Oops a...
420
  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
421
  	unsigned int xrun_debug;	/* 0 = disabled, 1 = verbose, 2 = stacktrace */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
422
  	struct snd_info_entry *proc_xrun_debug_entry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
423
  #endif
b7d90a356   Takashi Iwai   [ALSA] Fix Oops a...
424
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
  };
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
426
427
  struct snd_pcm {
  	struct snd_card *card;
f87135f56   Clemens Ladisch   [ALSA] dynamic mi...
428
  	struct list_head list;
f90c06a2b   Pawel MOLL   ALSA: Fix limit o...
429
  	int device; /* device number */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
430
431
432
433
434
  	unsigned int info_flags;
  	unsigned short dev_class;
  	unsigned short dev_subclass;
  	char id[64];
  	char name[80];
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
435
  	struct snd_pcm_str streams[2];
1a60d4c5a   Ingo Molnar   [ALSA] semaphore ...
436
  	struct mutex open_mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
438
  	wait_queue_head_t open_wait;
  	void *private_data;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
439
  	void (*private_free) (struct snd_pcm *pcm);
c78085fcd   Johannes Berg   [ALSA] alsa core:...
440
  	struct device *dev; /* actual hw device this belongs to */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
  #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
442
  	struct snd_pcm_oss oss;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
  #endif
  };
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
445
446
447
448
  struct snd_pcm_notify {
  	int (*n_register) (struct snd_pcm * pcm);
  	int (*n_disconnect) (struct snd_pcm * pcm);
  	int (*n_unregister) (struct snd_pcm * pcm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
  	struct list_head list;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
450
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
452
453
454
  
  /*
   *  Registering
   */
540473208   Arjan van de Ven   [PATCH] mark stru...
455
  extern const struct file_operations snd_pcm_f_ops[2];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456

e61616530   Tim Blechmann   ALSA: snd_pcm_new...
457
  int snd_pcm_new(struct snd_card *card, const char *id, int device,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
  		int playback_count, int capture_count,
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
459
460
  		struct snd_pcm **rpcm);
  int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
462
  int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
466
467
468
  
  /*
   *  Native I/O
   */
  
  extern rwlock_t snd_pcm_link_rwlock;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
469
470
471
472
473
  int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info);
  int snd_pcm_info_user(struct snd_pcm_substream *substream,
  		      struct snd_pcm_info __user *info);
  int snd_pcm_status(struct snd_pcm_substream *substream,
  		   struct snd_pcm_status *status);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
474
  int snd_pcm_start(struct snd_pcm_substream *substream);
fea952e5c   Clemens Ladisch   ALSA: core: spars...
475
  int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
476
  int snd_pcm_drain_done(struct snd_pcm_substream *substream);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
  #ifdef CONFIG_PM
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
478
479
  int snd_pcm_suspend(struct snd_pcm_substream *substream);
  int snd_pcm_suspend_all(struct snd_pcm *pcm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
  #endif
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
481
  int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
3bf75f9b9   Takashi Iwai   [ALSA] Clean up P...
482
483
  int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct file *file,
  			   struct snd_pcm_substream **rsubstream);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
484
  void snd_pcm_release_substream(struct snd_pcm_substream *substream);
3bf75f9b9   Takashi Iwai   [ALSA] Clean up P...
485
486
487
  int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, struct file *file,
  			     struct snd_pcm_substream **rsubstream);
  void snd_pcm_detach_substream(struct snd_pcm_substream *substream);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
  void snd_pcm_vma_notify_data(void *client, void *data);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
489
  int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490

acb03d440   Eliot Blennerhassett   ALSA: Make snd_pc...
491
492
493
494
495
496
497
498
499
500
501
  
  #ifdef CONFIG_SND_DEBUG
  void snd_pcm_debug_name(struct snd_pcm_substream *substream,
  			   char *name, size_t len);
  #else
  static inline void
  snd_pcm_debug_name(struct snd_pcm_substream *substream, char *buf, size_t size)
  {
  	*buf = 0;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
503
504
  /*
   *  PCM library
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
505
  static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
508
  {
  	return substream->group != &substream->self_group;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
509
  static inline void snd_pcm_stream_lock(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
511
512
513
  {
  	read_lock(&snd_pcm_link_rwlock);
  	spin_lock(&substream->self_group.lock);
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
514
  static inline void snd_pcm_stream_unlock(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515
516
517
518
  {
  	spin_unlock(&substream->self_group.lock);
  	read_unlock(&snd_pcm_link_rwlock);
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
519
  static inline void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
522
523
  {
  	read_lock_irq(&snd_pcm_link_rwlock);
  	spin_lock(&substream->self_group.lock);
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
524
  static inline void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
  {
  	spin_unlock(&substream->self_group.lock);
  	read_unlock_irq(&snd_pcm_link_rwlock);
  }
  
  #define snd_pcm_stream_lock_irqsave(substream, flags) \
  do { \
  	read_lock_irqsave(&snd_pcm_link_rwlock, (flags)); \
  	spin_lock(&substream->self_group.lock); \
  } while (0)
  
  #define snd_pcm_stream_unlock_irqrestore(substream, flags) \
  do { \
  	spin_unlock(&substream->self_group.lock); \
  	read_unlock_irqrestore(&snd_pcm_link_rwlock, (flags)); \
  } while (0)
ef991b95a   Takashi Iwai   [ALSA] Add snd_pc...
541
542
  #define snd_pcm_group_for_each_entry(s, substream) \
  	list_for_each_entry(s, &substream->group->substreams, link_list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
544
  static inline int snd_pcm_running(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
545
546
547
548
549
  {
  	return (substream->runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
  		(substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING &&
  		 substream->stream == SNDRV_PCM_STREAM_PLAYBACK));
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
550
  static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551
552
553
  {
  	return size * 8 / runtime->sample_bits;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
554
  static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
556
557
  {
  	return size * 8 / runtime->frame_bits;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
558
  static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
560
561
  {
  	return size * runtime->sample_bits / 8;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
562
  static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563
564
565
  {
  	return size * runtime->frame_bits / 8;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
566
  static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
567
568
569
  {
  	return bytes % runtime->byte_align == 0;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
570
  static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
572
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
574
  	return frames_to_bytes(runtime, runtime->buffer_size);
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
575
  static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
577
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578
579
580
581
582
583
  	return frames_to_bytes(runtime, runtime->period_size);
  }
  
  /*
   *  result is: 0 ... (boundary - 1)
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
584
  static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
585
586
587
588
589
590
591
592
593
594
595
596
  {
  	snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
  	if (avail < 0)
  		avail += runtime->boundary;
  	else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
  		avail -= runtime->boundary;
  	return avail;
  }
  
  /*
   *  result is: 0 ... (boundary - 1)
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
597
  static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
598
599
600
601
602
603
  {
  	snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
  	if (avail < 0)
  		avail += runtime->boundary;
  	return avail;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
604
  static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
605
606
607
  {
  	return runtime->buffer_size - snd_pcm_playback_avail(runtime);
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
608
  static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
609
610
611
612
613
614
615
616
617
618
619
620
  {
  	return runtime->buffer_size - snd_pcm_capture_avail(runtime);
  }
  
  /**
   * snd_pcm_playback_ready - check whether the playback buffer is available
   * @substream: the pcm substream instance
   *
   * Checks whether enough free space is available on the playback buffer.
   *
   * Returns non-zero if available, or zero if not.
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
621
  static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
622
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
623
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
625
626
627
628
629
630
631
632
633
634
  	return snd_pcm_playback_avail(runtime) >= runtime->control->avail_min;
  }
  
  /**
   * snd_pcm_capture_ready - check whether the capture buffer is available
   * @substream: the pcm substream instance
   *
   * Checks whether enough capture data is available on the capture buffer.
   *
   * Returns non-zero if available, or zero if not.
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
635
  static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
637
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
639
640
641
642
643
644
645
646
647
648
649
  	return snd_pcm_capture_avail(runtime) >= runtime->control->avail_min;
  }
  
  /**
   * snd_pcm_playback_data - check whether any data exists on the playback buffer
   * @substream: the pcm substream instance
   *
   * Checks whether any data exists on the playback buffer. If stop_threshold
   * is bigger or equal to boundary, then this function returns always non-zero.
   *
   * Returns non-zero if exists, or zero if not.
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
650
  static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
651
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
652
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
654
655
656
657
658
659
660
661
662
663
664
665
666
  	
  	if (runtime->stop_threshold >= runtime->boundary)
  		return 1;
  	return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
  }
  
  /**
   * snd_pcm_playback_empty - check whether the playback buffer is empty
   * @substream: the pcm substream instance
   *
   * Checks whether the playback buffer is empty.
   *
   * Returns non-zero if empty, or zero if not.
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
667
  static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
669
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
670
671
672
673
674
675
676
677
678
679
680
  	return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
  }
  
  /**
   * snd_pcm_capture_empty - check whether the capture buffer is empty
   * @substream: the pcm substream instance
   *
   * Checks whether the capture buffer is empty.
   *
   * Returns non-zero if empty, or zero if not.
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
681
  static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
682
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
683
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
684
685
  	return snd_pcm_capture_avail(runtime) == 0;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
686
687
  static inline void snd_pcm_trigger_done(struct snd_pcm_substream *substream, 
  					struct snd_pcm_substream *master)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
  {
  	substream->runtime->trigger_master = master;
  }
  
  static inline int hw_is_mask(int var)
  {
  	return var >= SNDRV_PCM_HW_PARAM_FIRST_MASK &&
  		var <= SNDRV_PCM_HW_PARAM_LAST_MASK;
  }
  
  static inline int hw_is_interval(int var)
  {
  	return var >= SNDRV_PCM_HW_PARAM_FIRST_INTERVAL &&
  		var <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL;
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
703
  static inline struct snd_mask *hw_param_mask(struct snd_pcm_hw_params *params,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
704
705
706
707
  				     snd_pcm_hw_param_t var)
  {
  	return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
708
  static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *params,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
710
711
712
  					     snd_pcm_hw_param_t var)
  {
  	return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
713
  static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
714
715
  					     snd_pcm_hw_param_t var)
  {
b9f09a485   Takashi Iwai   [ALSA] Fix 'disca...
716
  	return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
  }
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
718
  static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
719
720
  						     snd_pcm_hw_param_t var)
  {
b9f09a485   Takashi Iwai   [ALSA] Fix 'disca...
721
  	return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
722
  }
b51beb756   Takashi Iwai   ALSA: Make pcm.h ...
723
724
725
726
727
728
729
730
731
732
733
734
  #define params_channels(p) \
  	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_CHANNELS)->min)
  #define params_rate(p) \
  	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_RATE)->min)
  #define params_period_size(p) \
  	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min)
  #define params_periods(p) \
  	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_PERIODS)->min)
  #define params_buffer_size(p) \
  	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min)
  #define params_buffer_bytes(p) \
  	(hw_param_interval_c((p), SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
735

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
736
737
738
739
740
741
742
743
744
745
  int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);
  void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c);
  void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c);
  void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b, 
  			  unsigned int k, struct snd_interval *c);
  void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
  			  const struct snd_interval *b, struct snd_interval *c);
  int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask);
  int snd_interval_ratnum(struct snd_interval *i,
  			unsigned int rats_count, struct snd_ratnum *rats,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
746
  			unsigned int *nump, unsigned int *denp);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
747
748
  void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params);
  void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
749
  int snd_pcm_hw_params_choose(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
751
  int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
753
754
  int snd_pcm_hw_constraints_init(struct snd_pcm_substream *substream);
  int snd_pcm_hw_constraints_complete(struct snd_pcm_substream *substream);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
755

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
756
  int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
757
  			       u_int32_t mask);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
758
  int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759
  				 u_int64_t mask);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
760
  int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
761
  				 unsigned int min, unsigned int max);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
762
763
  int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var);
  int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime, 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
764
765
  			       unsigned int cond,
  			       snd_pcm_hw_param_t var,
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
766
767
  			       struct snd_pcm_hw_constraint_list *l);
  int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime, 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
768
769
  				  unsigned int cond,
  				  snd_pcm_hw_param_t var,
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
770
771
  				  struct snd_pcm_hw_constraint_ratnums *r);
  int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime, 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
  				  unsigned int cond,
  				  snd_pcm_hw_param_t var,
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
774
775
  				  struct snd_pcm_hw_constraint_ratdens *r);
  int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime, 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776
777
778
  				 unsigned int cond,
  				 unsigned int width,
  				 unsigned int msbits);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
779
  int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
781
782
  			       unsigned int cond,
  			       snd_pcm_hw_param_t var,
  			       unsigned long step);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
783
  int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
785
  			       unsigned int cond,
  			       snd_pcm_hw_param_t var);
d5b702a64   Clemens Ladisch   ALSA: pcm: add sn...
786
787
  int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
  			       unsigned int base_rate);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
788
  int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789
790
791
792
793
794
795
796
797
798
  			unsigned int cond,
  			int var,
  			snd_pcm_hw_rule_func_t func, void *private,
  			int dep, ...);
  
  int snd_pcm_format_signed(snd_pcm_format_t format);
  int snd_pcm_format_unsigned(snd_pcm_format_t format);
  int snd_pcm_format_linear(snd_pcm_format_t format);
  int snd_pcm_format_little_endian(snd_pcm_format_t format);
  int snd_pcm_format_big_endian(snd_pcm_format_t format);
1b44c28dc   Takashi Iwai   [ALSA] Another fi...
799
800
  #if 0 /* just for DocBook */
  /**
9502dcad6   Takashi Iwai   [ALSA] Export mis...
801
802
803
804
805
806
   * snd_pcm_format_cpu_endian - Check the PCM format is CPU-endian
   * @format: the format to check
   *
   * Returns 1 if the given PCM format is CPU-endian, 0 if
   * opposite, or a negative error code if endian not specified.
   */
8cdfd2519   Takashi Iwai   [ALSA] Remove sup...
807
  int snd_pcm_format_cpu_endian(snd_pcm_format_t format);
1b44c28dc   Takashi Iwai   [ALSA] Another fi...
808
  #endif /* DocBook */
9502dcad6   Takashi Iwai   [ALSA] Export mis...
809
  #ifdef SNDRV_LITTLE_ENDIAN
9d01a82e4   Martin Waitz   [PATCH] DocBook: ...
810
  #define snd_pcm_format_cpu_endian(format) snd_pcm_format_little_endian(format)
9502dcad6   Takashi Iwai   [ALSA] Export mis...
811
  #else
9d01a82e4   Martin Waitz   [PATCH] DocBook: ...
812
  #define snd_pcm_format_cpu_endian(format) snd_pcm_format_big_endian(format)
9502dcad6   Takashi Iwai   [ALSA] Export mis...
813
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
815
  int snd_pcm_format_width(snd_pcm_format_t format);			/* in bits */
  int snd_pcm_format_physical_width(snd_pcm_format_t format);		/* in bits */
9502dcad6   Takashi Iwai   [ALSA] Export mis...
816
  ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
817
818
819
  const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);
  int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames);
  snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_endian);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
821
822
823
824
  void snd_pcm_set_ops(struct snd_pcm * pcm, int direction, struct snd_pcm_ops *ops);
  void snd_pcm_set_sync(struct snd_pcm_substream *substream);
  int snd_pcm_lib_interleave_len(struct snd_pcm_substream *substream);
  int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
825
  		      unsigned int cmd, void *arg);                      
1250932e4   Jaroslav Kysela   ALSA: pcm_lib - o...
826
827
  int snd_pcm_update_state(struct snd_pcm_substream *substream,
  			 struct snd_pcm_runtime *runtime);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
828
829
830
831
832
833
  int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream);
  int snd_pcm_playback_xrun_check(struct snd_pcm_substream *substream);
  int snd_pcm_capture_xrun_check(struct snd_pcm_substream *substream);
  int snd_pcm_playback_xrun_asap(struct snd_pcm_substream *substream);
  int snd_pcm_capture_xrun_asap(struct snd_pcm_substream *substream);
  void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
834
835
  void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
  snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
836
837
  				    const void __user *buf,
  				    snd_pcm_uframes_t frames);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
838
  snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
  				   void __user *buf, snd_pcm_uframes_t frames);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
840
  snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
841
  				     void __user **bufs, snd_pcm_uframes_t frames);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
842
  snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  				    void __user **bufs, snd_pcm_uframes_t frames);
7653d5576   Clemens Ladisch   [ALSA] pcm: merge...
844
  extern const struct snd_pcm_hw_constraint_list snd_pcm_known_rates;
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
845
  int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);
918f3a0e8   Clemens Ladisch   [ALSA] pcm: add s...
846
  unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847

877211f5e   Takashi Iwai   [ALSA] Remove xxx...
848
  static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849
850
  					      struct snd_dma_buffer *bufp)
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
851
  	struct snd_pcm_runtime *runtime = substream->runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
  	if (bufp) {
  		runtime->dma_buffer_p = bufp;
  		runtime->dma_area = bufp->area;
  		runtime->dma_addr = bufp->addr;
  		runtime->dma_bytes = bufp->bytes;
  	} else {
  		runtime->dma_buffer_p = NULL;
  		runtime->dma_area = NULL;
  		runtime->dma_addr = 0;
  		runtime->dma_bytes = 0;
  	}
  }
  
  /*
   *  Timer interface
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
868
869
870
  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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871

b751eef1f   Jaroslav Kysela   [ALSA] Use posix ...
872
873
874
875
876
877
878
879
  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);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
880
881
882
  /*
   *  Memory
   */
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
883
884
885
  int snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream);
  int snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm);
  int snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
886
887
  				  int type, struct device *data,
  				  size_t size, size_t max);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
888
  int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
889
890
  					  int type, void *data,
  					  size_t size, size_t max);
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
891
892
  int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
  int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893

681b84e17   Clemens Ladisch   sound: pcm: add v...
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
  int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream,
  				      size_t size, gfp_t gfp_flags);
  int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream);
  struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream,
  					  unsigned long offset);
  #if 0 /* for kernel-doc */
  /**
   * snd_pcm_lib_alloc_vmalloc_buffer - allocate virtual DMA buffer
   * @substream: the substream to allocate the buffer to
   * @size: the requested buffer size, in bytes
   *
   * Allocates the PCM substream buffer using vmalloc(), i.e., the memory is
   * contiguous in kernel virtual space, but not in physical memory.  Use this
   * if the buffer is accessed by kernel code but not by device DMA.
   *
   * Returns 1 if the buffer was changed, 0 if not changed, or a negative error
   * code.
   */
  static int snd_pcm_lib_alloc_vmalloc_buffer
  			(struct snd_pcm_substream *substream, size_t size);
  /**
   * snd_pcm_lib_alloc_vmalloc_32_buffer - allocate 32-bit-addressable buffer
   * @substream: the substream to allocate the buffer to
   * @size: the requested buffer size, in bytes
   *
   * This function works like snd_pcm_lib_alloc_vmalloc_buffer(), but uses
   * vmalloc_32(), i.e., the pages are allocated from 32-bit-addressable memory.
   */
  static int snd_pcm_lib_alloc_vmalloc_32_buffer
  			(struct snd_pcm_substream *substream, size_t size);
  #endif
  #define snd_pcm_lib_alloc_vmalloc_buffer(subs, size) \
  	_snd_pcm_lib_alloc_vmalloc_buffer \
  			(subs, size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO)
  #define snd_pcm_lib_alloc_vmalloc_32_buffer(subs, size) \
  	_snd_pcm_lib_alloc_vmalloc_buffer \
  			(subs, size, GFP_KERNEL | GFP_DMA32 | __GFP_ZERO)
cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
931
  #ifdef CONFIG_SND_DMA_SGBUF
77a23f269   Takashi Iwai   ALSA: Clean up SG...
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
  /*
   * SG-buffer handling
   */
  #define snd_pcm_substream_sgbuf(substream) \
  	((substream)->runtime->dma_buffer_p->private_data)
  
  static inline dma_addr_t
  snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
  {
  	struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream);
  	return snd_sgbuf_get_addr(sg, ofs);
  }
  
  static inline void *
  snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)
  {
  	struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream);
  	return snd_sgbuf_get_ptr(sg, ofs);
  }
  
  struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream,
  				    unsigned long offset);
51e9f2e66   Takashi Iwai   ALSA: Allocate la...
954
955
  unsigned int snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
  					  unsigned int ofs, unsigned int size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
956

cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
  #else /* !SND_DMA_SGBUF */
  /*
   * fake using a continuous buffer
   */
  static inline dma_addr_t
  snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
  {
  	return substream->runtime->dma_addr + ofs;
  }
  
  static inline void *
  snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)
  {
  	return substream->runtime->dma_area + ofs;
  }
  
  #define snd_pcm_sgbuf_ops_page	NULL
  
  #define snd_pcm_sgbuf_get_chunk_size(subs, ofs, size)	(size)
  
  #endif /* SND_DMA_SGBUF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
978
979
980
  /* handle mmap counter - PCM mmap callback should handle this counter properly */
  static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
981
  	struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
9c323fcbc   Takashi Iwai   [ALSA] Fix mmap_c...
982
  	atomic_inc(&substream->mmap_count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983
984
985
986
  }
  
  static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)
  {
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
987
  	struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
9c323fcbc   Takashi Iwai   [ALSA] Fix mmap_c...
988
  	atomic_dec(&substream->mmap_count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
  }
18a2b9623   Takashi Iwai   ALSA: pcm - Expor...
990
991
  int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
  			     struct vm_area_struct *area);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
992
993
994
  /* mmap for io-memory area */
  #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)
  #define SNDRV_PCM_INFO_MMAP_IOMEM	SNDRV_PCM_INFO_MMAP
877211f5e   Takashi Iwai   [ALSA] Remove xxx...
995
  int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
996
997
998
999
  #else
  #define SNDRV_PCM_INFO_MMAP_IOMEM	0
  #define snd_pcm_lib_mmap_iomem	NULL
  #endif
3674f19da   Benjamin Herrenschmidt   ALSA: vmalloc buf...
1000
  #define snd_pcm_lib_mmap_vmalloc NULL
c32d977b8   Takashi Iwai   ALSA: pcm - Call ...
1001

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
  static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
  {
  	*max = dma < 4 ? 64 * 1024 : 128 * 1024;
  }
  
  /*
   *  Misc
   */
  
  #define SNDRV_PCM_DEFAULT_CON_SPDIF	(IEC958_AES0_CON_EMPHASIS_NONE|\
  					 (IEC958_AES1_CON_ORIGINAL<<8)|\
  					 (IEC958_AES1_CON_PCM_CODER<<8)|\
  					 (IEC958_AES3_CON_FS_48000<<24))
7eaa943c8   Takashi Iwai   ALSA: Kill snd_as...
1015
  #define PCM_RUNTIME_CHECK(sub) snd_BUG_ON(!(sub) || !(sub)->runtime)
6e5265ec3   Takashi Iwai   ALSA: Re-export s...
1016
  const char *snd_pcm_format_name(snd_pcm_format_t format);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1017
  #endif /* __SOUND_PCM_H */