summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authornetchild <netchild@FreeBSD.org>2005-10-02 15:31:03 +0000
committernetchild <netchild@FreeBSD.org>2005-10-02 15:31:03 +0000
commit68e320e3c99d605225dc7c472ac1271d915c8a15 (patch)
treed5c4c38aaaa10582468a52876b8239b6f9770e7f /sys
parentfa78edf3234186ecf94db5eb6729b55045cad461 (diff)
downloadFreeBSD-src-68e320e3c99d605225dc7c472ac1271d915c8a15.zip
FreeBSD-src-68e320e3c99d605225dc7c472ac1271d915c8a15.tar.gz
Soft volume implementation for audio devices without pcm mixer controller.
Submitted by: Ariff Abdullah <skywizard@MyBSD.org.my> Tested by: multimedia@
Diffstat (limited to 'sys')
-rw-r--r--sys/conf/files1
-rw-r--r--sys/dev/sound/pcm/feeder_volume.c78
-rw-r--r--sys/modules/sound/sound/Makefile2
3 files changed, 80 insertions, 1 deletions
diff --git a/sys/conf/files b/sys/conf/files
index eae581a..1af4da6 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -882,6 +882,7 @@ dev/sound/pcm/feeder.c optional sound
dev/sound/pcm/feeder_fmt.c optional sound
dev/sound/pcm/feeder_if.m optional sound
dev/sound/pcm/feeder_rate.c optional sound
+dev/sound/pcm/feeder_volume.c optional sound
dev/sound/pcm/mixer.c optional sound
dev/sound/pcm/mixer_if.m optional sound
dev/sound/pcm/sndstat.c optional sound
diff --git a/sys/dev/sound/pcm/feeder_volume.c b/sys/dev/sound/pcm/feeder_volume.c
new file mode 100644
index 0000000..378c793
--- /dev/null
+++ b/sys/dev/sound/pcm/feeder_volume.c
@@ -0,0 +1,78 @@
+/*-
+ * Copyright (c) 2005 Ariff Abdullah
+ * <skywizard@MyBSD.org.my> All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * feeder_volume, a long 'Lost Technology' rather than a new feature.
+ */
+
+#include <dev/sound/pcm/sound.h>
+#include "feeder_if.h"
+
+SND_DECLARE_FILE("$FreeBSD$");
+
+static int
+feed_volume_s16(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b,
+ uint32_t count, void *source)
+{
+ int i, j, k, vol[2];
+ int16_t *buf;
+
+ k = FEEDER_FEED(f->source, c, b, count & ~1, source);
+ if (k < 2) {
+#if 0
+ device_printf(c->dev, "%s: Not enough data (Got: %d bytes)\n",
+ __func__, k);
+#endif
+ return 0;
+ }
+#if 0
+ if (k & 1)
+ device_printf(c->dev, "%s: Bytes not 16bit aligned.\n", __func__);
+#endif
+ k &= ~1;
+ i = k >> 1;
+ buf = (int16_t *)b;
+ vol[0] = c->volume & 0x7f;
+ vol[1] = (c->volume >> 8) & 0x7f;
+ while (i > 0) {
+ i--;
+ j = (vol[i & 1] * buf[i]) / 100;
+ if (j > 32767)
+ j = 32767;
+ if (j < -32768)
+ j = -32768;
+ buf[i] = j;
+ }
+ return k;
+}
+
+static struct pcm_feederdesc feeder_volume_s16_desc[] = {
+ {FEEDER_VOLUME, AFMT_S16_LE|AFMT_STEREO, AFMT_S16_LE|AFMT_STEREO, 0},
+ {0, 0, 0, 0},
+};
+static kobj_method_t feeder_volume_s16_methods[] = {
+ KOBJMETHOD(feeder_feed, feed_volume_s16),
+ {0, 0}
+};
+FEEDER_DECLARE(feeder_volume_s16, 2, NULL);
diff --git a/sys/modules/sound/sound/Makefile b/sys/modules/sound/sound/Makefile
index 8649d96..08c883d 100644
--- a/sys/modules/sound/sound/Makefile
+++ b/sys/modules/sound/sound/Makefile
@@ -8,7 +8,7 @@ SRCS= device_if.h bus_if.h isa_if.h pci_if.h opt_isa.h
SRCS+= ac97_if.h channel_if.h feeder_if.h mixer_if.h
SRCS+= ac97_if.c channel_if.c feeder_if.c mixer_if.c
SRCS+= ac97.c ac97_patch.c buffer.c channel.c dsp.c
-SRCS+= fake.c feeder.c feeder_fmt.c feeder_rate.c
+SRCS+= fake.c feeder.c feeder_fmt.c feeder_rate.c feeder_volume.c
SRCS+= mixer.c sndstat.c sound.c vchan.c
EXPORT_SYMS= YES # XXX evaluate
OpenPOWER on IntegriCloud