audio_impl.h revision 10632:704f6d4f41c9
1169695Skan/*
2169695Skan * CDDL HEADER START
3169695Skan *
4169695Skan * The contents of this file are subject to the terms of the
5169695Skan * Common Development and Distribution License (the "License").
6169695Skan * You may not use this file except in compliance with the License.
7169695Skan *
8169695Skan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9169695Skan * or http://www.opensolaris.org/os/licensing.
10169695Skan * See the License for the specific language governing permissions
11169695Skan * and limitations under the License.
12169695Skan *
13169695Skan * When distributing Covered Code, include this CDDL HEADER in each
14169695Skan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15169695Skan * If applicable, add the following below this CDDL HEADER, with the
16169695Skan * fields enclosed by brackets "[]" replaced with your own identifying
17169695Skan * information: Portions Copyright [yyyy] [name of copyright owner]
18169695Skan *
19169695Skan * CDDL HEADER END
20169695Skan */
21169695Skan/*
22169695Skan * Copyright (C) 4Front Technologies 1996-2008.
23169695Skan *
24169695Skan * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25169695Skan * Use is subject to license terms.
26169695Skan */
27169695Skan
28169695Skan#ifndef	_AUDIO_IMPL_H
29169695Skan#define	_AUDIO_IMPL_H
30169695Skan
31169695Skan#include <sys/types.h>
32169695Skan#include <sys/list.h>
33169695Skan#include <sys/poll.h>
34169695Skan
35169695Skan#include <sys/audio/audio_driver.h>
36169695Skan#include "audio_client.h"
37169695Skan
38169695Skan#define	AUDIO_MAX_OPENS		256
39169695Skan#define	AUDIO_MAX_CHANNELS	16
40169695Skan#define	AUDIO_UNIT_EXPAND	1024
41169695Skan#define	AUDIO_CHBUFS		2048	/* samples for mixing */
42169695Skan#define	AUDIO_VOL_SCALE		256
43169695Skan#define	AUDIO_DB_SIZE		50
44169695Skan
45169695Skanstruct audio_parms {
46169695Skan	int		p_format;
47169695Skan	int		p_rate;
48169695Skan	int		p_nchan;
49169695Skan};
50169695Skan
51169695Skantypedef int (*audio_cnv_func_t)(audio_stream_t *, int);
52169695Skan
53169695Skanstruct audio_buffer {
54169695Skan	caddr_t			b_data;
55169695Skan	uint64_t		b_head;
56169695Skan	uint64_t		b_tail;
57169695Skan	unsigned		b_hidx;		/* head % nframes */
58169695Skan	unsigned		b_tidx;		/* tail % nframes */
59169695Skan	unsigned		b_fragfr;	/* frames per frag */
60169695Skan	unsigned		b_fragbytes;	/* bytes per frag */
61169695Skan	unsigned		b_nframes;	/* total frames */
62169695Skan	unsigned		b_nbytes;	/* total bytes */
63169695Skan	unsigned		b_nfrags;	/* total frags */
64169695Skan	unsigned		b_framesz;	/* bytes per frame  */
65169695Skan};
66169695Skan
67169695Skan/*
68169695Skan * struct audio_stream: This structure represents a virtual stream exposed
69169695Skan * to a single client.  Each client will have at most two of these (one for
70169695Skan * record, one for playback.)
71169695Skan */
72169695Skanstruct audio_stream {
73169695Skan	audio_buffer_t		s_buf;
74169695Skan#define	s_data			s_buf.b_data
75169695Skan#define	s_bufsz			s_buf.b_size
76169695Skan#define	s_head			s_buf.b_head
77169695Skan#define	s_tail			s_buf.b_tail
78169695Skan#define	s_nfrags		s_buf.b_nfrags
79169695Skan#define	s_framesz		s_buf.b_framesz
80169695Skan#define	s_fragfr		s_buf.b_fragfr
81169695Skan#define	s_fragbytes		s_buf.b_fragbytes
82169695Skan#define	s_nframes		s_buf.b_nframes
83169695Skan#define	s_nbytes		s_buf.b_nbytes
84169695Skan#define	s_tidx			s_buf.b_tidx
85169695Skan#define	s_hidx			s_buf.b_hidx
86169695Skan	ddi_umem_cookie_t	s_cookie;
87169695Skan	uint32_t		s_allocsz;
88169695Skan	uint32_t		s_hintsz;	/* latency hints */
89169695Skan	uint16_t		s_hintfrags;
90169695Skan
91169695Skan	/*
92169695Skan	 * Various counters.
93169695Skan	 */
94169695Skan	uint64_t		s_samples;
95169695Skan	uint64_t		s_errors;	/* underrun or overrun count */
96169695Skan
97169695Skan	boolean_t		s_running;
98169695Skan	boolean_t		s_paused;	/* stream paused */
99169695Skan	boolean_t		s_draining;	/* stream draining */
100169695Skan
101169695Skan	/*
102169695Skan	 * Sample rate conversion (SRC) and format conversion details.
103169695Skan	 */
104169695Skan	struct grc3state	*s_src_state[AUDIO_MAX_CHANNELS];
105169695Skan	unsigned		s_src_quality;
106169695Skan	int			s_cnv_max;
107169695Skan	audio_cnv_func_t	s_converter;
108169695Skan	uint32_t		*s_cnv_buf0;
109169695Skan	uint32_t		*s_cnv_buf1;
110169695Skan	void			*s_cnv_src;
111169695Skan	void			*s_cnv_dst;
112169695Skan	audio_parms_t		s_cnv_src_parms;
113169695Skan#define	s_cnv_src_nchan		s_cnv_src_parms.p_nchan
114169695Skan#define	s_cnv_src_rate		s_cnv_src_parms.p_rate
115169695Skan#define	s_cnv_src_format	s_cnv_src_parms.p_format
116169695Skan
117169695Skan	audio_parms_t		s_cnv_dst_parms;
118169695Skan#define	s_cnv_dst_nchan		s_cnv_dst_parms.p_nchan
119169695Skan#define	s_cnv_dst_rate		s_cnv_dst_parms.p_rate
120169695Skan#define	s_cnv_dst_format	s_cnv_dst_parms.p_format
121169695Skan
122169695Skan	size_t			s_cnv_cnt;
123169695Skan	int32_t			*s_cnv_ptr;
124169695Skan
125169695Skan	audio_parms_t		*s_user_parms;
126169695Skan	audio_parms_t		*s_phys_parms;
127169695Skan
128169695Skan	/*
129169695Skan	 * Volume.
130169695Skan	 */
131169695Skan	uint8_t			s_gain_master;
132169695Skan	uint8_t			s_gain_pct;
133169695Skan	uint16_t		s_gain_scaled;
134169695Skan	uint16_t		s_gain_eff;
135169695Skan	boolean_t		s_muted;
136169695Skan
137169695Skan	/*
138169695Skan	 * Callbacks.
139169695Skan	 */
140169695Skan	uint64_t		s_drain_idx;	/* engine index */
141169695Skan
142169695Skan	/*
143169695Skan	 * Other per stream details, e.g. channel offset, etc.
144169695Skan	 */
145169695Skan	kmutex_t		s_lock;
146169695Skan	kcondvar_t		s_cv;
147169695Skan	list_node_t		s_eng_linkage;	/*  place on engine list */
148169695Skan	audio_client_t		*s_client;
149169695Skan	audio_engine_t		*s_engine;
150169695Skan	int			s_choffs;
151169695Skan
152169695Skan	/*
153169695Skan	 * Other bits.
154169695Skan	 */
155169695Skan	unsigned		s_engcap;	/* ENGINE_xxx_CAP */
156169695Skan};
157169695Skan
158169695Skan/*
159169695Skan * struct audio_client: This structure represents a logical port,
160169695Skan * associated with an open file, etc.  These are the entities that are
161169695Skan * mixed.
162169695Skan */
163169695Skanstruct audio_client {
164169695Skan	audio_stream_t		c_istream;
165169695Skan	audio_stream_t		c_ostream;
166169695Skan	void			*c_private;
167169695Skan
168169695Skan	/*
169169695Skan	 * DDI support.
170169695Skan	 */
171169695Skan	major_t			c_major;
172169695Skan	minor_t			c_minor;
173169695Skan	minor_t			c_origminor;
174169695Skan	queue_t			*c_rq;
175169695Skan	queue_t			*c_wq;
176169695Skan
177169695Skan	/*
178169695Skan	 * Linkage for per-device list of clients.
179169695Skan	 */
180169695Skan	list_node_t		c_global_linkage;
181169695Skan	list_node_t		c_dev_linkage;
182169695Skan	int			c_refcnt;
183169695Skan
184169695Skan	kmutex_t		c_lock;
185169695Skan	kcondvar_t		c_cv;
186169695Skan	boolean_t		c_is_active;
187169695Skan
188169695Skan	/*
189169695Skan	 * Client wide settings... e.g. ops vector, etc.
190169695Skan	 */
191169695Skan	unsigned		c_omode;	/* open mode */
192169695Skan	pid_t			c_pid;		/* opening process id */
193169695Skan	audio_dev_t		*c_dev;
194169695Skan	cred_t			*c_cred;
195169695Skan	audio_client_ops_t	c_ops;
196169695Skan#define	c_open			c_ops.aco_open
197169695Skan#define	c_close			c_ops.aco_close
198169695Skan#define	c_read			c_ops.aco_read
199169695Skan#define	c_write			c_ops.aco_write
200169695Skan#define	c_ioctl			c_ops.aco_ioctl
201169695Skan#define	c_chpoll		c_ops.aco_chpoll
202169695Skan#define	c_output		c_ops.aco_output
203169695Skan#define	c_input			c_ops.aco_input
204169695Skan#define	c_notify		c_ops.aco_notify
205169695Skan#define	c_drain			c_ops.aco_drain
206169695Skan#define	c_wput			c_ops.aco_wput
207169695Skan#define	c_wsrv			c_ops.aco_wsrv
208169695Skan#define	c_rsrv			c_ops.aco_rsrv
209169695Skan
210169695Skan	struct pollhead		c_pollhead;
211169695Skan
212169695Skan};
213169695Skan
214169695Skanstruct audio_infostr {
215169695Skan	char			i_line[100];
216169695Skan	list_node_t		i_linkage;
217169695Skan};
218169695Skan
219169695Skanstruct audio_stats {
220169695Skan	kstat_named_t		st_head;
221169695Skan	kstat_named_t		st_tail;
222169695Skan	kstat_named_t		st_flags;
223169695Skan	kstat_named_t		st_fragfr;
224169695Skan	kstat_named_t		st_nfrags;
225169695Skan	kstat_named_t		st_framesz;
226169695Skan	kstat_named_t		st_nbytes;
227169695Skan	kstat_named_t		st_hidx;
228169695Skan	kstat_named_t		st_tidx;
229169695Skan	kstat_named_t		st_format;
230169695Skan	kstat_named_t		st_nchan;
231169695Skan	kstat_named_t		st_rate;
232169695Skan	kstat_named_t		st_intrs;
233169695Skan	kstat_named_t		st_errors;
234169695Skan	kstat_named_t		st_engine_underruns;
235169695Skan	kstat_named_t		st_engine_overruns;
236169695Skan	kstat_named_t		st_stream_underruns;
237169695Skan	kstat_named_t		st_stream_overruns;
238169695Skan	kstat_named_t		st_suspended;
239169695Skan};
240169695Skan
241169695Skan/*
242169695Skan * An audio engine corresponds to a single DMA transfer channel.  It can
243169695Skan * represent either record or playback, but not both at the same time.
244169695Skan * A device that supports simultaneous record and playback will register
245169695Skan * separate channels.
246169695Skan */
247169695Skanstruct audio_engine {
248169695Skan	audio_engine_ops_t	e_ops;
249169695Skan	void			*e_private;
250169695Skan	unsigned		e_flags;
251169695Skan
252169695Skan	/*
253169695Skan	 * Mixing related fields.
254169695Skan	 */
255169695Skan	unsigned		e_limiter_state;
256169695Skan	int32_t			*e_chbufs[AUDIO_MAX_CHANNELS];
257169695Skan	unsigned		e_choffs[AUDIO_MAX_CHANNELS];
258169695Skan	unsigned		e_chincr[AUDIO_MAX_CHANNELS];
259169695Skan	void			(*e_export)(audio_engine_t *);
260169695Skan	void			(*e_import)(audio_engine_t *, audio_stream_t *);
261169695Skan
262169695Skan	/*
263169695Skan	 * Underlying physical buffer shared with device driver.
264169695Skan	 */
265169695Skan	audio_buffer_t		e_buf;
266169695Skan#define	e_head			e_buf.b_head
267169695Skan#define	e_tail			e_buf.b_tail
268169695Skan#define	e_data			e_buf.b_data
269169695Skan#define	e_fragfr		e_buf.b_fragfr
270169695Skan#define	e_fragbytes		e_buf.b_fragbytes
271169695Skan#define	e_framesz		e_buf.b_framesz
272169695Skan#define	e_nbytes		e_buf.b_nbytes
273169695Skan#define	e_nframes		e_buf.b_nframes
274169695Skan#define	e_nfrags		e_buf.b_nfrags
275169695Skan#define	e_hidx			e_buf.b_hidx
276169695Skan#define	e_tidx			e_buf.b_tidx
277169695Skan
278169695Skan	int			e_intrs;
279169695Skan	int			e_errors;
280169695Skan	int			e_overruns;
281169695Skan	int			e_underruns;
282169695Skan	int			e_stream_overruns;
283169695Skan	int			e_stream_underruns;
284169695Skan
285169695Skan	audio_parms_t		e_parms;
286169695Skan#define	e_format		e_parms.p_format
287169695Skan#define	e_nchan			e_parms.p_nchan
288169695Skan#define	e_rate			e_parms.p_rate
289169695Skan
290169695Skan	/*
291169695Skan	 * Statistics.
292169695Skan	 */
293169695Skan	kstat_t			*e_ksp;
294169695Skan	struct audio_stats	e_stats;
295169695Skan
296169695Skan
297169695Skan	/*
298169695Skan	 * Synchronization.
299169695Skan	 */
300169695Skan	kmutex_t		e_lock;
301169695Skan
302169695Skan	/*
303169695Skan	 * Linkage for per-device list.
304169695Skan	 */
305169695Skan	list_node_t		e_dev_linkage;
306169695Skan	audio_dev_t		*e_dev;
307169695Skan	int			e_num;	/* arbitrary engine number */
308169695Skan
309169695Skan	/*
310169695Skan	 * List of of streams attached to this engine.
311169695Skan	 */
312169695Skan	list_t			e_streams;
313169695Skan	int			e_nrunning;
314169695Skan	boolean_t		e_suspended;
315169695Skan};
316169695Skan
317169695Skanstruct audio_dev {
318169695Skan	dev_info_t		*d_dip;
319169695Skan	major_t			d_major;
320169695Skan	int			d_instance;
321169695Skan
322169695Skan	uint32_t		d_flags;
323169695Skan#define	DEV_OUTPUT_CAP		(1U << 0)
324169695Skan#define	DEV_INPUT_CAP		(1U << 1)
325169695Skan#define	DEV_DUPLEX_CAP		(1U << 2)
326169695Skan#define	DEV_SNDSTAT_CAP		(1U << 3)
327169695Skan#define	DEV_OPAQUE_CAP		(1U << 4)	/* AC3 are not mixable */
328169695Skan
329169695Skan	char			d_name[128];	/* generic description */
330169695Skan	char			d_desc[128];	/* detailed config descr */
331169695Skan	char			d_vers[128];	/* detailed version descr */
332169695Skan	int			d_number;	/* global /dev/audioXX # */
333169695Skan	int			d_index;	/* master device index */
334169695Skan	int			d_engno;	/* engine counter */
335169695Skan
336169695Skan	list_t			d_hwinfo;	/* strings of hw info */
337169695Skan
338169695Skan	/*
339169695Skan	 * Synchronization.
340169695Skan	 */
341169695Skan	kmutex_t		d_lock;
342169695Skan	kcondvar_t		d_cv;
343169695Skan	krwlock_t		d_ctrl_lock;	/* leaf lock */
344169695Skan	krwlock_t		d_clnt_lock;
345169695Skan	unsigned		d_refcnt;
346169695Skan
347169695Skan	/*
348169695Skan	 * Lists of virtual clients, controls and engines.  Protected by
349169695Skan	 * the d_lock field above.
350169695Skan	 */
351169695Skan	list_t			d_clients;
352169695Skan	list_t			d_engines;
353169695Skan	list_t			d_controls;
354169695Skan	audio_ctrl_t		*d_pcmvol_ctrl;
355169695Skan	uint64_t		d_pcmvol;
356169695Skan
357169695Skan	volatile unsigned	d_serial;
358169695Skan
359169695Skan	/*
360169695Skan	 * Linkage onto global list of devices.
361169695Skan	 */
362169695Skan	list_node_t		d_by_index;
363169695Skan	list_node_t		d_by_number;
364169695Skan
365169695Skan	/*
366169695Skan	 * Personality specific data.
367169695Skan	 */
368169695Skan	void			*d_minor_data[1 << AUDIO_MN_TYPE_NBITS];
369169695Skan};
370169695Skan
371169695Skan/*
372169695Skan * Each audio_dev optionally can have controls attached to it.
373169695Skan * Controls are separate from audio engines. They are methods of
374169695Skan * adjusting pharameters or reading metrics that usually relate to
375169695Skan * hardware on devices engine by the driver. They can be things like
376169695Skan * master volume for example.
377169695Skan *
378169695Skan * If the driver does not support controls then it must insure
379169695Skan * that any hardware controls are initialized to a usable state.
380169695Skan *
381169695Skan * For the framework/user-apps to be able to change controls
382169695Skan * the driver must create, enable and configure controls with
383169695Skan * control API's.
384169695Skan *
385169695Skan * There are a number of common controls (well-known) that most
386169695Skan * hardware supports. These have known names and known ctrl numbers.
387169695Skan * In addition a driver can have any number of extention
388169695Skan * controls (device-private). These can have any name and any ctrl
389169695Skan * number other then the ones, defined as well-knonw ones.
390169695Skan *
391169695Skan * Only controls created through control API's will be available,
392169695Skan * well-known or device-private.
393169695Skan */
394169695Skanstruct	audio_ctrl {
395169695Skan	audio_ctrl_desc_t	ctrl_des;
396169695Skan#define	ctrl_name		ctrl_des.acd_name
397169695Skan#define	ctrl_type		ctrl_des.acd_type
398169695Skan#define	ctrl_enum		ctrl_des.acd_enum
399169695Skan#define	ctrl_flags		ctrl_des.acd_flags
400169695Skan	audio_dev_t		*ctrl_dev;
401169695Skan	audio_ctrl_rd_t		ctrl_read_fn;
402169695Skan	audio_ctrl_wr_t		ctrl_write_fn;
403169695Skan	list_node_t		ctrl_linkage;
404169695Skan	kmutex_t		ctrl_lock;
405169695Skan	void			*ctrl_arg;
406169695Skan};
407169695Skan
408169695Skan
409169695Skan/*
410169695Skan * Prototypes.
411169695Skan */
412169695Skan
413169695Skan/* audio_format.c */
414169695Skanint auimpl_format_alloc(audio_stream_t *);
415169695Skanvoid auimpl_format_free(audio_stream_t *);
416169695Skanint auimpl_format_setup(audio_stream_t *, audio_parms_t *);
417169695Skan
418169695Skan/* audio_output.c */
419169695Skanvoid auimpl_export_16ne(audio_engine_t *);
420169695Skanvoid auimpl_export_16oe(audio_engine_t *);
421169695Skanvoid auimpl_export_24ne(audio_engine_t *);
422169695Skanvoid auimpl_export_24oe(audio_engine_t *);
423169695Skanvoid auimpl_export_32ne(audio_engine_t *);
424169695Skanvoid auimpl_export_32oe(audio_engine_t *);
425169695Skanvoid auimpl_output_callback(audio_engine_t *);
426169695Skan
427169695Skan/* audio_input.c */
428169695Skanvoid auimpl_import_16ne(audio_engine_t *, audio_stream_t *);
429169695Skanvoid auimpl_import_16oe(audio_engine_t *, audio_stream_t *);
430169695Skanvoid auimpl_import_24ne(audio_engine_t *, audio_stream_t *);
431169695Skanvoid auimpl_import_24oe(audio_engine_t *, audio_stream_t *);
432169695Skanvoid auimpl_import_32ne(audio_engine_t *, audio_stream_t *);
433169695Skanvoid auimpl_import_32oe(audio_engine_t *, audio_stream_t *);
434169695Skanvoid auimpl_input_callback(audio_engine_t *);
435169695Skanint auimpl_input_drain(audio_stream_t *);
436169695Skan
437169695Skan/* audio_client.c */
438169695Skanvoid auimpl_client_init(void);
439169695Skanvoid auimpl_client_fini(void);
440169695Skanaudio_client_t *auimpl_client_create(dev_t);
441169695Skanvoid auimpl_client_destroy(audio_client_t *);
442169695Skanvoid auimpl_client_activate(audio_client_t *);
443169695Skanvoid auimpl_client_deactivate(audio_client_t *);
444169695Skanint auimpl_create_minors(audio_dev_t *);
445169695Skanvoid auimpl_remove_minors(audio_dev_t *);
446169695Skanint auimpl_set_pcmvol(void *, uint64_t);
447169695Skanint auimpl_get_pcmvol(void *, uint64_t *);
448169695Skan
449169695Skan/* audio_engine.c */
450169695Skanvoid auimpl_dev_init(void);
451169695Skanvoid auimpl_dev_fini(void);
452169695Skanvoid auimpl_dev_hold(audio_dev_t *);
453169695Skanaudio_dev_t *auimpl_dev_hold_by_devt(dev_t);
454169695Skanaudio_dev_t *auimpl_dev_hold_by_index(int);
455169695Skanvoid auimpl_dev_release(audio_dev_t *);
456169695Skanint auimpl_choose_format(int);
457169695Skan
458169695Skanint auimpl_engine_open(audio_dev_t *, int, int, audio_stream_t *);
459169695Skanvoid auimpl_engine_close(audio_stream_t *);
460169695Skan
461169695Skanvoid auimpl_dev_walk_engines(audio_dev_t *,
462169695Skan    int (*)(audio_engine_t *, void *), void *);
463169695Skan
464169695Skanvoid auimpl_dev_vwarn(audio_dev_t *, const char *, va_list);
465169695Skan
466169695Skan/* engine operations */
467169695Skan#define	E_OP(e, entry)		((e)->e_ops.audio_engine_##entry)
468169695Skan#define	E_PRV(e)		((e)->e_private)
469169695Skan#define	ENG_FORMAT(e)		E_OP(e, format)(E_PRV(e))
470169695Skan#define	ENG_RATE(e)		E_OP(e, rate)(E_PRV(e))
471169695Skan#define	ENG_CHANNELS(e)		E_OP(e, channels)(E_PRV(e))
472169695Skan#define	ENG_SYNC(e, num)	E_OP(e, sync)(E_PRV(e), num)
473169695Skan#define	ENG_START(e)		E_OP(e, start)(E_PRV(e))
474169695Skan#define	ENG_STOP(e)		E_OP(e, stop)(E_PRV(e))
475169695Skan#define	ENG_COUNT(e)		E_OP(e, count)(E_PRV(e))
476169695Skan#define	ENG_QLEN(e)		E_OP(e, qlen)(E_PRV(e))
477169695Skan#define	ENG_CLOSE(e)		E_OP(e, close)(E_PRV(e))
478169695Skan#define	ENG_OPEN(e, s, nf, d) 	E_OP(e, open)(E_PRV(e), e->e_flags, s, nf, d)
479169695Skan#define	ENG_CHINFO(e, c, o, i)	E_OP(e, chinfo(E_PRV(e), c, o, i))
480169695Skan
481169695Skan/* audio_sun.c */
482169695Skanvoid auimpl_sun_init(void);
483169695Skan
484169695Skan/* audio_oss.c */
485169695Skanvoid auimpl_oss_init(void);
486169695Skan
487169695Skan#endif	/* _AUDIO_IMPL_H */
488169695Skan