Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/isaki-audio2]: src/sys/arch/amiga/dev Adapt to audio2.
details: https://anonhg.NetBSD.org/src/rev/0d23884bbb2c
branches: isaki-audio2
changeset: 450644:0d23884bbb2c
user: isaki <isaki%NetBSD.org@localhost>
date: Sun Apr 21 09:33:54 2019 +0000
description:
Adapt to audio2.
- Remove its own mulaw converter.
- XXX I'm not sure about 3,4ch mode vs 8/14bit mode.
diffstat:
sys/arch/amiga/dev/aucc.c | 569 +++++----------------------------------------
1 files changed, 63 insertions(+), 506 deletions(-)
diffs (truncated from 686 to 300 lines):
diff -r 4b20e8c1bfba -r 0d23884bbb2c sys/arch/amiga/dev/aucc.c
--- a/sys/arch/amiga/dev/aucc.c Sun Apr 21 09:12:34 2019 +0000
+++ b/sys/arch/amiga/dev/aucc.c Sun Apr 21 09:33:54 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: aucc.c,v 1.44 2019/03/16 12:09:56 isaki Exp $ */
+/* $NetBSD: aucc.c,v 1.44.2.1 2019/04/21 09:33:54 isaki Exp $ */
/*
* Copyright (c) 1999 Bernardo Innocenti
@@ -35,14 +35,7 @@
/* TODO:
*
- * - mu-law -> 14bit conversion
* - channel allocation is wrong for 14bit mono
- * - convert the... err... conversion routines to 68k asm for best performance
- * XXX: NO. aucc audio is limited by chipmem speed, anyway. You dont
- * want to make life difficult for amigappc work.
- * -is
- *
- * - rely on auconv.c routines for mu-law/A-law conversions
* - perhaps use a calibration table for better 14bit output
* - set 31 kHz AGA video mode to allow 44.1 kHz even if grfcc is missing
* in the kernel
@@ -53,7 +46,7 @@
#if NAUCC > 0
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: aucc.c,v 1.44 2019/03/16 12:09:56 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: aucc.c,v 1.44.2.1 2019/04/21 09:33:54 isaki Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -65,6 +58,8 @@
#include <sys/audioio.h>
#include <dev/audio_if.h>
+#include <dev/audio/audiovar.h> /* for AUDIO_MIN_FREQUENCY */
+
#include <amiga/amiga/cc.h>
#include <amiga/amiga/custom.h>
#include <amiga/amiga/device.h>
@@ -144,48 +139,13 @@
struct aucc_softc *aucc = NULL;
-unsigned char mulaw_to_lin[] = {
- 0x82, 0x86, 0x8a, 0x8e, 0x92, 0x96, 0x9a, 0x9e,
- 0xa2, 0xa6, 0xaa, 0xae, 0xb2, 0xb6, 0xba, 0xbe,
- 0xc1, 0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf,
- 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf,
- 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
- 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0,
- 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4,
- 0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0xf7, 0xf8,
- 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa,
- 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc,
- 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd,
- 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe,
- 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
- 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x69, 0x65, 0x61,
- 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x49, 0x45, 0x41,
- 0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30,
- 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20,
- 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17,
- 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f,
- 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b,
- 0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07,
- 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05,
- 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
- 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
- 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
/*
* Define our interface to the higher level audio driver.
*/
int aucc_open(void *, int);
void aucc_close(void *);
int aucc_set_out_sr(void *, u_int);
-int aucc_query_encoding(void *, struct audio_encoding *);
+int aucc_query_format(void *, audio_format_query_t *);
int aucc_round_blocksize(void *, int, int, const audio_params_t *);
int aucc_commit_settings(void *);
int aucc_start_output(void *, void *, int, void (*)(void *), void *);
@@ -197,44 +157,24 @@
int aucc_get_port(void *, mixer_ctrl_t *);
int aucc_query_devinfo(void *, mixer_devinfo_t *);
void aucc_encode(int, int, int, int, u_char *, u_short **);
-int aucc_set_params(void *, int, int, audio_params_t *, audio_params_t *,
- stream_filter_list_t *, stream_filter_list_t *);
+int aucc_set_format(void *, int,
+ const audio_params_t *, const audio_params_t *,
+ audio_filter_reg_t *, audio_filter_reg_t *);
int aucc_get_props(void *);
void aucc_get_locks(void *, kmutex_t **, kmutex_t **);
-static void aucc_decode_slinear8_1ch(u_char **, u_char *, int);
-static void aucc_decode_slinear8_2ch(u_char **, u_char *, int);
-static void aucc_decode_slinear8_3ch(u_char **, u_char *, int);
-static void aucc_decode_slinear8_4ch(u_char **, u_char *, int);
-
-static void aucc_decode_ulinear8_1ch(u_char **, u_char *, int);
-static void aucc_decode_ulinear8_2ch(u_char **, u_char *, int);
-static void aucc_decode_ulinear8_3ch(u_char **, u_char *, int);
-static void aucc_decode_ulinear8_4ch(u_char **, u_char *, int);
-
-static void aucc_decode_mulaw_1ch(u_char **, u_char *, int);
-static void aucc_decode_mulaw_2ch(u_char **, u_char *, int);
-static void aucc_decode_mulaw_3ch(u_char **, u_char *, int);
-static void aucc_decode_mulaw_4ch(u_char **, u_char *, int);
-
static void aucc_decode_slinear16_1ch(u_char **, u_char *, int);
static void aucc_decode_slinear16_2ch(u_char **, u_char *, int);
static void aucc_decode_slinear16_3ch(u_char **, u_char *, int);
static void aucc_decode_slinear16_4ch(u_char **, u_char *, int);
-static void aucc_decode_slinear16sw_1ch(u_char **, u_char *, int);
-static void aucc_decode_slinear16sw_2ch(u_char **, u_char *, int);
-static void aucc_decode_slinear16sw_3ch(u_char **, u_char *, int);
-static void aucc_decode_slinear16sw_4ch(u_char **, u_char *, int);
-
-
const struct audio_hw_if sa_hw_if = {
.open = aucc_open,
.close = aucc_close,
- .query_encoding = aucc_query_encoding,
- .set_params = aucc_set_params,
+ .query_format = aucc_query_format,
+ .set_format = aucc_set_format,
.round_blocksize = aucc_round_blocksize,
.commit_settings = aucc_commit_settings,
.start_output = aucc_start_output,
@@ -249,6 +189,35 @@
.get_locks = aucc_get_locks,
};
+/*
+ * XXX *1 How lower limit of frequency should be? same as audio(4)?
+ * XXX *2 Should avoid a magic number at the upper limit of frequency.
+ * XXX *3 In fact, there is a number in this range that have minimal errors.
+ * It would be better if there is a mechanism which such frequency
+ * is prioritized.
+ * XXX *4 3/4ch modes use 8bits, 1/2ch modes use 14bits,
+ * so I imagined that 1/2ch modes are better.
+ */
+#define AUCC_FORMAT(prio, ch, chmask) \
+ { \
+ .mode = AUMODE_PLAY, \
+ .priority = (prio), \
+ .encoding = AUDIO_ENCODING_SLINEAR_BE, \
+ .validbits = 16, \
+ .precision = 16, \
+ .channels = (ch), \
+ .channel_mask = (chmask), \
+ .frequency_type = 0, \
+ .frequency = { AUDIO_MIN_FREQUENCY, 28867 }, \
+ }
+static const struct audio_format aucc_formats[] = {
+ AUCC_FORMAT(1, 1, AUFMT_MONAURAL),
+ AUCC_FORMAT(1, 2, AUFMT_STEREO),
+ AUCC_FORMAT(0, 3, AUFMT_UNKNOWN_POSITION),
+ AUCC_FORMAT(0, 4, AUFMT_UNKNOWN_POSITION),
+};
+#define AUCC_NFORMATS __arraycount(aucc_formats)
+
/* autoconfig routines */
int
@@ -319,10 +288,10 @@
sc->sc_channels = 1;
sc->sc_channelmask = 0xf;
- sc->sc_precision = 8;
- sc->sc_14bit = 0;
- sc->sc_encoding = AUDIO_ENCODING_ULAW;
- sc->sc_decodefunc = aucc_decode_mulaw_1ch;
+ sc->sc_precision = 16;
+ sc->sc_14bit = 1;
+ sc->sc_encoding = AUDIO_ENCODING_SLINEAR_BE;
+ sc->sc_decodefunc = aucc_decode_slinear16_2ch;
/* clear interrupts and DMA: */
custom.intena = AUCC_ALLINTF;
@@ -365,10 +334,6 @@
sc = addr;
DPRINTF(("sa_close: sc=%p\n", sc));
- /*
- * halt i/o, clear open flag, and done.
- */
- aucc_halt_output(sc);
sc->sc_open = 0;
DPRINTF(("sa_close: closed.\n"));
@@ -396,196 +361,41 @@
}
int
-aucc_query_encoding(void *addr, struct audio_encoding *fp)
+aucc_query_format(void *addr, audio_format_query_t *afp)
{
- switch (fp->index) {
- case 0:
- strcpy(fp->name, AudioEslinear);
- fp->encoding = AUDIO_ENCODING_SLINEAR;
- fp->precision = 8;
- fp->flags = 0;
- break;
- case 1:
- strcpy(fp->name, AudioEmulaw);
- fp->encoding = AUDIO_ENCODING_ULAW;
- fp->precision = 8;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
-
- case 2:
- strcpy(fp->name, AudioEulinear);
- fp->encoding = AUDIO_ENCODING_ULINEAR;
- fp->precision = 8;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
-
- case 3:
- strcpy(fp->name, AudioEslinear);
- fp->encoding = AUDIO_ENCODING_SLINEAR;
- fp->precision = 16;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
-
- case 4:
- strcpy(fp->name, AudioEslinear_be);
- fp->encoding = AUDIO_ENCODING_SLINEAR_BE;
- fp->precision = 16;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
-
- case 5:
- strcpy(fp->name, AudioEslinear_le);
- fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
- fp->precision = 16;
- fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
- break;
-
- default:
- return EINVAL;
- /*NOTREACHED*/
- }
- return 0;
+ return audio_query_format(aucc_formats, AUCC_NFORMATS, afp);
}
int
-aucc_set_params(void *addr, int setmode, int usemode,
- audio_params_t *p, audio_params_t *r,
- stream_filter_list_t *pfil, stream_filter_list_t *rfil)
+aucc_set_format(void *addr, int setmode,
+ const audio_params_t *p, const audio_params_t *r,
+ audio_filter_reg_t *pfil, audio_filter_reg_t *rfil)
{
struct aucc_softc *sc;
sc = addr;
- /* if (setmode & AUMODE_RECORD)
- return 0 ENXIO*/;
+ KASSERT((setmode & AUMODE_RECORD) == 0);
#ifdef AUCCDEBUG
- printf("aucc_set_params(setmode 0x%x, usemode 0x%x, "
- "enc %u, bits %u, chn %u, sr %u)\n", setmode, usemode,
- p->encoding, p->precision, p->channels, p->sample_rate);
+ printf("%s(setmode 0x%x,"
+ "enc %u bits %u, chn %u, sr %u)\n", setmode,
+ p->encoding, p->precision, p->channels, p->sample_rate);
#endif
- switch (p->precision) {
- case 8:
- switch (p->encoding) {
- case AUDIO_ENCODING_ULAW:
- switch (p->channels) {
- case 1:
- sc->sc_decodefunc = aucc_decode_mulaw_1ch;
- break;
- case 2:
- sc->sc_decodefunc = aucc_decode_mulaw_2ch;
- break;
- case 3:
- sc->sc_decodefunc = aucc_decode_mulaw_3ch;
- break;
Home |
Main Index |
Thread Index |
Old Index