diff options
author | cg <cg@FreeBSD.org> | 2000-12-18 01:36:41 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2000-12-18 01:36:41 +0000 |
commit | 2fae4aec24ea4529882b3ec4cda45661ccd48ea8 (patch) | |
tree | e7e32573ed48df98bed54daa386c3520e959e951 /sys/dev/sound/pci/solo.c | |
parent | 1fd2c926a884cc824e7da7ee1a51dad72b1dec5b (diff) | |
download | FreeBSD-src-2fae4aec24ea4529882b3ec4cda45661ccd48ea8.zip FreeBSD-src-2fae4aec24ea4529882b3ec4cda45661ccd48ea8.tar.gz |
kobjify.
this gives us several benefits, including:
* easier extensibility- new optional methods can be added to
ac97/mixer/channel classes without having to fixup every driver.
* forward compatibility for drivers, provided no new mandatory methods are
added.
Diffstat (limited to 'sys/dev/sound/pci/solo.c')
-rw-r--r-- | sys/dev/sound/pci/solo.c | 85 |
1 files changed, 34 insertions, 51 deletions
diff --git a/sys/dev/sound/pci/solo.c b/sys/dev/sound/pci/solo.c index 672c7a0..7cb10f3 100644 --- a/sys/dev/sound/pci/solo.c +++ b/sys/dev/sound/pci/solo.c @@ -33,6 +33,8 @@ #include <dev/sound/isa/sb.h> #include <dev/sound/chip.h> +#include "mixer_if.h" + #define ESS_BUFFSIZE (16384) #define ABS(x) (((x) < 0)? -(x) : (x)) @@ -42,15 +44,6 @@ /* more accurate clocks and split audio1/audio2 rates */ #define ESS18XX_NEWSPEED -/* channel interface for ESS */ -static void *esschan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir); -static int esschan_setformat(void *data, u_int32_t format); -static int esschan_setspeed(void *data, u_int32_t speed); -static int esschan_setblocksize(void *data, u_int32_t blocksize); -static int esschan_trigger(void *data, int go); -static int esschan_getptr(void *data); -static pcmchan_caps *esschan_getcaps(void *data); - static u_int32_t ess_playfmt[] = { AFMT_U8, AFMT_STEREO | AFMT_U8, @@ -80,25 +73,6 @@ static u_int32_t ess_recfmt[] = { }; static pcmchan_caps ess_reccaps = {5000, 49000, ess_recfmt, 0}; -static pcm_channel ess_chantemplate = { - esschan_init, - NULL, /* setdir */ - esschan_setformat, - esschan_setspeed, - esschan_setblocksize, - esschan_trigger, - esschan_getptr, - esschan_getcaps, - NULL, /* free */ - NULL, /* nop1 */ - NULL, /* nop2 */ - NULL, /* nop3 */ - NULL, /* nop4 */ - NULL, /* nop5 */ - NULL, /* nop6 */ - NULL, /* nop7 */ -}; - struct ess_info; struct ess_chinfo { @@ -141,19 +115,6 @@ static int ess_dmasetup(struct ess_info *sc, int ch, u_int32_t base, u_int16_t c static int ess_dmapos(struct ess_info *sc, int ch); static int ess_dmatrigger(struct ess_info *sc, int ch, int go); -static int essmix_init(snd_mixer *m); -static int essmix_set(snd_mixer *m, unsigned dev, unsigned left, unsigned right); -static int essmix_setrecsrc(snd_mixer *m, u_int32_t src); - -static snd_mixer ess_mixer = { - "ESS mixer", - essmix_init, - NULL, - NULL, - essmix_set, - essmix_setrecsrc, -}; - static devclass_t pcm_devclass; /* @@ -546,9 +507,10 @@ ess_stop(struct ess_chinfo *ch) return 0; } +/* -------------------------------------------------------------------- */ /* channel interface for ESS18xx */ static void * -esschan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) +esschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) { struct ess_info *sc = devinfo; struct ess_chinfo *ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch; @@ -568,7 +530,7 @@ esschan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) } static int -esschan_setformat(void *data, u_int32_t format) +esschan_setformat(kobj_t obj, void *data, u_int32_t format) { struct ess_chinfo *ch = data; @@ -577,7 +539,7 @@ esschan_setformat(void *data, u_int32_t format) } static int -esschan_setspeed(void *data, u_int32_t speed) +esschan_setspeed(kobj_t obj, void *data, u_int32_t speed) { struct ess_chinfo *ch = data; struct ess_info *sc = ch->parent; @@ -591,13 +553,13 @@ esschan_setspeed(void *data, u_int32_t speed) } static int -esschan_setblocksize(void *data, u_int32_t blocksize) +esschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { return blocksize; } static int -esschan_trigger(void *data, int go) +esschan_trigger(kobj_t obj, void *data, int go) { struct ess_chinfo *ch = data; struct ess_info *sc = ch->parent; @@ -623,7 +585,7 @@ esschan_trigger(void *data, int go) } static int -esschan_getptr(void *data) +esschan_getptr(kobj_t obj, void *data) { struct ess_chinfo *ch = data; struct ess_info *sc = ch->parent; @@ -632,13 +594,25 @@ esschan_getptr(void *data) } static pcmchan_caps * -esschan_getcaps(void *data) +esschan_getcaps(kobj_t obj, void *data) { struct ess_chinfo *ch = data; return (ch->dir == PCMDIR_PLAY)? &ess_playcaps : &ess_reccaps; } +static kobj_method_t esschan_methods[] = { + KOBJMETHOD(channel_init, esschan_init), + KOBJMETHOD(channel_setformat, esschan_setformat), + KOBJMETHOD(channel_setspeed, esschan_setspeed), + KOBJMETHOD(channel_setblocksize, esschan_setblocksize), + KOBJMETHOD(channel_trigger, esschan_trigger), + KOBJMETHOD(channel_getptr, esschan_getptr), + KOBJMETHOD(channel_getcaps, esschan_getcaps), + { 0, 0 } +}; +CHANNEL_DECLARE(esschan); + /************************************************************/ static int @@ -749,6 +723,14 @@ essmix_setrecsrc(snd_mixer *m, u_int32_t src) return src; } +static kobj_method_t solomixer_methods[] = { + KOBJMETHOD(mixer_init, essmix_init), + KOBJMETHOD(mixer_set, essmix_set), + KOBJMETHOD(mixer_setrecsrc, essmix_setrecsrc), + { 0, 0 } +}; +MIXER_DECLARE(solomixer); + /************************************************************/ static int @@ -942,7 +924,8 @@ ess_attach(device_t dev) if (ess_reset_dsp(sc)) goto no; - mixer_init(dev, &ess_mixer, sc); + if (mixer_init(dev, &solomixer_class, sc)) + goto no; port_wr(sc->io, 0x7, 0xb0, 1); /* enable irqs */ #ifdef ESS18XX_DUPLEX @@ -980,8 +963,8 @@ ess_attach(device_t dev) if (pcm_register(dev, sc, 1, 1)) goto no; - pcm_addchan(dev, PCMDIR_REC, &ess_chantemplate, sc); - pcm_addchan(dev, PCMDIR_PLAY, &ess_chantemplate, sc); + pcm_addchan(dev, PCMDIR_REC, &esschan_class, sc); + pcm_addchan(dev, PCMDIR_PLAY, &esschan_class, sc); pcm_setstatus(dev, status); return 0; |