Module Name: src
Committed By: isaki
Date: Sun Apr 21 09:54:00 UTC 2019
Modified Files:
src/sys/arch/hpcmips/vr [isaki-audio2]: vraiu.c
Log Message:
Adapt to audio2.
To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.16.2.1 src/sys/arch/hpcmips/vr/vraiu.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/hpcmips/vr/vraiu.c
diff -u src/sys/arch/hpcmips/vr/vraiu.c:1.16 src/sys/arch/hpcmips/vr/vraiu.c:1.16.2.1
--- src/sys/arch/hpcmips/vr/vraiu.c:1.16 Sat Mar 16 12:09:56 2019
+++ src/sys/arch/hpcmips/vr/vraiu.c Sun Apr 21 09:54:00 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: vraiu.c,v 1.16 2019/03/16 12:09:56 isaki Exp $ */
+/* $NetBSD: vraiu.c,v 1.16.2.1 2019/04/21 09:54:00 isaki Exp $ */
/*
* Copyright (c) 2001 HAMAJIMA Katsuomi. All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vraiu.c,v 1.16 2019/03/16 12:09:56 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vraiu.c,v 1.16.2.1 2019/04/21 09:54:00 isaki Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -74,12 +74,7 @@ struct vraiu_softc {
u_short *sc_buf; /* DMA buffer pointer */
int sc_status; /* status */
u_int sc_rate; /* sampling rate */
- u_int sc_channels; /* # of channels used */
- u_int sc_encoding; /* encoding type */
- int sc_precision; /* 8 or 16 bits */
- /* pointer to format conversion routine */
u_char sc_volume; /* volume */
- void (*sc_decodefunc)(struct vraiu_softc *, u_short *, void *, int);
void (*sc_intr)(void *); /* interrupt routine */
void *sc_intrdata; /* interrupt data */
};
@@ -97,12 +92,23 @@ struct audio_device aiu_device = {
"aiu"
};
+const struct audio_format vraiu_formats = {
+ .mode = AUMODE_PLAY,
+ .encoding = AUDIO_ENCODING_SLINEAR_NE,
+ .validbits = 10,
+ .precision = 16,
+ .channels = 1,
+ .channel_mask = AUFMT_MONAURAL,
+ .frequency_type = 4,
+ .frequency = { 8000, 11025, 22050, 44100 },
+};
+
/*
* Define our interface to the higher level audio driver.
*/
int vraiu_open(void *, int);
void vraiu_close(void *);
-int vraiu_query_encoding(void *, struct audio_encoding *);
+int vraiu_query_format(void *, audio_format_query_t *);
int vraiu_round_blocksize(void *, int, int, const audio_params_t *);
int vraiu_commit_settings(void *);
int vraiu_init_output(void *, void*, int);
@@ -114,16 +120,17 @@ int vraiu_getdev(void *, struct audio_de
int vraiu_set_port(void *, mixer_ctrl_t *);
int vraiu_get_port(void *, mixer_ctrl_t *);
int vraiu_query_devinfo(void *, mixer_devinfo_t *);
-int vraiu_set_params(void *, int, int, audio_params_t *, audio_params_t *,
- stream_filter_list_t *, stream_filter_list_t *);
+int vraiu_set_format(void *, int,
+ const audio_params_t *, const audio_params_t *,
+ audio_filter_reg_t *, audio_filter_reg_t *);
int vraiu_get_props(void *);
void vraiu_get_locks(void *, kmutex_t **, kmutex_t **);
const struct audio_hw_if vraiu_hw_if = {
.open = vraiu_open,
.close = vraiu_close,
- .query_encoding = vraiu_query_encoding,
- .set_params = vraiu_set_params,
+ .query_format = vraiu_query_format,
+ .set_format = vraiu_set_format,
.round_blocksize = vraiu_round_blocksize,
.commit_settings = vraiu_commit_settings,
.init_output = vraiu_init_output,
@@ -143,20 +150,7 @@ const struct audio_hw_if vraiu_hw_if = {
/*
* convert to 1ch 10bit unsigned PCM data.
*/
-static void vraiu_slinear8_1(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_slinear8_2(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_ulinear8_1(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_ulinear8_2(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_mulaw_1(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_mulaw_2(struct vraiu_softc *, u_short *, void *, int);
static void vraiu_slinear16_1(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_slinear16_2(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_slinear16sw_1(struct vraiu_softc *, u_short *, void *, int);
-static void vraiu_slinear16sw_2(struct vraiu_softc *, u_short *, void *, int);
-/*
- * software volume control
- */
-static void vraiu_volume(struct vraiu_softc *, u_short *, void *, int);
int
vraiu_match(device_t parent, cfdata_t cf, void *aux)
@@ -261,10 +255,6 @@ vraiu_attach(device_t parent, device_t s
sc->sc_status = 0;
sc->sc_rate = SPS8000;
- sc->sc_channels = 1;
- sc->sc_precision = 8;
- sc->sc_encoding = AUDIO_ENCODING_ULAW;
- sc->sc_decodefunc = vraiu_mulaw_1;
DPRINTFN(1, ("vraiu_attach: reset AIU\n"))
bus_space_write_2(sc->sc_iot, sc->sc_ioh, SEQ_REG_W, AIURST);
/* attach audio subsystem */
@@ -293,89 +283,28 @@ vraiu_close(void *self)
DPRINTFN(1, ("vraiu_close\n"));
sc = self;
- vraiu_halt_output(self);
sc->sc_status = 0;
}
int
-vraiu_query_encoding(void *self, struct audio_encoding *ae)
+vraiu_query_format(void *self, audio_format_query_t *afp)
{
- DPRINTFN(3, ("vraiu_query_encoding\n"));
- switch (ae->index) {
- case 0:
- strcpy(ae->name, AudioEslinear);
- ae->encoding = AUDIO_ENCODING_SLINEAR;
- ae->precision = 8;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 1:
- strcpy(ae->name, AudioEmulaw);
- ae->encoding = AUDIO_ENCODING_ULAW;
- ae->precision = 8;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 2:
- strcpy(ae->name, AudioEulinear);
- ae->encoding = AUDIO_ENCODING_ULINEAR;
- ae->precision = 8;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 3:
- strcpy(ae->name, AudioEslinear);
- ae->encoding = AUDIO_ENCODING_SLINEAR;
- ae->precision = 16;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 4:
- strcpy(ae->name, AudioEslinear_be);
- ae->encoding = AUDIO_ENCODING_SLINEAR_BE;
- ae->precision = 16;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 5:
- strcpy(ae->name, AudioEslinear_le);
- ae->encoding = AUDIO_ENCODING_SLINEAR_LE;
- ae->precision = 16;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 6:
- strcpy(ae->name, AudioEslinear);
- ae->encoding = AUDIO_ENCODING_ULINEAR;
- ae->precision = 16;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 7:
- strcpy(ae->name, AudioEslinear_be);
- ae->encoding = AUDIO_ENCODING_ULINEAR_BE;
- ae->precision = 16;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- case 8:
- strcpy(ae->name, AudioEslinear_le);
- ae->encoding = AUDIO_ENCODING_ULINEAR_LE;
- ae->precision = 16;
- ae->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
- default:
- DPRINTFN(0, ("vraiu_query_encoding: param error"
- " (%d)\n", ae->index));
- return EINVAL;
- }
- return 0;
+ return audio_query_format(&vraiu_formats, 1, afp);
}
int
-vraiu_set_params(void *self, int setmode, int usemode,
- audio_params_t *play, audio_params_t *rec,
- stream_filter_list_t *pfil, stream_filter_list_t *rfil)
+vraiu_set_format(void *self, int setmode,
+ const audio_params_t *play, const audio_params_t *rec,
+ audio_filter_reg_t *pfil, audio_filter_reg_t *rfil)
{
struct vraiu_softc *sc;
- DPRINTFN(1, ("vraiu_set_params: %ubit, %uch, %uHz, encoding %u\n",
+ DPRINTFN(1, ("%s: %ubit, %uch, %uHz, encoding %u\n", __func__,
play->precision, play->channels, play->sample_rate,
play->encoding));
sc = self;
+
switch (play->sample_rate) {
case 8000:
sc->sc_rate = SPS8000;
@@ -390,152 +319,17 @@ vraiu_set_params(void *self, int setmode
sc->sc_rate = SPS44100;
break;
default:
- DPRINTFN(0, ("vraiu_set_params: rate error (%ld)\n",
- play->sample_rate));
- return EINVAL;
+ /* NOTREACHED */
+ panic("%s: rate error (%d)\n", __func__, play->sample_rate);
}
- switch (play->precision) {
- case 8:
- switch (play->encoding) {
- case AUDIO_ENCODING_ULAW:
- switch (play->channels) {
- case 1:
- sc->sc_decodefunc = vraiu_mulaw_1;
- break;
- case 2:
- sc->sc_decodefunc = vraiu_mulaw_2;
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: channel error"
- " (%d)\n", play->channels));
- return EINVAL;
- }
- break;
- case AUDIO_ENCODING_SLINEAR:
- case AUDIO_ENCODING_SLINEAR_BE:
- case AUDIO_ENCODING_SLINEAR_LE:
- switch (play->channels) {
- case 1:
- sc->sc_decodefunc = vraiu_slinear8_1;
- break;
- case 2:
- sc->sc_decodefunc = vraiu_slinear8_2;
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: channel error"
- " (%d)\n", play->channels));
- return EINVAL;
- }
- break;
- case AUDIO_ENCODING_ULINEAR:
- case AUDIO_ENCODING_ULINEAR_BE:
- case AUDIO_ENCODING_ULINEAR_LE:
- switch (play->channels) {
- case 1:
- sc->sc_decodefunc = vraiu_ulinear8_1;
- break;
- case 2:
- sc->sc_decodefunc = vraiu_ulinear8_2;
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: channel error"
- " (%d)\n", play->channels));
- return EINVAL;
- }
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: encoding error"
- " (%d)\n", play->encoding));
- return EINVAL;
- }
- break;
- case 16:
- switch (play->encoding) {
-#if BYTE_ORDER == BIG_ENDIAN
- case AUDIO_ENCODING_SLINEAR:
-#endif
- case AUDIO_ENCODING_SLINEAR_BE:
- switch (play->channels) {
- case 1:
-#if BYTE_ORDER == BIG_ENDIAN
- sc->sc_decodefunc = vraiu_slinear16_1;
-#else
- sc->sc_decodefunc = vraiu_slinear16sw_1;
-#endif
- break;
- case 2:
-#if BYTE_ORDER == BIG_ENDIAN
- sc->sc_decodefunc = vraiu_slinear16_2;
-#else
- sc->sc_decodefunc = vraiu_slinear16sw_2;
-#endif
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: channel error"
- " (%d)\n", play->channels));
- return EINVAL;
- }
- break;
-#if BYTE_ORDER == LITTLE_ENDIAN
- case AUDIO_ENCODING_SLINEAR:
-#endif
- case AUDIO_ENCODING_SLINEAR_LE:
- switch (play->channels) {
- case 1:
-#if BYTE_ORDER == LITTLE_ENDIAN
- sc->sc_decodefunc = vraiu_slinear16_1;
-#else
- sc->sc_decodefunc = vraiu_slinear16sw_1;
-#endif
- break;
- case 2:
-#if BYTE_ORDER == LITTLE_ENDIAN
- sc->sc_decodefunc = vraiu_slinear16_2;
-#else
- sc->sc_decodefunc = vraiu_slinear16sw_2;
-#endif
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: channel error"
- " (%d)\n", play->channels));
- return EINVAL;
- }
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: encoding error"
- " (%d)\n", play->encoding));
- return EINVAL;
- }
- break;
- default:
- DPRINTFN(0, ("vraiu_set_params: precision error (%d)\n",
- play->precision));
- return EINVAL;
- }
-
- sc->sc_encoding = play->encoding;
- sc->sc_precision = play->precision;
- sc->sc_channels = play->channels;
return 0;
}
int
vraiu_round_blocksize(void *self, int bs, int mode, const audio_params_t *param)
{
- struct vraiu_softc *sc;
- int n;
-
- sc = self;
- n = AUDIO_BUF_SIZE;
- if (sc->sc_precision == 8)
- n /= 2;
- n *= sc->sc_channels;
-
- DPRINTFN(1, ("vraiu_round_blocksize: upper %d, lower %d\n",
- bs, n));
-
- return n;
+ return AUDIO_BUF_SIZE;
}
int
@@ -593,8 +387,7 @@ vraiu_start_output(void *self, void *blo
DPRINTFN(2, ("vraiu_start_output: block %p, bsize %d\n",
block, bsize));
sc = self;
- sc->sc_decodefunc(sc, sc->sc_buf, block, bsize);
- vraiu_volume(sc, sc->sc_buf, block, bsize);
+ vraiu_slinear16_1(sc, sc->sc_buf, block, bsize);
bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, AUDIO_BUF_SIZE,
BUS_DMASYNC_PREWRITE);
sc->sc_intr = intr;
@@ -774,167 +567,7 @@ vraiu_get_locks(void *self, kmutex_t **i
*thread = &sc->sc_lock;
}
-unsigned char mulaw_to_lin[] = {
- 0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x1a, 0x1e,
- 0x22, 0x26, 0x2a, 0x2e, 0x32, 0x36, 0x3a, 0x3e,
- 0x41, 0x43, 0x45, 0x47, 0x49, 0x4b, 0x4d, 0x4f,
- 0x51, 0x53, 0x55, 0x57, 0x59, 0x5b, 0x5d, 0x5f,
- 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
- 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
- 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74,
- 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x78,
- 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7a,
- 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c,
- 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d,
- 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e,
- 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,
- 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
- 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
- 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80,
- 0xfd, 0xf9, 0xf5, 0xf1, 0xed, 0xe9, 0xe5, 0xe1,
- 0xdd, 0xd9, 0xd5, 0xd1, 0xcd, 0xc9, 0xc5, 0xc1,
- 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,
- 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4, 0xa2, 0xa0,
- 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97,
- 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f,
- 0x8f, 0x8e, 0x8e, 0x8d, 0x8d, 0x8c, 0x8c, 0x8b,
- 0x8b, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x88, 0x87,
- 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85,
- 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83,
- 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
- 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81,
- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-};
-
-static void
-vraiu_slinear8_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- char *q;
-
- DPRINTFN(3, ("vraiu_slinear8_1\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE/2) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE/2);
- n = AUDIO_BUF_SIZE/2;
- }
-#endif
- while (n--) {
- short i = *q++;
- *dmap++ = (i << 2) + 0x200;
- }
-}
-
-static void
-vraiu_slinear8_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- char *q;
-
- DPRINTFN(3, ("vraiu_slinear8_2\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE);
- n = AUDIO_BUF_SIZE;
- }
-#endif
- n /= 2;
- while (n--) {
- short i = *q++;
- short j = *q++;
- *dmap++ = ((i + j) << 1) + 0x200;
- }
-}
-
-static void
-vraiu_ulinear8_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- u_char *q;
-
- DPRINTFN(3, ("vraiu_ulinear8_1\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE/2) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE/2);
- n = AUDIO_BUF_SIZE/2;
- }
-#endif
- while (n--) {
- short i = *q++;
- *dmap++ = i << 2;
- }
-}
-
-static void
-vraiu_ulinear8_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- u_char *q;
-
- DPRINTFN(3, ("vraiu_ulinear8_2\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE);
- n = AUDIO_BUF_SIZE;
- }
-#endif
- n /= 2;
- while (n--) {
- short i = *q++;
- short j = *q++;
- *dmap++ = (i + j) << 1;
- }
-}
-
-static void
-vraiu_mulaw_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- u_char *q;
-
- DPRINTFN(3, ("vraiu_mulaw_1\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE/2) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE/2);
- n = AUDIO_BUF_SIZE/2;
- }
-#endif
- while (n--) {
- short i = mulaw_to_lin[*q++];
- *dmap++ = i << 2;
- }
-}
-
-static void
-vraiu_mulaw_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- u_char *q;
-
- DPRINTFN(3, ("vraiu_mulaw_2\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE);
- n = AUDIO_BUF_SIZE;
- }
-#endif
- n /= 2;
- while (n--) {
- short i = mulaw_to_lin[*q++];
- short j = mulaw_to_lin[*q++];
- *dmap++ = (i + j) << 1;
- }
-}
-
+/* slinear16/mono -> ulinear10/mono with volume */
static void
vraiu_slinear16_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
{
@@ -951,90 +584,8 @@ vraiu_slinear16_1(struct vraiu_softc *sc
#endif
n /= 2;
while (n--) {
- short i = *q++;
- *dmap++ = (i >> 6) + 0x200;
- }
-}
-
-static void
-vraiu_slinear16_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- short *q;
-
- DPRINTFN(3, ("vraiu_slinear16_2\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE*2) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE*2);
- n = AUDIO_BUF_SIZE*2;
- }
-#endif
- n /= 4;
- while (n--) {
- short i = *q++;
- short j = *q++;
- *dmap++ = (i >> 7) + (j >> 7) + 0x200;
- }
-}
-
-static void
-vraiu_slinear16sw_1(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- short *q;
-
- DPRINTFN(3, ("vraiu_slinear16sw_1\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE);
- n = AUDIO_BUF_SIZE;
- }
-#endif
- n /= 2;
- while (n--) {
- short i = bswap16(*q++);
+ int i = *q++;
+ i = i * sc->sc_volume / 255;
*dmap++ = (i >> 6) + 0x200;
}
}
-
-static void
-vraiu_slinear16sw_2(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- short *q;
-
- DPRINTFN(3, ("vraiu_slinear16sw_2\n"));
- q = p;
-#ifdef DIAGNOSTIC
- if (n > AUDIO_BUF_SIZE*2) {
- printf("%s: output data too large (%d > %d)\n",
- device_xname(sc->sc_dev), n, AUDIO_BUF_SIZE*2);
- n = AUDIO_BUF_SIZE*2;
- }
-#endif
- n /= 4;
- while (n--) {
- short i = bswap16(*q++);
- short j = bswap16(*q++);
- *dmap++ = (i >> 7) + (j >> 7) + 0x200;
- }
-}
-
-static void
-vraiu_volume(struct vraiu_softc *sc, u_short *dmap, void *p, int n)
-{
- int16_t *x;
- int i;
- short j;
- int vol;
-
- x = (int16_t *)dmap;
- vol = sc->sc_volume;
- for (i = 0; i < n / 2; i++) {
- j = x[i] - 512;
- x[i] = ((j * vol) / 255) + 512;
- }
-
- return;
-}