Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/isaki-audio2]: src/sys/dev/pci Adapt to audio2.
details: https://anonhg.NetBSD.org/src/rev/6bbd8a63f20f
branches: isaki-audio2
changeset: 450891:6bbd8a63f20f
user: isaki <isaki%NetBSD.org@localhost>
date: Sun Apr 28 07:48:15 2019 +0000
description:
Adapt to audio2.
- XXX In audio2, number of blocks must be 3 or greater, so
modify round_blocksize() to return bufsize / 4.
- XXX Doesn't neo_trigger_input() need to subtract ssz from
buffer end like trigger_output()?
diffstat:
sys/dev/pci/neo.c | 199 +++++++++++++++--------------------------------------
1 files changed, 56 insertions(+), 143 deletions(-)
diffs (truncated from 308 to 300 lines):
diff -r 47e77e88edb7 -r 6bbd8a63f20f sys/dev/pci/neo.c
--- a/sys/dev/pci/neo.c Sun Apr 28 07:01:45 2019 +0000
+++ b/sys/dev/pci/neo.c Sun Apr 28 07:48:15 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: neo.c,v 1.52.2.1 2019/04/21 05:11:22 isaki Exp $ */
+/* $NetBSD: neo.c,v 1.52.2.2 2019/04/28 07:48:15 isaki Exp $ */
/*
* Copyright (c) 1999 Cameron Grant <gandalf%vilnya.demon.co.uk@localhost>
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: neo.c,v 1.52.2.1 2019/04/21 05:11:22 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: neo.c,v 1.52.2.2 2019/04/28 07:48:15 isaki Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -43,8 +43,6 @@
#include <sys/audioio.h>
#include <dev/audio_if.h>
-#include <dev/mulaw.h>
-#include <dev/auconv.h>
#include <dev/ic/ac97var.h>
@@ -176,11 +174,12 @@
static int neo_match(device_t, cfdata_t, void *);
static void neo_attach(device_t, device_t, void *);
static int neo_intr(void *);
+static int neo_rate2index(u_int);
-static int neo_query_encoding(void *, struct audio_encoding *);
-static int neo_set_params(void *, int, int, audio_params_t *,
- audio_params_t *, stream_filter_list_t *,
- stream_filter_list_t *);
+static int neo_query_format(void *, audio_format_query_t *);
+static int neo_set_format(void *, int,
+ const audio_params_t *, const audio_params_t *,
+ audio_filter_reg_t *, audio_filter_reg_t *);
static int neo_round_blocksize(void *, int, int, const audio_params_t *);
static int neo_trigger_output(void *, void *, void *, int,
void (*)(void *), void *,
@@ -202,7 +201,6 @@
static void * neo_malloc(void *, int, size_t);
static void neo_free(void *, void *, size_t);
static size_t neo_round_buffersize(void *, int, size_t);
-static paddr_t neo_mappage(void *, void *, off_t, int);
static int neo_get_props(void *);
static void neo_get_locks(void *, kmutex_t **, kmutex_t **);
@@ -215,44 +213,30 @@
"neo"
};
-/* The actual rates supported by the card. */
-static const int samplerates[9] = {
- 8000,
- 11025,
- 16000,
- 22050,
- 24000,
- 32000,
- 44100,
- 48000,
- 99999999
+/*
+ * The frequency list in this format is also referred from neo_rate2index().
+ * So don't rearrange or delete entries.
+ */
+static const struct audio_format neo_formats[] = {
+ {
+ .mode = AUMODE_PLAY | AUMODE_RECORD,
+ .encoding = AUDIO_ENCODING_SLINEAR_LE,
+ .validbits = 16,
+ .precision = 16,
+ .channels = 2,
+ .channel_mask = AUFMT_STEREO,
+ .frequency_type = 8,
+ .frequency =
+ { 8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000 },
+ },
};
-
-#define NEO_NFORMATS 4
-#define NEO_FORMAT(enc, prec, ch, chmask) \
- { \
- .mode = AUMODE_PLAY | AUMODE_RECORD, \
- .encoding = (enc), \
- .validbits = (prec), \
- .precision = (prec), \
- .channels = (ch), \
- .channel_mask = (chmask), \
- .frequency_type = 8, \
- .frequency = \
- { 8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000 }, \
- }
-static const struct audio_format neo_formats[NEO_NFORMATS] = {
- NEO_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 2, AUFMT_STEREO),
- NEO_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 1, AUFMT_MONAURAL),
- NEO_FORMAT(AUDIO_ENCODING_ULINEAR_LE, 8, 2, AUFMT_STEREO),
- NEO_FORMAT(AUDIO_ENCODING_ULINEAR_LE, 8, 1, AUFMT_MONAURAL),
-};
+#define NEO_NFORMATS __arraycount(neo_formats)
/* -------------------------------------------------------------------- */
static const struct audio_hw_if neo_hw_if = {
- .query_encoding = neo_query_encoding,
- .set_params = neo_set_params,
+ .query_format = neo_query_format,
+ .set_format = neo_set_format,
.round_blocksize = neo_round_blocksize,
.halt_output = neo_halt_output,
.halt_input = neo_halt_input,
@@ -263,7 +247,6 @@
.allocm = neo_malloc,
.freem = neo_free,
.round_buffersize = neo_round_buffersize,
- .mappage = neo_mappage,
.get_props = neo_get_props,
.trigger_output = neo_trigger_output,
.trigger_input = neo_trigger_input,
@@ -722,75 +705,38 @@
}
static int
-neo_query_encoding(void *addr, struct audio_encoding *fp)
+neo_query_format(void *addr, audio_format_query_t *afp)
{
- switch (fp->index) {
- case 0:
- strcpy(fp->name, AudioEulinear);
- fp->encoding = AUDIO_ENCODING_ULINEAR;
- fp->precision = 8;
- fp->flags = 0;
- return 0;
- case 1:
- strcpy(fp->name, AudioEmulaw);
- fp->encoding = AUDIO_ENCODING_ULAW;
- fp->precision = 8;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- return 0;
- case 2:
- strcpy(fp->name, AudioEalaw);
- fp->encoding = AUDIO_ENCODING_ALAW;
- fp->precision = 8;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- return 0;
- case 3:
- strcpy(fp->name, AudioEslinear);
- fp->encoding = AUDIO_ENCODING_SLINEAR;
- fp->precision = 8;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- return (0);
- case 4:
- strcpy(fp->name, AudioEslinear_le);
- fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
- fp->precision = 16;
- fp->flags = 0;
- return 0;
- case 5:
- strcpy(fp->name, AudioEulinear_le);
- fp->encoding = AUDIO_ENCODING_ULINEAR_LE;
- fp->precision = 16;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- return 0;
- case 6:
- strcpy(fp->name, AudioEslinear_be);
- fp->encoding = AUDIO_ENCODING_SLINEAR_BE;
- fp->precision = 16;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- return 0;
- case 7:
- strcpy(fp->name, AudioEulinear_be);
- fp->encoding = AUDIO_ENCODING_ULINEAR_BE;
- fp->precision = 16;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- return 0;
- default:
- return EINVAL;
+ return audio_query_format(neo_formats, NEO_NFORMATS, afp);
+}
+
+/* Return index number of sample_rate */
+static int
+neo_rate2index(u_int sample_rate)
+{
+ int i;
+
+ for (i = 0; i < neo_formats[0].frequency_type; i++) {
+ if (sample_rate == neo_formats[0].frequency[i])
+ return i;
}
+
+ /* NOTREACHED */
+ panic("neo_formats.frequency mismatch?");
}
/* Todo: don't commit settings to card until we've verified all parameters */
static int
-neo_set_params(void *addr, int setmode, int usemode,
- audio_params_t *play, audio_params_t *rec, stream_filter_list_t *pfil,
- stream_filter_list_t *rfil)
+neo_set_format(void *addr, int setmode,
+ const audio_params_t *play, const audio_params_t *rec,
+ audio_filter_reg_t *pfil, audio_filter_reg_t *rfil)
{
struct neo_softc *sc;
- audio_params_t *p;
- stream_filter_list_t *fil;
+ const audio_params_t *p;
uint32_t base;
uint8_t x;
- int mode, i;
+ int mode;
sc = addr;
for (mode = AUMODE_RECORD; mode != -1;
@@ -800,35 +746,17 @@
p = mode == AUMODE_PLAY ? play : rec;
- if (p == NULL) continue;
-
- for (x = 0; x < 8; x++) {
- if (p->sample_rate <
- (samplerates[x] + samplerates[x + 1]) / 2)
- break;
- }
- if (x == 8)
- return EINVAL;
-
- p->sample_rate = samplerates[x];
+ x = neo_rate2index(p->sample_rate);
nm_loadcoeff(sc, mode, x);
x <<= 4;
x &= NM_RATE_MASK;
- if (p->precision == 16)
- x |= NM_RATE_BITS_16;
- if (p->channels == 2)
- x |= NM_RATE_STEREO;
+ x |= NM_RATE_BITS_16;
+ x |= NM_RATE_STEREO;
base = (mode == AUMODE_PLAY)?
NM_PLAYBACK_REG_OFFSET : NM_RECORD_REG_OFFSET;
nm_wr_1(sc, base + NM_RATE_REG_OFFSET, x);
-
- fil = mode == AUMODE_PLAY ? pfil : rfil;
- i = auconv_set_converter(neo_formats, NEO_NFORMATS,
- mode, p, FALSE, fil);
- if (i < 0)
- return EINVAL;
}
return 0;
@@ -839,7 +767,8 @@
const audio_params_t *param)
{
- return NM_BUFFSIZE / 2;
+ /* The number of blocks must be 3 or greater. */
+ return NM_BUFFSIZE / 4;
}
static int
@@ -891,6 +820,10 @@
sc->rblksize = blksize;
sc->rwmark = blksize;
+ /*
+ * XXX Doesn't it need to subtract ssz from BUFFER_END like
+ * trigger_output()?
+ */
nm_wr_4(sc, NM_RBUFFER_START, sc->rbuf);
nm_wr_4(sc, NM_RBUFFER_END, sc->rbuf + sc->rbufsize);
nm_wr_4(sc, NM_RBUFFER_CURRP, sc->rbuf);
@@ -1011,26 +944,6 @@
return NM_BUFFSIZE;
}
-static paddr_t
-neo_mappage(void *addr, void *mem, off_t off, int prot)
-{
- struct neo_softc *sc;
- vaddr_t v;
- bus_addr_t pciaddr;
-
- sc = addr;
- v = (vaddr_t)mem;
- if (v == sc->pbuf_vaddr)
- pciaddr = sc->pbuf_pciaddr;
- else if (v == sc->rbuf_vaddr)
- pciaddr = sc->rbuf_pciaddr;
- else
- return -1;
Home |
Main Index |
Thread Index |
Old Index