As promised: Soft volume mixer controller
Ariff Abdullah
skywizard at MyBSD.org.my
Wed Sep 14 05:56:42 PDT 2005
On Wed, 14 Sep 2005 14:40:39 +0200
Michael Nottebrock <lofi at freebsd.org> wrote:
> On Wednesday, 14. September 2005 14:16, Ariff Abdullah wrote:
>
> > It has always been the case. It's not a bug (depend on bug
> > definition): dsp0.0 = hardware channel
> > dsp0.1 = master / parent channel (feeder_mix_s16)
> > dsp0.2,3,4,5 = virtual channel
>
> Oy. Good to know, that.
>
> > Ok, back to our real problem. Can you uncomment / restore back
> > ac97_fix_volume(codec); , and apply this:
>
> Can you please resend that as a proper attachment? Fiddling diffs out
> of a mail body is painful enough as it is, but this one also has
> wrapped lines ...
>
Ok.
--
Ariff Abdullah
MyBSD
http://www.MyBSD.org.my (IPv6/IPv4)
http://staff.MyBSD.org.my (IPv6/IPv4)
http://tomoyo.MyBSD.org.my (IPv6/IPv4)
-------------- next part --------------
--- sys/dev/sound/pcm/channel.c.orig Wed Sep 14 19:47:43 2005
+++ sys/dev/sound/pcm/channel.c Wed Sep 14 19:48:04 2005
@@ -884,6 +884,7 @@
chn_lockdestroy(c);
return ret;
+#if 0
} else if (c->direction == PCMDIR_PLAY &&
c->parentsnddev && (c->parentsnddev->flags & SD_F_SOFTVOL) &&
c->parentsnddev->mixer_dev) {
@@ -899,6 +900,7 @@
CHN_LOCK(c);
chn_setvolume(c, vol & 0x7f, (vol >> 8) & 0x7f);
CHN_UNLOCK(c);
+#endif
}
return 0;
@@ -1331,7 +1333,8 @@
c->feederflags &= ~(1 << FEEDER_VOLUME);
if (c->direction == PCMDIR_PLAY &&
!(c->flags & (CHN_F_VIRTUAL|CHN_F_HAS_SLAVE)) &&
- c->parentsnddev && (c->parentsnddev->flags & SD_F_SOFTVOL))
+ c->parentsnddev && (c->parentsnddev->flags & SD_F_SOFTVOL) &&
+ c->parentsnddev->mixer_dev)
c->feederflags |= 1 << FEEDER_VOLUME;
flags = c->feederflags;
fmtlist = chn_getcaps(c)->fmtlist;
@@ -1396,6 +1399,17 @@
}
sndbuf_setfmt(c->bufhard, hwfmt);
+
+ if ((flags & (1 << FEEDER_VOLUME))) {
+ int vol = 100 | (100 << 8);
+
+ CHN_UNLOCK(c);
+ if (mixer_ioctl(c->parentsnddev->mixer_dev,
+ MIXER_READ(SOUND_MIXER_PCM), (caddr_t)&vol, -1, NULL) != 0)
+ device_printf(c->dev, "Soft Volume: Failed to read default value\n");
+ CHN_LOCK(c);
+ chn_setvolume(c, vol & 0x7f, (vol >> 8) & 0x7f);
+ }
return 0;
}
More information about the freebsd-multimedia
mailing list