1#ifndef __SOUND_PCM_H
2#define __SOUND_PCM_H
3
4/*
5 *  Digital Audio (PCM) 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 <sound/memalloc.h>
28#include <linux/poll.h>
29#include <linux/mm.h>
30#include <linux/bitops.h>
31
32#define snd_pcm_substream_chip(substream) ((substream)->private_data)
33#define snd_pcm_chip(pcm) ((pcm)->private_data)
34
35#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
36#include "pcm_oss.h"
37#endif
38
39/*
40 *  Hardware (lowlevel) section
41 */
42
43struct snd_pcm_hardware {
44	unsigned int info;		/* SNDRV_PCM_INFO_* */
45	u64 formats;			/* SNDRV_PCM_FMTBIT_* */
46	unsigned int rates;		/* SNDRV_PCM_RATE_* */
47	unsigned int rate_min;		/* min rate */
48	unsigned int rate_max;		/* max rate */
49	unsigned int channels_min;	/* min channels */
50	unsigned int channels_max;	/* max channels */
51	size_t buffer_bytes_max;	/* max buffer size */
52	size_t period_bytes_min;	/* min period size */
53	size_t period_bytes_max;	/* max period size */
54	unsigned int periods_min;	/* min # of periods */
55	unsigned int periods_max;	/* max # of periods */
56	size_t fifo_size;		/* fifo size in bytes */
57};
58
59struct snd_pcm_substream;
60
61struct snd_pcm_ops {
62	int (*open)(struct snd_pcm_substream *substream);
63	int (*close)(struct snd_pcm_substream *substream);
64	int (*ioctl)(struct snd_pcm_substream * substream,
65		     unsigned int cmd, void *arg);
66	int (*hw_params)(struct snd_pcm_substream *substream,
67			 struct snd_pcm_hw_params *params);
68	int (*hw_free)(struct snd_pcm_substream *substream);
69	int (*prepare)(struct snd_pcm_substream *substream);
70	int (*trigger)(struct snd_pcm_substream *substream, int cmd);
71	snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
72	int (*copy)(struct snd_pcm_substream *substream, int channel,
73		    snd_pcm_uframes_t pos,
74		    void __user *buf, snd_pcm_uframes_t count);
75	int (*silence)(struct snd_pcm_substream *substream, int channel,
76		       snd_pcm_uframes_t pos, snd_pcm_uframes_t count);
77	struct page *(*page)(struct snd_pcm_substream *substream,
78			     unsigned long offset);
79	int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma);
80	int (*ack)(struct snd_pcm_substream *substream);
81};
82
83/*
84 *
85 */
86
87#define SNDRV_PCM_DEVICES		8
88
89#define SNDRV_PCM_IOCTL1_FALSE		((void *)0)
90#define SNDRV_PCM_IOCTL1_TRUE		((void *)1)
91
92#define SNDRV_PCM_IOCTL1_RESET		0
93#define SNDRV_PCM_IOCTL1_INFO		1
94#define SNDRV_PCM_IOCTL1_CHANNEL_INFO	2
95#define SNDRV_PCM_IOCTL1_GSTATE		3
96
97#define SNDRV_PCM_TRIGGER_STOP		0
98#define SNDRV_PCM_TRIGGER_START		1
99#define SNDRV_PCM_TRIGGER_PAUSE_PUSH	3
100#define SNDRV_PCM_TRIGGER_PAUSE_RELEASE	4
101#define SNDRV_PCM_TRIGGER_SUSPEND	5
102#define SNDRV_PCM_TRIGGER_RESUME	6
103
104#define SNDRV_PCM_POS_XRUN		((snd_pcm_uframes_t)-1)
105
106/* If you change this don't forget to change rates[] table in pcm_native.c */
107#define SNDRV_PCM_RATE_5512		(1<<0)		/* 5512Hz */
108#define SNDRV_PCM_RATE_8000		(1<<1)		/* 8000Hz */
109#define SNDRV_PCM_RATE_11025		(1<<2)		/* 11025Hz */
110#define SNDRV_PCM_RATE_16000		(1<<3)		/* 16000Hz */
111#define SNDRV_PCM_RATE_22050		(1<<4)		/* 22050Hz */
112#define SNDRV_PCM_RATE_32000		(1<<5)		/* 32000Hz */
113#define SNDRV_PCM_RATE_44100		(1<<6)		/* 44100Hz */
114#define SNDRV_PCM_RATE_48000		(1<<7)		/* 48000Hz */
115#define SNDRV_PCM_RATE_64000		(1<<8)		/* 64000Hz */
116#define SNDRV_PCM_RATE_88200		(1<<9)		/* 88200Hz */
117#define SNDRV_PCM_RATE_96000		(1<<10)		/* 96000Hz */
118#define SNDRV_PCM_RATE_176400		(1<<11)		/* 176400Hz */
119#define SNDRV_PCM_RATE_192000		(1<<12)		/* 192000Hz */
120
121#define SNDRV_PCM_RATE_CONTINUOUS	(1<<30)		/* continuous range */
122#define SNDRV_PCM_RATE_KNOT		(1<<31)		/* supports more non-continuos rates */
123
124#define SNDRV_PCM_RATE_8000_44100	(SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
125					 SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
126					 SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
127#define SNDRV_PCM_RATE_8000_48000	(SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
128#define SNDRV_PCM_RATE_8000_96000	(SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
129					 SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
130#define SNDRV_PCM_RATE_8000_192000	(SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
131					 SNDRV_PCM_RATE_192000)
132#define SNDRV_PCM_FMTBIT_S8		(1ULL << SNDRV_PCM_FORMAT_S8)
133#define SNDRV_PCM_FMTBIT_U8		(1ULL << SNDRV_PCM_FORMAT_U8)
134#define SNDRV_PCM_FMTBIT_S16_LE		(1ULL << SNDRV_PCM_FORMAT_S16_LE)
135#define SNDRV_PCM_FMTBIT_S16_BE		(1ULL << SNDRV_PCM_FORMAT_S16_BE)
136#define SNDRV_PCM_FMTBIT_U16_LE		(1ULL << SNDRV_PCM_FORMAT_U16_LE)
137#define SNDRV_PCM_FMTBIT_U16_BE		(1ULL << SNDRV_PCM_FORMAT_U16_BE)
138#define SNDRV_PCM_FMTBIT_S24_LE		(1ULL << SNDRV_PCM_FORMAT_S24_LE)
139#define SNDRV_PCM_FMTBIT_S24_BE		(1ULL << SNDRV_PCM_FORMAT_S24_BE)
140#define SNDRV_PCM_FMTBIT_U24_LE		(1ULL << SNDRV_PCM_FORMAT_U24_LE)
141#define SNDRV_PCM_FMTBIT_U24_BE		(1ULL << SNDRV_PCM_FORMAT_U24_BE)
142#define SNDRV_PCM_FMTBIT_S32_LE		(1ULL << SNDRV_PCM_FORMAT_S32_LE)
143#define SNDRV_PCM_FMTBIT_S32_BE		(1ULL << SNDRV_PCM_FORMAT_S32_BE)
144#define SNDRV_PCM_FMTBIT_U32_LE		(1ULL << SNDRV_PCM_FORMAT_U32_LE)
145#define SNDRV_PCM_FMTBIT_U32_BE		(1ULL << SNDRV_PCM_FORMAT_U32_BE)
146#define SNDRV_PCM_FMTBIT_FLOAT_LE	(1ULL << SNDRV_PCM_FORMAT_FLOAT_LE)
147#define SNDRV_PCM_FMTBIT_FLOAT_BE	(1ULL << SNDRV_PCM_FORMAT_FLOAT_BE)
148#define SNDRV_PCM_FMTBIT_FLOAT64_LE	(1ULL << SNDRV_PCM_FORMAT_FLOAT64_LE)
149#define SNDRV_PCM_FMTBIT_FLOAT64_BE	(1ULL << SNDRV_PCM_FORMAT_FLOAT64_BE)
150#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE)
151#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE)
152#define SNDRV_PCM_FMTBIT_MU_LAW		(1ULL << SNDRV_PCM_FORMAT_MU_LAW)
153#define SNDRV_PCM_FMTBIT_A_LAW		(1ULL << SNDRV_PCM_FORMAT_A_LAW)
154#define SNDRV_PCM_FMTBIT_IMA_ADPCM	(1ULL << SNDRV_PCM_FORMAT_IMA_ADPCM)
155#define SNDRV_PCM_FMTBIT_MPEG		(1ULL << SNDRV_PCM_FORMAT_MPEG)
156#define SNDRV_PCM_FMTBIT_GSM		(1ULL << SNDRV_PCM_FORMAT_GSM)
157#define SNDRV_PCM_FMTBIT_SPECIAL	(1ULL << SNDRV_PCM_FORMAT_SPECIAL)
158#define SNDRV_PCM_FMTBIT_S24_3LE	(1ULL << SNDRV_PCM_FORMAT_S24_3LE)
159#define SNDRV_PCM_FMTBIT_U24_3LE	(1ULL << SNDRV_PCM_FORMAT_U24_3LE)
160#define SNDRV_PCM_FMTBIT_S24_3BE	(1ULL << SNDRV_PCM_FORMAT_S24_3BE)
161#define SNDRV_PCM_FMTBIT_U24_3BE	(1ULL << SNDRV_PCM_FORMAT_U24_3BE)
162#define SNDRV_PCM_FMTBIT_S20_3LE	(1ULL << SNDRV_PCM_FORMAT_S20_3LE)
163#define SNDRV_PCM_FMTBIT_U20_3LE	(1ULL << SNDRV_PCM_FORMAT_U20_3LE)
164#define SNDRV_PCM_FMTBIT_S20_3BE	(1ULL << SNDRV_PCM_FORMAT_S20_3BE)
165#define SNDRV_PCM_FMTBIT_U20_3BE	(1ULL << SNDRV_PCM_FORMAT_U20_3BE)
166#define SNDRV_PCM_FMTBIT_S18_3LE	(1ULL << SNDRV_PCM_FORMAT_S18_3LE)
167#define SNDRV_PCM_FMTBIT_U18_3LE	(1ULL << SNDRV_PCM_FORMAT_U18_3LE)
168#define SNDRV_PCM_FMTBIT_S18_3BE	(1ULL << SNDRV_PCM_FORMAT_S18_3BE)
169#define SNDRV_PCM_FMTBIT_U18_3BE	(1ULL << SNDRV_PCM_FORMAT_U18_3BE)
170
171#ifdef SNDRV_LITTLE_ENDIAN
172#define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_LE
173#define SNDRV_PCM_FMTBIT_U16		SNDRV_PCM_FMTBIT_U16_LE
174#define SNDRV_PCM_FMTBIT_S24		SNDRV_PCM_FMTBIT_S24_LE
175#define SNDRV_PCM_FMTBIT_U24		SNDRV_PCM_FMTBIT_U24_LE
176#define SNDRV_PCM_FMTBIT_S32		SNDRV_PCM_FMTBIT_S32_LE
177#define SNDRV_PCM_FMTBIT_U32		SNDRV_PCM_FMTBIT_U32_LE
178#define SNDRV_PCM_FMTBIT_FLOAT		SNDRV_PCM_FMTBIT_FLOAT_LE
179#define SNDRV_PCM_FMTBIT_FLOAT64	SNDRV_PCM_FMTBIT_FLOAT64_LE
180#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
181#endif
182#ifdef SNDRV_BIG_ENDIAN
183#define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_BE
184#define SNDRV_PCM_FMTBIT_U16		SNDRV_PCM_FMTBIT_U16_BE
185#define SNDRV_PCM_FMTBIT_S24		SNDRV_PCM_FMTBIT_S24_BE
186#define SNDRV_PCM_FMTBIT_U24		SNDRV_PCM_FMTBIT_U24_BE
187#define SNDRV_PCM_FMTBIT_S32		SNDRV_PCM_FMTBIT_S32_BE
188#define SNDRV_PCM_FMTBIT_U32		SNDRV_PCM_FMTBIT_U32_BE
189#define SNDRV_PCM_FMTBIT_FLOAT		SNDRV_PCM_FMTBIT_FLOAT_BE
190#define SNDRV_PCM_FMTBIT_FLOAT64	SNDRV_PCM_FMTBIT_FLOAT64_BE
191#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
192#endif
193
194struct snd_pcm_file {
195	struct snd_pcm_substream *substream;
196	int no_compat_mmap;
197};
198
199struct snd_pcm_hw_rule;
200typedef int (*snd_pcm_hw_rule_func_t)(struct snd_pcm_hw_params *params,
201				      struct snd_pcm_hw_rule *rule);
202
203struct snd_pcm_hw_rule {
204	unsigned int cond;
205	snd_pcm_hw_rule_func_t func;
206	int var;
207	int deps[4];
208	void *private;
209};
210
211struct snd_pcm_hw_constraints {
212	struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
213			 SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
214	struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
215			     SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
216	unsigned int rules_num;
217	unsigned int rules_all;
218	struct snd_pcm_hw_rule *rules;
219};
220
221static inline struct snd_mask *constrs_mask(struct snd_pcm_hw_constraints *constrs,
222					    snd_pcm_hw_param_t var)
223{
224	return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
225}
226
227static inline struct snd_interval *constrs_interval(struct snd_pcm_hw_constraints *constrs,
228						    snd_pcm_hw_param_t var)
229{
230	return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
231}
232
233struct snd_ratnum {
234	unsigned int num;
235	unsigned int den_min, den_max, den_step;
236};
237
238struct snd_ratden {
239	unsigned int num_min, num_max, num_step;
240	unsigned int den;
241};
242
243struct snd_pcm_hw_constraint_ratnums {
244	int nrats;
245	struct snd_ratnum *rats;
246};
247
248struct snd_pcm_hw_constraint_ratdens {
249	int nrats;
250	struct snd_ratden *rats;
251};
252
253struct snd_pcm_hw_constraint_list {
254	unsigned int count;
255	unsigned int *list;
256	unsigned int mask;
257};
258
259struct snd_pcm_runtime {
260	/* -- Status -- */
261	struct snd_pcm_substream *trigger_master;
262	struct timespec trigger_tstamp;	/* trigger timestamp */
263	int overrange;
264	snd_pcm_uframes_t avail_max;
265	snd_pcm_uframes_t hw_ptr_base;	/* Position at buffer restart */
266	snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time*/
267
268	/* -- HW params -- */
269	snd_pcm_access_t access;	/* access mode */
270	snd_pcm_format_t format;	/* SNDRV_PCM_FORMAT_* */
271	snd_pcm_subformat_t subformat;	/* subformat */
272	unsigned int rate;		/* rate in Hz */
273	unsigned int channels;		/* channels */
274	snd_pcm_uframes_t period_size;	/* period size */
275	unsigned int periods;		/* periods */
276	snd_pcm_uframes_t buffer_size;	/* buffer size */
277	unsigned int tick_time;		/* tick time */
278	snd_pcm_uframes_t min_align;	/* Min alignment for the format */
279	size_t byte_align;
280	unsigned int frame_bits;
281	unsigned int sample_bits;
282	unsigned int info;
283	unsigned int rate_num;
284	unsigned int rate_den;
285
286	/* -- SW params -- */
287	int tstamp_mode;		/* mmap timestamp is updated */
288  	unsigned int period_step;
289	unsigned int sleep_min;		/* min ticks to sleep */
290	snd_pcm_uframes_t xfer_align;	/* xfer size need to be a multiple */
291	snd_pcm_uframes_t start_threshold;
292	snd_pcm_uframes_t stop_threshold;
293	snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
294						noise is nearest than this */
295	snd_pcm_uframes_t silence_size;	/* Silence filling size */
296	snd_pcm_uframes_t boundary;	/* pointers wrap point */
297
298	snd_pcm_uframes_t silence_start; /* starting pointer to silence area */
299	snd_pcm_uframes_t silence_filled; /* size filled with silence */
300
301	union snd_pcm_sync_id sync;	/* hardware synchronization ID */
302
303	/* -- mmap -- */
304	volatile struct snd_pcm_mmap_status *status;
305	volatile struct snd_pcm_mmap_control *control;
306
307	/* -- locking / scheduling -- */
308	wait_queue_head_t sleep;
309	struct timer_list tick_timer;
310	struct fasync_struct *fasync;
311
312	/* -- private section -- */
313	void *private_data;
314	void (*private_free)(struct snd_pcm_runtime *runtime);
315
316	/* -- hardware description -- */
317	struct snd_pcm_hardware hw;
318	struct snd_pcm_hw_constraints hw_constraints;
319
320	/* -- interrupt callbacks -- */
321	void (*transfer_ack_begin)(struct snd_pcm_substream *substream);
322	void (*transfer_ack_end)(struct snd_pcm_substream *substream);
323
324	/* -- timer -- */
325	unsigned int timer_resolution;	/* timer resolution */
326
327	/* -- DMA -- */
328	unsigned char *dma_area;	/* DMA area */
329	dma_addr_t dma_addr;		/* physical bus address (not accessible from main CPU) */
330	size_t dma_bytes;		/* size of DMA area */
331
332	struct snd_dma_buffer *dma_buffer_p;	/* allocated buffer */
333
334#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
335	/* -- OSS things -- */
336	struct snd_pcm_oss_runtime oss;
337#endif
338};
339
340struct snd_pcm_group {		/* keep linked substreams */
341	spinlock_t lock;
342	struct list_head substreams;
343	int count;
344};
345
346struct snd_pcm_substream {
347	struct snd_pcm *pcm;
348	struct snd_pcm_str *pstr;
349	void *private_data;		/* copied from pcm->private_data */
350	int number;
351	char name[32];			/* substream name */
352	int stream;			/* stream (direction) */
353	char latency_id[20];		/* latency identifier */
354	size_t buffer_bytes_max;	/* limit ring buffer size */
355	struct snd_dma_buffer dma_buffer;
356	unsigned int dma_buf_id;
357	size_t dma_max;
358	/* -- hardware operations -- */
359	struct snd_pcm_ops *ops;
360	/* -- runtime information -- */
361	struct snd_pcm_runtime *runtime;
362        /* -- timer section -- */
363	struct snd_timer *timer;		/* timer */
364	unsigned timer_running: 1;	/* time is running */
365	spinlock_t timer_lock;
366	/* -- next substream -- */
367	struct snd_pcm_substream *next;
368	/* -- linked substreams -- */
369	struct list_head link_list;	/* linked list member */
370	struct snd_pcm_group self_group;	/* fake group for non linked substream (with substream lock inside) */
371	struct snd_pcm_group *group;		/* pointer to current group */
372	/* -- assigned files -- */
373	void *file;
374	int ref_count;
375	atomic_t mmap_count;
376	unsigned int f_flags;
377	void (*pcm_release)(struct snd_pcm_substream *);
378#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
379	/* -- OSS things -- */
380	struct snd_pcm_oss_substream oss;
381#endif
382#ifdef CONFIG_SND_VERBOSE_PROCFS
383	struct snd_info_entry *proc_root;
384	struct snd_info_entry *proc_info_entry;
385	struct snd_info_entry *proc_hw_params_entry;
386	struct snd_info_entry *proc_sw_params_entry;
387	struct snd_info_entry *proc_status_entry;
388	struct snd_info_entry *proc_prealloc_entry;
389	struct snd_info_entry *proc_prealloc_max_entry;
390#endif
391	/* misc flags */
392	unsigned int hw_opened: 1;
393};
394
395#define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
396
397
398struct snd_pcm_str {
399	int stream;				/* stream (direction) */
400	struct snd_pcm *pcm;
401	/* -- substreams -- */
402	unsigned int substream_count;
403	unsigned int substream_opened;
404	struct snd_pcm_substream *substream;
405#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
406	/* -- OSS things -- */
407	struct snd_pcm_oss_stream oss;
408#endif
409#ifdef CONFIG_SND_VERBOSE_PROCFS
410	struct snd_info_entry *proc_root;
411	struct snd_info_entry *proc_info_entry;
412#ifdef CONFIG_SND_PCM_XRUN_DEBUG
413	unsigned int xrun_debug;	/* 0 = disabled, 1 = verbose, 2 = stacktrace */
414	struct snd_info_entry *proc_xrun_debug_entry;
415#endif
416#endif
417};
418
419struct snd_pcm {
420	struct snd_card *card;
421	struct list_head list;
422	unsigned int device;	/* device number */
423	unsigned int info_flags;
424	unsigned short dev_class;
425	unsigned short dev_subclass;
426	char id[64];
427	char name[80];
428	struct snd_pcm_str streams[2];
429	struct mutex open_mutex;
430	wait_queue_head_t open_wait;
431	void *private_data;
432	void (*private_free) (struct snd_pcm *pcm);
433	struct device *dev; /* actual hw device this belongs to */
434#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
435	struct snd_pcm_oss oss;
436#endif
437};
438
439struct snd_pcm_notify {
440	int (*n_register) (struct snd_pcm * pcm);
441	int (*n_disconnect) (struct snd_pcm * pcm);
442	int (*n_unregister) (struct snd_pcm * pcm);
443	struct list_head list;
444};
445
446/*
447 *  Registering
448 */
449
450extern const struct file_operations snd_pcm_f_ops[2];
451
452int snd_pcm_new(struct snd_card *card, char *id, int device,
453		int playback_count, int capture_count,
454		struct snd_pcm **rpcm);
455int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);
456
457int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree);
458
459/*
460 *  Native I/O
461 */
462
463extern rwlock_t snd_pcm_link_rwlock;
464
465int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info);
466int snd_pcm_info_user(struct snd_pcm_substream *substream,
467		      struct snd_pcm_info __user *info);
468int snd_pcm_status(struct snd_pcm_substream *substream,
469		   struct snd_pcm_status *status);
470int snd_pcm_start(struct snd_pcm_substream *substream);
471int snd_pcm_stop(struct snd_pcm_substream *substream, int status);
472int snd_pcm_drain_done(struct snd_pcm_substream *substream);
473#ifdef CONFIG_PM
474int snd_pcm_suspend(struct snd_pcm_substream *substream);
475int snd_pcm_suspend_all(struct snd_pcm *pcm);
476#endif
477int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
478int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct file *file,
479			   struct snd_pcm_substream **rsubstream);
480void snd_pcm_release_substream(struct snd_pcm_substream *substream);
481int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, struct file *file,
482			     struct snd_pcm_substream **rsubstream);
483void snd_pcm_detach_substream(struct snd_pcm_substream *substream);
484void snd_pcm_vma_notify_data(void *client, void *data);
485int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
486
487#if BITS_PER_LONG >= 64
488
489static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)
490{
491	*rem = *n % div;
492	*n /= div;
493}
494
495#elif defined(i386)
496
497static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)
498{
499	u_int32_t low, high;
500	low = *n & 0xffffffff;
501	high = *n >> 32;
502	if (high) {
503		u_int32_t high1 = high % div;
504		high /= div;
505		asm("divl %2":"=a" (low), "=d" (*rem):"rm" (div), "a" (low), "d" (high1));
506		*n = (u_int64_t)high << 32 | low;
507	} else {
508		*n = low / div;
509		*rem = low % div;
510	}
511}
512#else
513
514static inline void divl(u_int32_t high, u_int32_t low,
515			u_int32_t div,
516			u_int32_t *q, u_int32_t *r)
517{
518	u_int64_t n = (u_int64_t)high << 32 | low;
519	u_int64_t d = (u_int64_t)div << 31;
520	u_int32_t q1 = 0;
521	int c = 32;
522	while (n > 0xffffffffU) {
523		q1 <<= 1;
524		if (n >= d) {
525			n -= d;
526			q1 |= 1;
527		}
528		d >>= 1;
529		c--;
530	}
531	q1 <<= c;
532	if (n) {
533		low = n;
534		*q = q1 | (low / div);
535		*r = low % div;
536	} else {
537		*r = 0;
538		*q = q1;
539	}
540	return;
541}
542
543static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)
544{
545	u_int32_t low, high;
546	low = *n & 0xffffffff;
547	high = *n >> 32;
548	if (high) {
549		u_int32_t high1 = high % div;
550		u_int32_t low1 = low;
551		high /= div;
552		divl(high1, low1, div, &low, rem);
553		*n = (u_int64_t)high << 32 | low;
554	} else {
555		*n = low / div;
556		*rem = low % div;
557	}
558}
559#endif
560
561/*
562 *  PCM library
563 */
564
565static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
566{
567	return substream->group != &substream->self_group;
568}
569
570static inline void snd_pcm_stream_lock(struct snd_pcm_substream *substream)
571{
572	read_lock(&snd_pcm_link_rwlock);
573	spin_lock(&substream->self_group.lock);
574}
575
576static inline void snd_pcm_stream_unlock(struct snd_pcm_substream *substream)
577{
578	spin_unlock(&substream->self_group.lock);
579	read_unlock(&snd_pcm_link_rwlock);
580}
581
582static inline void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream)
583{
584	read_lock_irq(&snd_pcm_link_rwlock);
585	spin_lock(&substream->self_group.lock);
586}
587
588static inline void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream)
589{
590	spin_unlock(&substream->self_group.lock);
591	read_unlock_irq(&snd_pcm_link_rwlock);
592}
593
594#define snd_pcm_stream_lock_irqsave(substream, flags) \
595do { \
596	read_lock_irqsave(&snd_pcm_link_rwlock, (flags)); \
597	spin_lock(&substream->self_group.lock); \
598} while (0)
599
600#define snd_pcm_stream_unlock_irqrestore(substream, flags) \
601do { \
602	spin_unlock(&substream->self_group.lock); \
603	read_unlock_irqrestore(&snd_pcm_link_rwlock, (flags)); \
604} while (0)
605
606#define snd_pcm_group_for_each_entry(s, substream) \
607	list_for_each_entry(s, &substream->group->substreams, link_list)
608
609static inline int snd_pcm_running(struct snd_pcm_substream *substream)
610{
611	return (substream->runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
612		(substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING &&
613		 substream->stream == SNDRV_PCM_STREAM_PLAYBACK));
614}
615
616static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
617{
618	return size * 8 / runtime->sample_bits;
619}
620
621static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
622{
623	return size * 8 / runtime->frame_bits;
624}
625
626static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
627{
628	return size * runtime->sample_bits / 8;
629}
630
631static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
632{
633	return size * runtime->frame_bits / 8;
634}
635
636static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
637{
638	return bytes % runtime->byte_align == 0;
639}
640
641static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
642{
643	struct snd_pcm_runtime *runtime = substream->runtime;
644	return frames_to_bytes(runtime, runtime->buffer_size);
645}
646
647static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
648{
649	struct snd_pcm_runtime *runtime = substream->runtime;
650	return frames_to_bytes(runtime, runtime->period_size);
651}
652
653/*
654 *  result is: 0 ... (boundary - 1)
655 */
656static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
657{
658	snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
659	if (avail < 0)
660		avail += runtime->boundary;
661	else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
662		avail -= runtime->boundary;
663	return avail;
664}
665
666/*
667 *  result is: 0 ... (boundary - 1)
668 */
669static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
670{
671	snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
672	if (avail < 0)
673		avail += runtime->boundary;
674	return avail;
675}
676
677static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
678{
679	return runtime->buffer_size - snd_pcm_playback_avail(runtime);
680}
681
682static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
683{
684	return runtime->buffer_size - snd_pcm_capture_avail(runtime);
685}
686
687/**
688 * snd_pcm_playback_ready - check whether the playback buffer is available
689 * @substream: the pcm substream instance
690 *
691 * Checks whether enough free space is available on the playback buffer.
692 *
693 * Returns non-zero if available, or zero if not.
694 */
695static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)
696{
697	struct snd_pcm_runtime *runtime = substream->runtime;
698	return snd_pcm_playback_avail(runtime) >= runtime->control->avail_min;
699}
700
701/**
702 * snd_pcm_capture_ready - check whether the capture buffer is available
703 * @substream: the pcm substream instance
704 *
705 * Checks whether enough capture data is available on the capture buffer.
706 *
707 * Returns non-zero if available, or zero if not.
708 */
709static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)
710{
711	struct snd_pcm_runtime *runtime = substream->runtime;
712	return snd_pcm_capture_avail(runtime) >= runtime->control->avail_min;
713}
714
715/**
716 * snd_pcm_playback_data - check whether any data exists on the playback buffer
717 * @substream: the pcm substream instance
718 *
719 * Checks whether any data exists on the playback buffer. If stop_threshold
720 * is bigger or equal to boundary, then this function returns always non-zero.
721 *
722 * Returns non-zero if exists, or zero if not.
723 */
724static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
725{
726	struct snd_pcm_runtime *runtime = substream->runtime;
727
728	if (runtime->stop_threshold >= runtime->boundary)
729		return 1;
730	return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
731}
732
733/**
734 * snd_pcm_playback_empty - check whether the playback buffer is empty
735 * @substream: the pcm substream instance
736 *
737 * Checks whether the playback buffer is empty.
738 *
739 * Returns non-zero if empty, or zero if not.
740 */
741static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
742{
743	struct snd_pcm_runtime *runtime = substream->runtime;
744	return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
745}
746
747/**
748 * snd_pcm_capture_empty - check whether the capture buffer is empty
749 * @substream: the pcm substream instance
750 *
751 * Checks whether the capture buffer is empty.
752 *
753 * Returns non-zero if empty, or zero if not.
754 */
755static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)
756{
757	struct snd_pcm_runtime *runtime = substream->runtime;
758	return snd_pcm_capture_avail(runtime) == 0;
759}
760
761static inline void snd_pcm_trigger_done(struct snd_pcm_substream *substream,
762					struct snd_pcm_substream *master)
763{
764	substream->runtime->trigger_master = master;
765}
766
767static inline int hw_is_mask(int var)
768{
769	return var >= SNDRV_PCM_HW_PARAM_FIRST_MASK &&
770		var <= SNDRV_PCM_HW_PARAM_LAST_MASK;
771}
772
773static inline int hw_is_interval(int var)
774{
775	return var >= SNDRV_PCM_HW_PARAM_FIRST_INTERVAL &&
776		var <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL;
777}
778
779static inline struct snd_mask *hw_param_mask(struct snd_pcm_hw_params *params,
780				     snd_pcm_hw_param_t var)
781{
782	return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
783}
784
785static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *params,
786					     snd_pcm_hw_param_t var)
787{
788	return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
789}
790
791static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
792					     snd_pcm_hw_param_t var)
793{
794	return (const struct snd_mask *)hw_param_mask((struct snd_pcm_hw_params*) params, var);
795}
796
797static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
798						     snd_pcm_hw_param_t var)
799{
800	return (const struct snd_interval *)hw_param_interval((struct snd_pcm_hw_params*) params, var);
801}
802
803#define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS))
804#define params_format(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_FORMAT))
805#define params_subformat(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_SUBFORMAT))
806#define params_channels(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_CHANNELS)->min
807#define params_rate(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_RATE)->min
808#define params_period_size(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min
809#define params_period_bytes(p) ((params_period_size(p)*snd_pcm_format_physical_width(params_format(p))*params_channels(p))/8)
810#define params_periods(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_PERIODS)->min
811#define params_buffer_size(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min
812#define params_buffer_bytes(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min
813#define params_tick_time(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_TICK_TIME)->min
814
815
816int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);
817void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c);
818void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c);
819void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b,
820			  unsigned int k, struct snd_interval *c);
821void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
822			  const struct snd_interval *b, struct snd_interval *c);
823int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask);
824int snd_interval_ratnum(struct snd_interval *i,
825			unsigned int rats_count, struct snd_ratnum *rats,
826			unsigned int *nump, unsigned int *denp);
827
828void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params);
829void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var);
830int snd_pcm_hw_params_choose(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
831
832int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
833
834int snd_pcm_hw_constraints_init(struct snd_pcm_substream *substream);
835int snd_pcm_hw_constraints_complete(struct snd_pcm_substream *substream);
836
837int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
838			       u_int32_t mask);
839int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
840				 u_int64_t mask);
841int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
842				 unsigned int min, unsigned int max);
843int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var);
844int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
845			       unsigned int cond,
846			       snd_pcm_hw_param_t var,
847			       struct snd_pcm_hw_constraint_list *l);
848int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
849				  unsigned int cond,
850				  snd_pcm_hw_param_t var,
851				  struct snd_pcm_hw_constraint_ratnums *r);
852int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
853				  unsigned int cond,
854				  snd_pcm_hw_param_t var,
855				  struct snd_pcm_hw_constraint_ratdens *r);
856int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
857				 unsigned int cond,
858				 unsigned int width,
859				 unsigned int msbits);
860int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
861			       unsigned int cond,
862			       snd_pcm_hw_param_t var,
863			       unsigned long step);
864int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
865			       unsigned int cond,
866			       snd_pcm_hw_param_t var);
867int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,
868			unsigned int cond,
869			int var,
870			snd_pcm_hw_rule_func_t func, void *private,
871			int dep, ...);
872
873int snd_pcm_format_signed(snd_pcm_format_t format);
874int snd_pcm_format_unsigned(snd_pcm_format_t format);
875int snd_pcm_format_linear(snd_pcm_format_t format);
876int snd_pcm_format_little_endian(snd_pcm_format_t format);
877int snd_pcm_format_big_endian(snd_pcm_format_t format);
878#ifdef SNDRV_LITTLE_ENDIAN
879#define snd_pcm_format_cpu_endian(format) snd_pcm_format_little_endian(format)
880#else
881#define snd_pcm_format_cpu_endian(format) snd_pcm_format_big_endian(format)
882#endif
883int snd_pcm_format_width(snd_pcm_format_t format);			/* in bits */
884int snd_pcm_format_physical_width(snd_pcm_format_t format);		/* in bits */
885ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);
886const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);
887int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames);
888snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_endian);
889
890void snd_pcm_set_ops(struct snd_pcm * pcm, int direction, struct snd_pcm_ops *ops);
891void snd_pcm_set_sync(struct snd_pcm_substream *substream);
892int snd_pcm_lib_interleave_len(struct snd_pcm_substream *substream);
893int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
894		      unsigned int cmd, void *arg);
895int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream);
896int snd_pcm_playback_xrun_check(struct snd_pcm_substream *substream);
897int snd_pcm_capture_xrun_check(struct snd_pcm_substream *substream);
898int snd_pcm_playback_xrun_asap(struct snd_pcm_substream *substream);
899int snd_pcm_capture_xrun_asap(struct snd_pcm_substream *substream);
900void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr);
901void snd_pcm_tick_prepare(struct snd_pcm_substream *substream);
902void snd_pcm_tick_set(struct snd_pcm_substream *substream, unsigned long ticks);
903void snd_pcm_tick_elapsed(struct snd_pcm_substream *substream);
904void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
905snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream,
906				    const void __user *buf,
907				    snd_pcm_uframes_t frames);
908snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream,
909				   void __user *buf, snd_pcm_uframes_t frames);
910snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream,
911				     void __user **bufs, snd_pcm_uframes_t frames);
912snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream,
913				    void __user **bufs, snd_pcm_uframes_t frames);
914
915int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime);
916
917static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
918					      struct snd_dma_buffer *bufp)
919{
920	struct snd_pcm_runtime *runtime = substream->runtime;
921	if (bufp) {
922		runtime->dma_buffer_p = bufp;
923		runtime->dma_area = bufp->area;
924		runtime->dma_addr = bufp->addr;
925		runtime->dma_bytes = bufp->bytes;
926	} else {
927		runtime->dma_buffer_p = NULL;
928		runtime->dma_area = NULL;
929		runtime->dma_addr = 0;
930		runtime->dma_bytes = 0;
931	}
932}
933
934/*
935 *  Timer interface
936 */
937
938void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream);
939void snd_pcm_timer_init(struct snd_pcm_substream *substream);
940void snd_pcm_timer_done(struct snd_pcm_substream *substream);
941
942/*
943 *  Memory
944 */
945
946int snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream);
947int snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm);
948int snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
949				  int type, struct device *data,
950				  size_t size, size_t max);
951int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
952					  int type, void *data,
953					  size_t size, size_t max);
954int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
955int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
956
957#define snd_pcm_substream_sgbuf(substream) ((substream)->runtime->dma_buffer_p->private_data)
958#define snd_pcm_sgbuf_pages(size) snd_sgbuf_aligned_pages(size)
959#define snd_pcm_sgbuf_get_addr(sgbuf,ofs) snd_sgbuf_get_addr(sgbuf,ofs)
960struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigned long offset);
961
962/* handle mmap counter - PCM mmap callback should handle this counter properly */
963static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
964{
965	struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
966	atomic_inc(&substream->mmap_count);
967}
968
969static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)
970{
971	struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
972	atomic_dec(&substream->mmap_count);
973}
974
975/* mmap for io-memory area */
976#if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)
977#define SNDRV_PCM_INFO_MMAP_IOMEM	SNDRV_PCM_INFO_MMAP
978int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area);
979#else
980#define SNDRV_PCM_INFO_MMAP_IOMEM	0
981#define snd_pcm_lib_mmap_iomem	NULL
982#endif
983
984static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
985{
986	*max = dma < 4 ? 64 * 1024 : 128 * 1024;
987}
988
989/*
990 *  Misc
991 */
992
993#define SNDRV_PCM_DEFAULT_CON_SPDIF	(IEC958_AES0_CON_EMPHASIS_NONE|\
994					 (IEC958_AES1_CON_ORIGINAL<<8)|\
995					 (IEC958_AES1_CON_PCM_CODER<<8)|\
996					 (IEC958_AES3_CON_FS_48000<<24))
997
998#endif /* __SOUND_PCM_H */
999