- fix compile error and make software volume filter conform to AUDIO2. - make round_blocksize conform to AUDIO2. - make round_buffersize conform to AUDIO2. It's not necessary. diff --git a/sys/arch/arm/broadcom/bcm2835_vcaudio.c b/sys/arch/arm/broadcom/bcm2835_vcaudio.c index f6884e051..bf6d0a4ce 100644 --- a/sys/arch/arm/broadcom/bcm2835_vcaudio.c +++ b/sys/arch/arm/broadcom/bcm2835_vcaudio.c @@ -95,10 +95,18 @@ enum vcaudio_dest { * 50ms. */ +#if defined(AUDIO2) +/* 40ms block of 16bit 48kHz stereo is 7680 bytes. */ +#define VCAUDIO_MSGSIZE 1920 +#define VCAUDIO_NUMMSGS 4 +#define VCAUDIO_BLOCKSIZE (VCAUDIO_MSGSIZE * VCAUDIO_NUMMSGS) +/* The driver seems to have no buffer size restrictions. */ +#else #define VCAUDIO_MSGSIZE 1600 #define VCAUDIO_NUMMSGS 4 #define VCAUDIO_BLOCKSIZE (VCAUDIO_MSGSIZE * VCAUDIO_NUMMSGS) #define VCAUDIO_BUFFERSIZE 128000 +#endif #define VCAUDIO_PREFILLCOUNT 2 struct vcaudio_softc { @@ -158,10 +166,17 @@ static void vcaudio_worker(void *); static int vcaudio_open(void *, int); static void vcaudio_close(void *); +#if defined(AUDIO2) +static int vcaudio_query_format(void *, audio_format_query_t *); +static int vcaudio_set_format(void *, int, + const audio_params_t *, const audio_params_t *, + audio_filter_reg_t *, audio_filter_reg_t *); +#else static int vcaudio_query_encoding(void *, struct audio_encoding *); static int vcaudio_set_params(void *, int, int, audio_params_t *, audio_params_t *, stream_filter_list_t *, stream_filter_list_t *); +#endif static int vcaudio_halt_output(void *); static int vcaudio_halt_input(void *); static int vcaudio_set_port(void *, mixer_ctrl_t *); @@ -172,7 +187,9 @@ static int vcaudio_get_props(void *); static int vcaudio_round_blocksize(void *, int, int, const audio_params_t *); +#if !defined(AUDIO2) static size_t vcaudio_round_buffersize(void *, int, size_t); +#endif static int vcaudio_trigger_output(void *, void *, void *, int, void (*)(void *), void *, const audio_params_t *); @@ -181,15 +198,24 @@ static int vcaudio_trigger_input(void *, void *, void *, int, static void vcaudio_get_locks(void *, kmutex_t **, kmutex_t **); +#if defined(AUDIO2) +static void vcaudio_swvol_codec(audio_filter_arg_t *); +#else static stream_filter_t *vcaudio_swvol_filter(struct audio_softc *, const audio_params_t *, const audio_params_t *); static void vcaudio_swvol_dtor(stream_filter_t *); +#endif static const struct audio_hw_if vcaudio_hw_if = { .open = vcaudio_open, .close = vcaudio_close, +#if defined(AUDIO2) + .query_format = vcaudio_query_format, + .set_format = vcaudio_set_format, +#else .query_encoding = vcaudio_query_encoding, .set_params = vcaudio_set_params, +#endif .halt_output = vcaudio_halt_output, .halt_input = vcaudio_halt_input, .getdev = vcaudio_getdev, @@ -198,7 +224,9 @@ static const struct audio_hw_if vcaudio_hw_if = { .query_devinfo = vcaudio_query_devinfo, .get_props = vcaudio_get_props, .round_blocksize = vcaudio_round_blocksize, +#if !defined(AUDIO2) .round_buffersize = vcaudio_round_buffersize, +#endif .trigger_output = vcaudio_trigger_output, .trigger_input = vcaudio_trigger_input, .get_locks = vcaudio_get_locks, @@ -589,6 +617,28 @@ vcaudio_close(void *priv) { } +#if defined(AUDIO2) +static int +vcaudio_query_format(void *priv, audio_format_query_t *afp) +{ + struct vcaudio_softc *sc = priv; + + return audio_query_format(&sc->sc_format, 1, afp); +} + +static int +vcaudio_set_format(void *priv, int setmode, + const audio_params_t *play, const audio_params_t *rec, + audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) +{ + struct vcaudio_softc *sc = priv; + + pfil->codec = vcaudio_swvol_codec; + pfil->context = sc; + + return 0; +} +#else static int vcaudio_query_encoding(void *priv, struct audio_encoding *ae) { @@ -617,6 +667,7 @@ vcaudio_set_params(void *priv, int setmode, int usemode, return 0; } +#endif /* AUDIO2 */ static int vcaudio_halt_output(void *priv) @@ -851,12 +902,14 @@ vcaudio_round_blocksize(void *priv, int bs, int mode, return VCAUDIO_BLOCKSIZE; } +#if !defined(AUDIO2) static size_t vcaudio_round_buffersize(void *priv, int direction, size_t bufsize) { return VCAUDIO_BUFFERSIZE; } +#endif static int vcaudio_trigger_output(void *priv, void *start, void *end, int blksize, @@ -899,6 +952,26 @@ vcaudio_get_locks(void *priv, kmutex_t **intr, kmutex_t **thread) *thread = &sc->sc_lock; } +#if defined(AUDIO2) +static void +vcaudio_swvol_codec(audio_filter_arg_t *arg) +{ + struct vcaudio_softc *sc = arg->context; + const aint_t *src; + aint_t *dst; + u_int sample_count; + u_int i; + + src = arg->src; + dst = arg->dst; + sample_count = arg->count * arg->srcfmt->channels; + for (i = 0; i < sample_count; i++) { + aint2_t v = (aint2_t)(*src++); + v = v * sc->sc_swvol / 255; + *dst++ = (aint_t)v; + } +} +#else static stream_filter_t * vcaudio_swvol_filter(struct audio_softc *asc, const audio_params_t *from, const audio_params_t *to) @@ -923,3 +996,4 @@ vcaudio_swvol_dtor(stream_filter_t *this) if (this) kmem_free(this, sizeof(auvolconv_filter_t)); } +#endif /* AUDIO2 */