/*
 * This file is part of the UCB release of Plan 9. It is subject to the license
 * terms in the LICENSE file found in the top-level directory of this
 * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
 * part of the UCB release of Plan 9, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms contained
 * in the LICENSE file.
 */

enum {
	master_chan		= 0x00,
	Speed_control		= 0x00,
	/* Items below are  defined by USB standard: */
	Mute_control		= 0x01,
	Volume_control		= 0x02,
	Bass_control		= 0x03,
	Mid_control		= 0x04,
	Treble_control		= 0x05,
	Equalizer_control	= 0x06,
	Agc_control		= 0x07,
	Delay_control		= 0x08,
	Bassboost_control	= 0x09,
	Loudness_control	= 0x0a,
	/* Items below are defined by implementation: */
	Channel_control		= 0x0b,
	Resolution_control	= 0x0c,
	Ncontrol,
	Selector_control	= 0x0d,

	sampling_freq_control	= 0x01,

	Audiocsp = 0x000101, /* audio.control.0 */

	AUDIO_INTERFACE = 0x24,
	AUDIO_ENDPOINT = 0x25,
};


#define AS_GENERAL 1
#define FORMAT_TYPE 2
#define FORMAT_SPECIFIC 3

#define PCM 1
#define PCM8 2
#define IEEE_FLOAT 3
#define ALAW 4
#define MULAW 5

#define SAMPLING_FREQ_CONTROL 0x01

typedef struct Audioalt Audioalt;

struct Audioalt {
	int		nchan;
	int		res;
	int		subframesize;
	int		minfreq, maxfreq;	/* continuous freqs */
	int		freqs[8];		/* discrete freqs */
	int		caps;		/* see below for meanings */
};

enum {
	/* Audioalt->caps bits */
	has_setspeed = 0x1,		/* has a speed_set command */
	has_pitchset = 0x2,		/* has a pitch_set command */
	has_contfreq = 0x4,		/* frequency continuously variable */
	has_discfreq = 0x8,		/* discrete set of frequencies */
	onefreq = 0x10,		/* only one frequency */
	maxpkt_only = 0x80,	/* packets must be padded to max size */
};

typedef uint8_t byte;

extern int setrec;
extern int verbose;
extern int defaultspeed[2];
extern Dev *ad;
extern Dev *buttondev;
extern Channel *controlchan;
extern Dev *epdev[2];

void	audio_interface(Dev *d, Desc *dd);
void	setalt(Dev *d, int endpt, int value);
int	getalt(Dev *d, int endpt);
int	setspeed(int rec, int speed);
int	setcontrol(int rec, char *name, int32_t *value);
int	getspecialcontrol(int rec, int ctl, int req, int32_t *value);
int	getcontrol(int rec, char *name, int32_t *value);
int	findalt(int rec, int nchan, int res, int speed);
void	getcontrols(void);
void	serve(void *);
int	nbchanprint(Channel *c, char *fmt, ...);
int	Aconv(Fmt *fp);
