summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa/sb8.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/isa/sb8.c')
-rw-r--r--sys/dev/sound/isa/sb8.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c
index 5123d40..ed1eefe 100644
--- a/sys/dev/sound/isa/sb8.c
+++ b/sys/dev/sound/isa/sb8.c
@@ -881,8 +881,8 @@ ess_format(struct sb_chinfo *ch, u_int32_t format)
{
struct sb_info *sb = ch->parent;
int play = (ch->dir == PCMDIR_PLAY)? 1 : 0;
- int b16 = (ch->fmt & AFMT_S16_LE)? 1 : 0;
- int stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
+ int b16 = (format & AFMT_S16_LE)? 1 : 0;
+ int stereo = (format & AFMT_STEREO)? 1 : 0;
u_char c;
ch->fmt = format;
sb_reset_dsp(sb);
@@ -913,7 +913,7 @@ ess_speed(struct sb_chinfo *ch, int speed)
if (speed > 22000) {
t = (795500 + speed / 2) / speed;
speed = (795500 + t / 2) / t;
- t = (256 - t ) | 0x80;
+ t = (256 - t ) | 0x80;
} else {
t = (397700 + speed / 2) / speed;
speed = (397700 + t / 2) / t;
@@ -1175,7 +1175,10 @@ sbmix_set(snd_mixer *m, unsigned dev, unsigned left, unsigned right)
switch (sb->bd_flags & BD_F_MIX_MASK) {
case BD_F_MIX_CT1345:
- iomap = &sbpro_mix;
+ if (sb->bd_flags & BD_F_ESS)
+ iomap = &ess_mix;
+ else
+ iomap = &sbpro_mix;
break;
case BD_F_MIX_CT1745:
@@ -1186,19 +1189,24 @@ sbmix_set(snd_mixer *m, unsigned dev, unsigned left, unsigned right)
return -1;
/* XXX how about the SG NX Pro, iomap = sgnxpro_mix */
}
+
+ /* Change left channel */
regoffs = (*iomap)[dev][LEFT_CHN].regno;
- if (regoffs == 0) return -1;
- val = sb_getmixer(sb, regoffs);
- change_bits(iomap, &val, dev, LEFT_CHN, left);
- sb_setmixer(sb, regoffs, val);
- if ((*iomap)[dev][RIGHT_CHN].regno != regoffs) { /* Change register */
- regoffs = (*iomap)[dev][RIGHT_CHN].regno;
- if (regoffs != 0) {
- val = sb_getmixer(sb, regoffs); /* Read the new one */
- change_bits(iomap, &val, dev, RIGHT_CHN, right);
- sb_setmixer(sb, regoffs, val);
- } else right = left;
- } else right = left;
+ if (regoffs != 0) {
+ val = sb_getmixer(sb, regoffs);
+ change_bits(iomap, &val, dev, LEFT_CHN, left);
+ sb_setmixer(sb, regoffs, val);
+ }
+
+ /* Change right channel */
+ regoffs = (*iomap)[dev][RIGHT_CHN].regno;
+ if (regoffs != 0) {
+ val = sb_getmixer(sb, regoffs); /* Read the new one */
+ change_bits(iomap, &val, dev, RIGHT_CHN, right);
+ sb_setmixer(sb, regoffs, val);
+ } else
+ right = left;
+
return left | (right << 8);
}
@@ -1284,6 +1292,10 @@ sbpnp_probe(device_t dev)
case 0x69187316: /* ESS1869 */
s = "ESS1869";
break;
+
+ case 0x88187316: /* ESS1888 */
+ s = "ESS1888";
+ break;
}
if (s) {
device_set_desc(dev, s);
OpenPOWER on IntegriCloud