summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/i386/pci/auglx.c10
-rw-r--r--sys/dev/audio.c18
-rw-r--r--sys/dev/isa/ess.c15
-rw-r--r--sys/dev/pci/auacer.c6
-rw-r--r--sys/dev/pci/auich.c39
-rw-r--r--sys/dev/pci/auixp.c12
-rw-r--r--sys/dev/pci/autri.c16
-rw-r--r--sys/dev/pci/auvia.c24
-rw-r--r--sys/dev/pci/azalia.c212
-rw-r--r--sys/dev/pci/cmpci.c16
-rw-r--r--sys/dev/pci/cs4280.c46
-rw-r--r--sys/dev/pci/cs4281.c20
-rw-r--r--sys/dev/pci/eap.c15
-rw-r--r--sys/dev/pci/emuxki.c21
-rw-r--r--sys/dev/pci/envy.c4
-rw-r--r--sys/dev/pci/esa.c15
-rw-r--r--sys/dev/pci/eso.c15
-rw-r--r--sys/dev/pci/maestro.c7
-rw-r--r--sys/dev/pci/neo.c4
-rw-r--r--sys/dev/pci/sv.c12
-rw-r--r--sys/dev/pci/yds.c14
21 files changed, 330 insertions, 211 deletions
diff --git a/sys/arch/i386/pci/auglx.c b/sys/arch/i386/pci/auglx.c
index c42bcec981d..c72587da196 100644
--- a/sys/arch/i386/pci/auglx.c
+++ b/sys/arch/i386/pci/auglx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auglx.c,v 1.2 2008/07/09 02:47:03 brad Exp $ */
+/* $OpenBSD: auglx.c,v 1.3 2008/10/25 22:30:43 jakemsr Exp $ */
/*
* Copyright (c) 2008 Marc Balmer <mbalmer@openbsd.org>
@@ -575,6 +575,10 @@ auglx_set_params(void *v, int setmode, int usemode, struct audio_params *play,
if (setmode & AUMODE_PLAY) {
play->factor = 1;
play->sw_code = NULL;
+ if (play->precision > 16)
+ play->precision = 16;
+ if (play->channels > 2)
+ play->channels = 2;
switch(play->encoding) {
case AUDIO_ENCODING_ULAW:
switch (play->channels) {
@@ -766,6 +770,10 @@ auglx_set_params(void *v, int setmode, int usemode, struct audio_params *play,
if (setmode & AUMODE_RECORD) {
rec->factor = 1;
rec->sw_code = 0;
+ if (rec->precision > 16)
+ rec->precision = 16;
+ if (rec->channels > 2)
+ rec->channels = 2;
switch(rec->encoding) {
case AUDIO_ENCODING_ULAW:
switch (rec->channels) {
diff --git a/sys/dev/audio.c b/sys/dev/audio.c
index 00dec2c10d2..819da85fca4 100644
--- a/sys/dev/audio.c
+++ b/sys/dev/audio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: audio.c,v 1.98 2008/09/29 02:27:38 jakemsr Exp $ */
+/* $OpenBSD: audio.c,v 1.99 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: audio.c,v 1.119 1999/11/09 16:50:47 augustss Exp $ */
/*
@@ -2257,6 +2257,12 @@ audio_rint(void *v)
int
audio_check_params(struct audio_params *p)
{
+ if (p->channels < 1 || p->channels > 12)
+ return (EINVAL);
+
+ if (p->precision < 8 || p->precision > 32)
+ return (EINVAL);
+
if (p->encoding == AUDIO_ENCODING_PCM16) {
if (p->precision == 8)
p->encoding = AUDIO_ENCODING_ULINEAR;
@@ -2287,15 +2293,13 @@ audio_check_params(struct audio_params *p)
case AUDIO_ENCODING_ALAW:
case AUDIO_ENCODING_ADPCM:
if (p->precision != 8)
- return (EINVAL);
+ p->precision = 8;
break;
case AUDIO_ENCODING_SLINEAR_LE:
case AUDIO_ENCODING_SLINEAR_BE:
case AUDIO_ENCODING_ULINEAR_LE:
case AUDIO_ENCODING_ULINEAR_BE:
- if (p->precision != 8 && p->precision != 16 &&
- p->precision != 32)
- return (EINVAL);
+ p->precision = (p->precision + 7) & ~7;
break;
case AUDIO_ENCODING_MPEG_L1_STREAM:
case AUDIO_ENCODING_MPEG_L1_PACKETS:
@@ -2308,10 +2312,6 @@ audio_check_params(struct audio_params *p)
return (EINVAL);
}
- /* sanity check # of channels */
- if (p->channels < 1 || p->channels > 12)
- return (EINVAL);
-
return (0);
}
diff --git a/sys/dev/isa/ess.c b/sys/dev/isa/ess.c
index a2941cf06bd..99c330ee742 100644
--- a/sys/dev/isa/ess.c
+++ b/sys/dev/isa/ess.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ess.c,v 1.13 2008/04/21 00:32:42 jakemsr Exp $ */
+/* $OpenBSD: ess.c,v 1.14 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: ess.c,v 1.44.4.1 1999/06/21 01:18:00 thorpej Exp $ */
/*
@@ -1229,11 +1229,14 @@ ess_set_params(addr, setmode, usemode, play, rec)
p = mode == AUMODE_PLAY ? play : rec;
- if (p->sample_rate < ESS_MINRATE ||
- p->sample_rate > ESS_MAXRATE ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2))
- return (EINVAL);
+ if (p->sample_rate < ESS_MINRATE)
+ p->sample_rate = ESS_MINRATE;
+ if (p->sample_rate > ESS_MAXRATE)
+ p->sample_rate = ESS_MAXRATE;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;
diff --git a/sys/dev/pci/auacer.c b/sys/dev/pci/auacer.c
index 24e68e3740c..55e6601ee23 100644
--- a/sys/dev/pci/auacer.c
+++ b/sys/dev/pci/auacer.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auacer.c,v 1.3 2008/10/21 05:36:46 fkr Exp $ */
+/* $OpenBSD: auacer.c,v 1.4 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: auacer.c,v 1.3 2004/11/10 04:20:26 kent Exp $ */
/*-
@@ -578,8 +578,8 @@ auacer_set_params(void *v, int setmode, int usemode, struct audio_params *play,
p->sw_code = NULL;
if (mode == AUMODE_RECORD) {
- if (p->channels < 1 || p->channels > 2)
- return EINVAL;
+ if (p->channels > 2)
+ p->channels = 2;
}
switch (p->encoding) {
diff --git a/sys/dev/pci/auich.c b/sys/dev/pci/auich.c
index 97147001f97..e2b7e1b739c 100644
--- a/sys/dev/pci/auich.c
+++ b/sys/dev/pci/auich.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auich.c,v 1.76 2008/10/23 21:50:01 jakemsr Exp $ */
+/* $OpenBSD: auich.c,v 1.77 2008/10/25 22:30:43 jakemsr Exp $ */
/*
* Copyright (c) 2000,2001 Michael Shalayeff
@@ -748,16 +748,21 @@ auich_set_params(v, setmode, usemode, play, rec)
if (setmode & AUMODE_PLAY) {
/* only 16-bit 48kHz slinear_le if s/pdif enabled */
- if (sc->sc_spdif &&
- ((play->sample_rate != 48000) || (play->precision != 16) ||
- (play->encoding != AUDIO_ENCODING_SLINEAR_LE)))
- return (EINVAL);
+ if (sc->sc_spdif) {
+ play->sample_rate = 48000;
+ play->precision = 16;
+ play->encoding = AUDIO_ENCODING_SLINEAR_LE;
+ }
}
if (setmode & AUMODE_PLAY) {
play->factor = 1;
play->sw_code = NULL;
+ if (play->precision > 16)
+ play->precision = 16;
switch(play->encoding) {
case AUDIO_ENCODING_ULAW:
+ if (play->channels > 2)
+ play->channels = 2;
switch (play->channels) {
case 1:
play->factor = 4;
@@ -774,6 +779,8 @@ auich_set_params(v, setmode, usemode, play, rec)
case AUDIO_ENCODING_SLINEAR_LE:
switch (play->precision) {
case 8:
+ if (play->channels > 2)
+ play->channels = 2;
switch (play->channels) {
case 1:
play->factor = 4;
@@ -788,6 +795,10 @@ auich_set_params(v, setmode, usemode, play, rec)
}
break;
case 16:
+ if (play->channels > 6)
+ play->channels = 6;
+ if (play->channels > 1)
+ play->channels &= ~1;
switch (play->channels) {
case 1:
play->factor = 2;
@@ -798,23 +809,23 @@ auich_set_params(v, setmode, usemode, play, rec)
case 4:
ext_id = codec->vtbl->get_caps(codec);
if (!(ext_id & AC97_EXT_AUDIO_SDAC))
- return (EINVAL);
+ play->channels = 2;
break;
case 6:
ext_id = codec->vtbl->get_caps(codec);
if ((ext_id & AC97_BITS_6CH) !=
AC97_BITS_6CH)
- return (EINVAL);
+ play->channels = 2;
break;
default:
return (EINVAL);
}
break;
- default:
- return (EINVAL);
}
break;
case AUDIO_ENCODING_ULINEAR_LE:
+ if (play->channels > 2)
+ play->channels = 2;
switch (play->precision) {
case 8:
switch (play->channels) {
@@ -848,6 +859,8 @@ auich_set_params(v, setmode, usemode, play, rec)
}
break;
case AUDIO_ENCODING_ALAW:
+ if (play->channels > 2)
+ play->channels = 2;
switch (play->channels) {
case 1:
play->factor = 4;
@@ -862,6 +875,8 @@ auich_set_params(v, setmode, usemode, play, rec)
}
break;
case AUDIO_ENCODING_SLINEAR_BE:
+ if (play->channels > 2)
+ play->channels = 2;
switch (play->precision) {
case 8:
switch (play->channels) {
@@ -895,6 +910,8 @@ auich_set_params(v, setmode, usemode, play, rec)
}
break;
case AUDIO_ENCODING_ULINEAR_BE:
+ if (play->channels > 2)
+ play->channels = 2;
switch (play->precision) {
case 8:
switch (play->channels) {
@@ -968,6 +985,10 @@ auich_set_params(v, setmode, usemode, play, rec)
if (setmode & AUMODE_RECORD) {
rec->factor = 1;
rec->sw_code = 0;
+ if (rec->channels > 2)
+ rec->channels = 2;
+ if (rec->precision > 16)
+ rec->precision = 16;
switch(rec->encoding) {
case AUDIO_ENCODING_ULAW:
switch (rec->channels) {
diff --git a/sys/dev/pci/auixp.c b/sys/dev/pci/auixp.c
index 9304863aca2..5fda4e24b1f 100644
--- a/sys/dev/pci/auixp.c
+++ b/sys/dev/pci/auixp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auixp.c,v 1.21 2008/09/24 19:09:05 chl Exp $ */
+/* $OpenBSD: auixp.c,v 1.22 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: auixp.c,v 1.9 2005/06/27 21:13:09 thorpej Exp $ */
/*
@@ -377,6 +377,10 @@ auixp_set_params(void *hdl, int setmode, int usemode,
if (setmode & AUMODE_PLAY) {
play->factor = 1;
play->sw_code = NULL;
+ if (play->channels > 2)
+ play->channels = 2;
+ if (play->precision > 16)
+ play->precision = 16;
switch(play->encoding) {
case AUDIO_ENCODING_ULAW:
switch (play->channels) {
@@ -561,9 +565,13 @@ auixp_set_params(void *hdl, int setmode, int usemode,
}
- if (setmode & AUMODE_RECORD) {
+ if (setmode & AUMODE_RECORD) {
rec->factor = 1;
rec->sw_code = 0;
+ if (rec->channels > 2)
+ rec->channels = 2;
+ if (rec->precision > 16)
+ rec->precision = 16;
switch(rec->encoding) {
case AUDIO_ENCODING_ULAW:
rec->sw_code = ulinear8_to_mulaw;
diff --git a/sys/dev/pci/autri.c b/sys/dev/pci/autri.c
index e5b8fceff18..8ef9d3fb6ce 100644
--- a/sys/dev/pci/autri.c
+++ b/sys/dev/pci/autri.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autri.c,v 1.21 2008/04/21 00:32:42 jakemsr Exp $ */
+/* $OpenBSD: autri.c,v 1.22 2008/10/25 22:30:43 jakemsr Exp $ */
/*
* Copyright (c) 2001 SOMEYA Yoshihiko and KUROSAWA Takahiro.
@@ -1012,12 +1012,14 @@ autri_set_params(addr, setmode, usemode, play, rec)
continue;
p = mode == AUMODE_PLAY ? play : rec;
-
- if (p->sample_rate < 4000 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2))
- return (EINVAL);
-
+ if (p->sample_rate < 4000)
+ p->sample_rate = 4000;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;
switch (p->encoding) {
diff --git a/sys/dev/pci/auvia.c b/sys/dev/pci/auvia.c
index 9a6eab62cc7..0a785295abd 100644
--- a/sys/dev/pci/auvia.c
+++ b/sys/dev/pci/auvia.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auvia.c,v 1.43 2008/10/23 21:50:01 jakemsr Exp $ */
+/* $OpenBSD: auvia.c,v 1.44 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: auvia.c,v 1.28 2002/11/04 16:38:49 kent Exp $ */
/*-
@@ -648,16 +648,26 @@ auvia_set_params(void *addr, int setmode, int usemode,
&& (ext_id & AC97_BITS_6CH) == AC97_BITS_6CH) {
/* ok */
} else {
- return (EINVAL);
+ p->channels = 2;
}
} else {
- if (p->channels != 1 && p->channels != 2)
- return (EINVAL);
+ if (p->channels > 2)
+ p->channels = 2;
}
- if ((p->sample_rate < 4000 || p->sample_rate > 48000) ||
- (p->precision != 8 && p->precision != 16))
- return (EINVAL);
+ if (p->sample_rate < 4000)
+ p->sample_rate = 4000;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
+ if (p->precision > 16)
+ p->precision = 16;
+
+ /* XXX only 16-bit 48kHz slinear_le if s/pdif enabled ? */
+ if (sc->sc_spdif) {
+ p->sample_rate = 48000;
+ p->precision = 16;
+ p->encoding = AUDIO_ENCODING_SLINEAR_LE;
+ }
/* XXX only 16-bit 48kHz slinear_le if s/pdif enabled ? */
if (sc->sc_spdif &&
diff --git a/sys/dev/pci/azalia.c b/sys/dev/pci/azalia.c
index 02c8677e734..d4a52b4c4dd 100644
--- a/sys/dev/pci/azalia.c
+++ b/sys/dev/pci/azalia.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: azalia.c,v 1.61 2008/10/23 02:06:53 jakemsr Exp $ */
+/* $OpenBSD: azalia.c,v 1.62 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: azalia.c,v 1.20 2006/05/07 08:31:44 kent Exp $ */
/*-
@@ -277,6 +277,10 @@ int azalia_params2fmt(const audio_params_t *, uint16_t *);
int azalia_create_encodings(struct audio_format *, int,
struct audio_encoding_set **);
+int azalia_match_format(codec_t *, audio_params_t *);
+int azalia_set_params_sub(codec_t *, int, audio_params_t *);
+
+
/* variables */
struct cfattach azalia_ca = {
sizeof(azalia_t), azalia_pci_match, azalia_pci_attach,
@@ -2209,99 +2213,151 @@ azalia_get_default_params(void *addr, int mode, struct audio_params *params)
}
int
-azalia_set_params(void *v, int smode, int umode, audio_params_t *p,
- audio_params_t *r)
+azalia_match_format(codec_t *codec, audio_params_t *par)
{
- azalia_t *az;
- codec_t *codec;
- void (*pswcode)(void *, u_char *, int) = NULL;
- void (*rswcode)(void *, u_char *, int) = NULL;
+ int i;
+
+ for (i = 0; i < codec->nformats; i++) {
+ if (par->encoding != codec->formats[i].encoding)
+ continue;
+ if (par->precision != codec->formats[i].precision)
+ continue;
+ if (par->channels != codec->formats[i].channels)
+ continue;
+ break;
+ }
+
+ return (i);
+}
+
+int
+azalia_set_params_sub(codec_t *codec, int mode, audio_params_t *par)
+{
+ void (*swcode)(void *, u_char *, int) = NULL;
+ char *cmode;
int i, j;
+ uint ochan, oenc, opre;
- az = v;
- codec = &az->codecs[az->codecno];
- if (smode & AUMODE_RECORD && r != NULL) {
- for (i = 0; i < codec->nformats; i++) {
- if (r->encoding != codec->formats[i].encoding)
- continue;
- if (r->precision != codec->formats[i].precision)
- continue;
- if (r->channels != codec->formats[i].channels)
- continue;
- break;
- }
- /* find a 2 channel format and emulate mono */
- if (i == codec->nformats && r->channels == 1) {
- r->factor = 2;
- rswcode = linear16_decimator;
- for (i = 0; i < codec->nformats; i++) {
- if (r->encoding != codec->formats[i].encoding)
- continue;
- if (r->precision != codec->formats[i].precision)
- continue;
- if (codec->formats[i].channels != 2)
- continue;
- break;
- }
- }
+ if (mode == AUMODE_PLAY)
+ cmode = "play";
+ else
+ cmode = "record";
- if (i == codec->nformats) {
- DPRINTF(("%s: can't find record format %u/%u/%u\n",
- __func__, r->encoding, r->precision, r->channels));
- return (EINVAL);
- }
- for (j = 0; j < codec->formats[i].frequency_type; j++) {
- if (r->sample_rate != codec->formats[i].frequency[j])
- continue;
- break;
- }
- if (j == codec->formats[i].frequency_type) {
- DPRINTF(("%s: can't find record rate %u\n",
- __func__, r->sample_rate));
- return (EINVAL);
+ ochan = par->channels;
+ oenc = par->encoding;
+ opre = par->precision;
+
+ i = azalia_match_format(codec, par);
+ if (i == codec->nformats && par->channels == 1) {
+ /* find a 2 channel format and emulate mono */
+ par->channels = 2;
+ i = azalia_match_format(codec, par);
+ if (i != codec->nformats) {
+ par->factor = 2;
+ if (mode == AUMODE_RECORD)
+ swcode = linear16_decimator;
+ else
+ swcode = noswap_bytes_mts;
+ par->channels = 1;
}
- r->sw_code = rswcode;
}
- if (smode & AUMODE_PLAY && p != NULL) {
- for (i = 0; i < codec->nformats; i++) {
- if (p->encoding != codec->formats[i].encoding)
- continue;
- if (p->precision != codec->formats[i].precision)
- continue;
- if (p->channels != codec->formats[i].channels)
- continue;
- break;
- }
+ par->channels = ochan;
+ if (i == codec->nformats && (par->precision != 16 || par->encoding !=
+ AUDIO_ENCODING_SLINEAR_LE)) {
+ /* try with default encoding/precision */
+ par->encoding = AUDIO_ENCODING_SLINEAR_LE;
+ par->precision = 16;
+ i = azalia_match_format(codec, par);
+ }
+ if (i == codec->nformats && par->channels == 1) {
/* find a 2 channel format and emulate mono */
- if (i == codec->nformats && p->channels == 1) {
- p->factor = 2;
- pswcode = noswap_bytes_mts;
- for (i = 0; i < codec->nformats; i++) {
- if (p->encoding != codec->formats[i].encoding)
- continue;
- if (p->precision != codec->formats[i].precision)
- continue;
- if (codec->formats[i].channels != 2)
- continue;
- break;
- }
+ par->channels = 2;
+ i = azalia_match_format(codec, par);
+ if (i != codec->nformats) {
+ par->factor = 2;
+ if (mode == AUMODE_RECORD)
+ swcode = linear16_decimator;
+ else
+ swcode = noswap_bytes_mts;
+ par->channels = 1;
}
+ }
+ par->channels = ochan;
+ if (i == codec->nformats && par->channels != 2) {
+ /* try with default channels */
+ par->encoding = oenc;
+ par->precision = opre;
+ par->channels = 2;
+ i = azalia_match_format(codec, par);
+ }
+ /* try with default everything */
+ if (i == codec->nformats) {
+ par->encoding = AUDIO_ENCODING_SLINEAR_LE;
+ par->precision = 16;
+ par->channels = 2;
+ i = azalia_match_format(codec, par);
if (i == codec->nformats) {
- DPRINTF(("%s: can't find playback format %u/%u/%u\n",
- __func__, p->encoding, p->precision, p->channels));
- return (EINVAL);
+ DPRINTF(("%s: can't find %s format %u/%u/%u\n",
+ __func__, cmode, par->encoding,
+ par->precision, par->channels));
+ return EINVAL;
}
+ }
+ if (codec->formats[i].frequency_type == 0) {
+ DPRINTF(("%s: matched %s format %d has 0 frequencies\n",
+ __func__, cmode, i));
+ return EINVAL;
+ }
+
+ for (j = 0; j < codec->formats[i].frequency_type; j++) {
+ if (par->sample_rate != codec->formats[i].frequency[j])
+ continue;
+ break;
+ }
+ if (j == codec->formats[i].frequency_type) {
+ /* try again with default */
+ par->sample_rate = 48000;
for (j = 0; j < codec->formats[i].frequency_type; j++) {
- if (p->sample_rate != codec->formats[i].frequency[j])
+ if (par->sample_rate != codec->formats[i].frequency[j])
continue;
break;
}
if (j == codec->formats[i].frequency_type) {
- DPRINTF(("%s: can't find playback rate %u\n",
- __func__, p->sample_rate));
- return (EINVAL);
+ DPRINTF(("%s: can't find %s rate %u\n",
+ __func__, cmode, par->sample_rate));
+ return EINVAL;
}
- p->sw_code = pswcode;
+ }
+ par->sw_code = swcode;
+
+ return (0);
+}
+
+int
+azalia_set_params(void *v, int smode, int umode, audio_params_t *p,
+ audio_params_t *r)
+{
+ azalia_t *az;
+ codec_t *codec;
+ int ret;
+
+ az = v;
+ codec = &az->codecs[az->codecno];
+ if (codec->nformats == 0) {
+ DPRINTF(("%s: codec has no formats\n", __func__));
+ return EINVAL;
+ }
+
+ if (smode & AUMODE_RECORD && r != NULL) {
+ ret = azalia_set_params_sub(codec, AUMODE_RECORD, r);
+ if (ret)
+ return (ret);
+ }
+
+ if (smode & AUMODE_PLAY && p != NULL) {
+ ret = azalia_set_params_sub(codec, AUMODE_PLAY, p);
+ if (ret)
+ return (ret);
}
return (0);
diff --git a/sys/dev/pci/cmpci.c b/sys/dev/pci/cmpci.c
index 753fb0569f8..a2604de5f97 100644
--- a/sys/dev/pci/cmpci.c
+++ b/sys/dev/pci/cmpci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmpci.c,v 1.20 2008/05/29 07:20:15 jakemsr Exp $ */
+/* $OpenBSD: cmpci.c,v 1.21 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: cmpci.c,v 1.25 2004/10/26 06:32:20 xtraeme Exp $ */
/*
@@ -676,7 +676,7 @@ cmpci_set_params(void *handle, int setmode, int usemode,
if (setmode & AUMODE_RECORD) {
if (p->channels > 2)
- return (EINVAL);
+ p->channels = 2;
sc->sc_play_channel = 0;
cmpci_reg_clear_reg_misc(sc, CMPCI_REG_ENDBDAC);
cmpci_reg_clear_reg_misc(sc, CMPCI_REG_XCHGDAC);
@@ -703,6 +703,8 @@ cmpci_set_params(void *handle, int setmode, int usemode,
CMPCI_REG_CHB3D8C);
/* format */
+ if (p->precision > 16)
+ p->precision = 16;
p->sw_code = NULL;
switch (p->channels) {
case 1:
@@ -723,7 +725,7 @@ cmpci_set_params(void *handle, int setmode, int usemode,
CMPCI_REG_LEGACY_CTRL,
CMPCI_REG_NXCHG);
} else
- return (EINVAL);
+ p->channels = 2;
}
md_format = CMPCI_REG_FORMAT_STEREO;
break;
@@ -744,7 +746,7 @@ cmpci_set_params(void *handle, int setmode, int usemode,
CMPCI_REG_LEGACY_CTRL,
CMPCI_REG_NXCHG);
} else
- return (EINVAL);
+ p->channels = 2;
}
md_format = CMPCI_REG_FORMAT_STEREO;
break;
@@ -768,7 +770,7 @@ cmpci_set_params(void *handle, int setmode, int usemode,
CMPCI_REG_LEGACY_CTRL,
CMPCI_REG_NXCHG);
} else
- return (EINVAL);
+ p->channels = 2;
}
md_format = CMPCI_REG_FORMAT_STEREO;
break;
@@ -777,8 +779,6 @@ cmpci_set_params(void *handle, int setmode, int usemode,
}
switch (p->encoding) {
case AUDIO_ENCODING_ULAW:
- if (p->precision != 8)
- return (EINVAL);
if (mode & AUMODE_PLAY) {
p->factor = 2;
p->sw_code = mulaw_to_slinear16_le;
@@ -789,8 +789,6 @@ cmpci_set_params(void *handle, int setmode, int usemode,
}
break;
case AUDIO_ENCODING_ALAW:
- if (p->precision != 8)
- return (EINVAL);
if (mode & AUMODE_PLAY) {
p->factor = 2;
p->sw_code = alaw_to_slinear16_le;
diff --git a/sys/dev/pci/cs4280.c b/sys/dev/pci/cs4280.c
index 29d9ce9d995..a17ccf3d66a 100644
--- a/sys/dev/pci/cs4280.c
+++ b/sys/dev/pci/cs4280.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cs4280.c,v 1.31 2008/05/29 02:10:01 jakemsr Exp $ */
+/* $OpenBSD: cs4280.c,v 1.32 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: cs4280.c,v 1.5 2000/06/26 04:56:23 simonb Exp $ */
/*
@@ -1117,37 +1117,33 @@ cs4280_set_params(addr, setmode, usemode, play, rec)
if ((setmode & mode) == 0)
continue;
- p = mode == AUMODE_PLAY ? play : rec;
-
+ p = mode == AUMODE_PLAY ? play : rec;
if (p == play) {
DPRINTFN(5,("play: sample=%ld precision=%d channels=%d\n",
p->sample_rate, p->precision, p->channels));
- /* play back data format may be 8- or 16-bit and
- * either stereo or mono.
- * playback rate may range from 8000Hz to 48000Hz
- */
- if (p->sample_rate < 8000 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2) ) {
- return (EINVAL);
- }
} else {
DPRINTFN(5,("rec: sample=%ld precision=%d channels=%d\n",
p->sample_rate, p->precision, p->channels));
- /* capture data format must be 16bit stereo
- * and sample rate range from 11025Hz to 48000Hz.
- *
- * XXX: it looks like to work with 8000Hz,
- * although data sheets say lower limit is
- * 11025 Hz.
- */
-
- if (p->sample_rate < 8000 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2) ) {
- return (EINVAL);
- }
}
+ /* play back data format may be 8- or 16-bit and
+ * either stereo or mono.
+ * playback rate may range from 8000Hz to 48000Hz
+ *
+ * capture data format must be 16bit stereo
+ * and sample rate range from 11025Hz to 48000Hz.
+ *
+ * XXX: it looks like to work with 8000Hz,
+ * although data sheets say lower limit is
+ * 11025 Hz.
+ */
+ if (p->sample_rate < 8000)
+ p->sample_rate = 8000;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;
diff --git a/sys/dev/pci/cs4281.c b/sys/dev/pci/cs4281.c
index 690c4e096ff..3f2f658ccee 100644
--- a/sys/dev/pci/cs4281.c
+++ b/sys/dev/pci/cs4281.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cs4281.c,v 1.21 2008/04/21 00:32:43 jakemsr Exp $ */
+/* $OpenBSD: cs4281.c,v 1.22 2008/10/25 22:30:43 jakemsr Exp $ */
/* $Tera: cs4281.c,v 1.18 2000/12/27 14:24:45 tacha Exp $ */
/*
@@ -517,20 +517,18 @@ cs4281_set_params(addr, setmode, usemode, play, rec)
if (p == play) {
DPRINTFN(5,("play: samp=%ld precision=%d channels=%d\n",
p->sample_rate, p->precision, p->channels));
- if (p->sample_rate < 6023 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2)) {
- return (EINVAL);
- }
} else {
DPRINTFN(5,("rec: samp=%ld precision=%d channels=%d\n",
p->sample_rate, p->precision, p->channels));
- if (p->sample_rate < 6023 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2)) {
- return (EINVAL);
- }
}
+ if (p->sample_rate < 6023)
+ p->sample_rate = 6023;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;
diff --git a/sys/dev/pci/eap.c b/sys/dev/pci/eap.c
index 9461fc12dd7..5de9a1d109c 100644
--- a/sys/dev/pci/eap.c
+++ b/sys/dev/pci/eap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eap.c,v 1.34 2008/06/26 05:42:17 ray Exp $ */
+/* $OpenBSD: eap.c,v 1.35 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: eap.c,v 1.46 2001/09/03 15:07:37 reinoud Exp $ */
/*
@@ -944,11 +944,14 @@ eap_set_params(void *addr, int setmode, int usemode,
p = mode == AUMODE_PLAY ? play : rec;
- if (p->sample_rate < 4000 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2))
- return (EINVAL);
-
+ if (p->sample_rate < 4000)
+ p->sample_rate = 4000;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;
switch (p->encoding) {
diff --git a/sys/dev/pci/emuxki.c b/sys/dev/pci/emuxki.c
index 5d0a0274342..0fce95915e5 100644
--- a/sys/dev/pci/emuxki.c
+++ b/sys/dev/pci/emuxki.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: emuxki.c,v 1.29 2008/06/26 05:42:17 ray Exp $ */
+/* $OpenBSD: emuxki.c,v 1.30 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: emuxki.c,v 1.1 2001/10/17 18:39:41 jdolecek Exp $ */
/*-
@@ -1573,16 +1573,20 @@ int
emuxki_voice_set_srate(struct emuxki_voice *voice, u_int32_t srate)
{
if (voice->use & EMU_VOICE_USE_PLAY) {
- if ((srate < 4000) || (srate > 48000))
- return (EINVAL);
+ if (srate < 4000)
+ srate = 4000;
+ if (srate > 48000)
+ srate = 48000;
voice->sample_rate = srate;
emuxki_channel_set_srate(voice->dataloc.chan[0], srate);
if (voice->stereo)
emuxki_channel_set_srate(voice->dataloc.chan[1],
srate);
} else {
- if ((srate < 8000) || (srate > 48000))
- return (EINVAL);
+ if (srate < 8000)
+ srate = 8000;
+ if (srate > 48000)
+ srate = 48000;
voice->sample_rate = srate;
if (emuxki_voice_adc_rate(voice) < 0) {
voice->sample_rate = 0;
@@ -2117,8 +2121,11 @@ emuxki_set_vparms(struct emuxki_voice *voice, struct audio_params *p)
AUMODE_PLAY : AUMODE_RECORD;
p->factor = 1;
p->sw_code = NULL;
- if (p->channels != 1 && p->channels != 2)
- return (EINVAL);/* Will change when streams come in use */
+ if (p->channels > 2)
+ p->channels = 2;
+ if (p->precision > 16)
+ p->precision = 16;
+ /* Will change when streams come in use */
/*
* Always use slinear_le for recording, as how to set otherwise
diff --git a/sys/dev/pci/envy.c b/sys/dev/pci/envy.c
index 0693dd91cba..47ce102268c 100644
--- a/sys/dev/pci/envy.c
+++ b/sys/dev/pci/envy.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: envy.c,v 1.9 2008/04/30 17:31:26 ratchov Exp $ */
+/* $OpenBSD: envy.c,v 1.10 2008/10/25 22:30:43 jakemsr Exp $ */
/*
* Copyright (c) 2007 Alexandre Ratchov <alex@caoua.org>
*
@@ -688,7 +688,7 @@ envy_set_params(void *self, int setmode, int usemode,
if (setmode == (AUMODE_PLAY | AUMODE_RECORD) &&
p->sample_rate != r->sample_rate) {
DPRINTF("%s: play/rec rates mismatch\n", DEVNAME(sc));
- return EINVAL;
+ r->sample_rate = p->sample_rate;
}
rate = (setmode & AUMODE_PLAY) ? p->sample_rate : r->sample_rate;
for (i = 0; envy_rates[i].rate < rate; i++) {
diff --git a/sys/dev/pci/esa.c b/sys/dev/pci/esa.c
index c549cd9d09b..798aa358a1c 100644
--- a/sys/dev/pci/esa.c
+++ b/sys/dev/pci/esa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: esa.c,v 1.15 2008/05/29 02:10:01 jakemsr Exp $ */
+/* $OpenBSD: esa.c,v 1.16 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: esa.c,v 1.12 2002/03/24 14:17:35 jmcneill Exp $ */
/*
@@ -282,11 +282,14 @@ esa_set_params(void *hdl, int setmode, int usemode, struct audio_params *play,
break;
}
- if (p->sample_rate < ESA_MINRATE ||
- p->sample_rate > ESA_MAXRATE ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels < 1 || p->channels > 2))
- return (EINVAL);
+ if (p->sample_rate < ESA_MINRATE)
+ p->sample_rate = ESA_MINRATE;
+ if (p->sample_rate > ESA_MAXRATE)
+ p->sample_rate = ESA_MAXRATE;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;
diff --git a/sys/dev/pci/eso.c b/sys/dev/pci/eso.c
index b26aec62434..86fb61f0f7e 100644
--- a/sys/dev/pci/eso.c
+++ b/sys/dev/pci/eso.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eso.c,v 1.26 2008/05/29 07:20:15 jakemsr Exp $ */
+/* $OpenBSD: eso.c,v 1.27 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: eso.c,v 1.48 2006/12/18 23:13:39 kleink Exp $ */
/*
@@ -708,11 +708,14 @@ eso_set_params(void *hdl, int setmode, int usemode,
p = (mode == AUMODE_PLAY) ? play : rec;
- if (p->sample_rate < ESO_MINRATE ||
- p->sample_rate > ESO_MAXRATE ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2))
- return (EINVAL);
+ if (p->sample_rate < ESO_MINRATE)
+ p->sample_rate = ESO_MINRATE;
+ if (p->sample_rate > ESO_MAXRATE)
+ p->sample_rate = ESO_MAXRATE;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = NULL;
diff --git a/sys/dev/pci/maestro.c b/sys/dev/pci/maestro.c
index 0fadf6321fc..a8751dbd8e0 100644
--- a/sys/dev/pci/maestro.c
+++ b/sys/dev/pci/maestro.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: maestro.c,v 1.25 2008/05/29 02:10:01 jakemsr Exp $ */
+/* $OpenBSD: maestro.c,v 1.26 2008/10/25 22:30:43 jakemsr Exp $ */
/* $FreeBSD: /c/ncvs/src/sys/dev/sound/pci/maestro.c,v 1.3 2000/11/21 12:22:11 julian Exp $ */
/*
* FreeBSD's ESS Agogo/Maestro driver
@@ -1090,9 +1090,8 @@ maestro_set_params(hdl, setmode, usemode, play, rec)
play->factor = 1;
play->sw_code = NULL;
- if (play->channels != 1 && play->channels != 2)
- return (EINVAL);
-
+ if (play->channels > 2)
+ play->channels = 2;
sc->play.mode = MAESTRO_PLAY;
if (play->channels == 2)
diff --git a/sys/dev/pci/neo.c b/sys/dev/pci/neo.c
index 2baccef69de..f67cc61505d 100644
--- a/sys/dev/pci/neo.c
+++ b/sys/dev/pci/neo.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: neo.c,v 1.22 2008/05/29 02:10:01 jakemsr Exp $ */
+/* $OpenBSD: neo.c,v 1.23 2008/10/25 22:30:43 jakemsr Exp $ */
/*
* Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk>
@@ -862,8 +862,6 @@ neo_set_params(addr, setmode, usemode, play, rec)
if (p->sample_rate < (samplerates[x] + samplerates[x + 1]) / 2)
break;
- if (x == 8) return (EINVAL);
-
p->sample_rate = samplerates[x];
nm_loadcoeff(sc, mode, x);
diff --git a/sys/dev/pci/sv.c b/sys/dev/pci/sv.c
index 678388a3c2f..b3146af3706 100644
--- a/sys/dev/pci/sv.c
+++ b/sys/dev/pci/sv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sv.c,v 1.24 2008/04/21 00:32:43 jakemsr Exp $ */
+/* $OpenBSD: sv.c,v 1.25 2008/10/25 22:30:43 jakemsr Exp $ */
/*
* Copyright (c) 1998 Constantine Paul Sapuntzakis
@@ -709,12 +709,14 @@ sv_set_params(addr, setmode, usemode, p, r)
mode = SV_DMAA_FORMAT16 | SV_DMAC_FORMAT16;
else
mode = 0;
+ if (p->channels > 2)
+ p->channels = 2;
if (p->channels == 2)
mode |= SV_DMAA_STEREO | SV_DMAC_STEREO;
- else if (p->channels != 1)
- return (EINVAL);
- if (p->sample_rate < 2000 || p->sample_rate > 48000)
- return (EINVAL);
+ if (p->sample_rate < 2000)
+ p->sample_rate = 2000;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
p->sw_code = pswcode;
r->sw_code = rswcode;
diff --git a/sys/dev/pci/yds.c b/sys/dev/pci/yds.c
index 64d3885ea7a..aed3abfe339 100644
--- a/sys/dev/pci/yds.c
+++ b/sys/dev/pci/yds.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: yds.c,v 1.30 2008/05/29 02:10:01 jakemsr Exp $ */
+/* $OpenBSD: yds.c,v 1.31 2008/10/25 22:30:43 jakemsr Exp $ */
/* $NetBSD: yds.c,v 1.5 2001/05/21 23:55:04 minoura Exp $ */
/*
@@ -1211,10 +1211,14 @@ yds_set_params(addr, setmode, usemode, play, rec)
p = mode == AUMODE_PLAY ? play : rec;
- if (p->sample_rate < 4000 || p->sample_rate > 48000 ||
- (p->precision != 8 && p->precision != 16) ||
- (p->channels != 1 && p->channels != 2))
- return (EINVAL);
+ if (p->sample_rate < 4000)
+ p->sample_rate = 4000;
+ if (p->sample_rate > 48000)
+ p->sample_rate = 48000;
+ if (p->precision > 16)
+ p->precision = 16;
+ if (p->channels > 2)
+ p->channels = 2;
p->factor = 1;
p->sw_code = 0;