diff options
Diffstat (limited to 'sys/dev/sound/pcm/feeder_fmt.c')
-rw-r--r-- | sys/dev/sound/pcm/feeder_fmt.c | 218 |
1 files changed, 86 insertions, 132 deletions
diff --git a/sys/dev/sound/pcm/feeder_fmt.c b/sys/dev/sound/pcm/feeder_fmt.c index e056da6..739c7a5 100644 --- a/sys/dev/sound/pcm/feeder_fmt.c +++ b/sys/dev/sound/pcm/feeder_fmt.c @@ -28,6 +28,10 @@ #include <dev/sound/pcm/sound.h> +#include "feeder_if.h" + +MALLOC_DEFINE(M_FMTFEEDER, "fmtfeed", "pcm format feeder"); + #define FEEDBUFSZ 8192 static unsigned char ulaw_to_u8[] = { @@ -107,7 +111,7 @@ feed_8to16le(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct { int i, j, k; - k = f->source->feed(f->source, c, b, count / 2, stream); + k = FEEDER_FEED(f->source, c, b, count / 2, stream); j = k - 1; i = j * 2 + 1; while (i > 0 && j >= 0) { @@ -117,37 +121,33 @@ feed_8to16le(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct return k * 2; } -static struct pcm_feederdesc desc_8to16le[] = { +static struct pcm_feederdesc feeder_8to16le_desc[] = { {FEEDER_FMT, AFMT_U8, AFMT_U16_LE, 0}, {FEEDER_FMT, AFMT_U8 | AFMT_STEREO, AFMT_U16_LE | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S8, AFMT_S16_LE, 0}, {FEEDER_FMT, AFMT_S8 | AFMT_STEREO, AFMT_S16_LE | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_8to16le = { - "8to16le", - 0, - desc_8to16le, - NULL, - NULL, - NULL, - feed_8to16le, +static kobj_method_t feeder_8to16le_methods[] = { + KOBJMETHOD(feeder_feed, feed_8to16le), + { 0, 0 } }; -FEEDER_DECLARE(feeder_8to16le); +FEEDER_DECLARE(feeder_8to16le, 0, NULL); /*****************************************************************************/ static int feed_16to8_init(pcm_feeder *f) { - f->data = malloc(FEEDBUFSZ, M_DEVBUF, M_NOWAIT); - return (f->data == NULL); + f->data = malloc(FEEDBUFSZ, M_FMTFEEDER, M_WAITOK | M_ZERO); + return (f->data == NULL)? 0 : ENOMEM; } static int feed_16to8_free(pcm_feeder *f) { - if (f->data) free(f->data, M_DEVBUF); + if (f->data) + free(f->data, M_FMTFEEDER); f->data = NULL; return 0; } @@ -158,7 +158,7 @@ feed_16leto8(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct u_int32_t i = 0, toget = count * 2; int j = 1, k; - k = f->source->feed(f->source, c, f->data, min(toget, FEEDBUFSZ), stream); + k = FEEDER_FEED(f->source, c, f->data, min(toget, FEEDBUFSZ), stream); while (j < k) { b[i++] = ((u_int8_t *)f->data)[j]; j += 2; @@ -166,30 +166,27 @@ feed_16leto8(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct return i; } -static struct pcm_feederdesc desc_16leto8[] = { +static struct pcm_feederdesc feeder_16leto8_desc[] = { {FEEDER_FMT, AFMT_U16_LE, AFMT_U8, 0}, {FEEDER_FMT, AFMT_U16_LE | AFMT_STEREO, AFMT_U8 | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S16_LE, AFMT_S8, 0}, {FEEDER_FMT, AFMT_S16_LE | AFMT_STEREO, AFMT_S8 | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_16leto8 = { - "16leto8", - 1, - desc_16leto8, - feed_16to8_init, - feed_16to8_free, - NULL, - feed_16leto8, +static kobj_method_t feeder_16leto8_methods[] = { + KOBJMETHOD(feeder_init, feed_16to8_init), + KOBJMETHOD(feeder_free, feed_16to8_free), + KOBJMETHOD(feeder_feed, feed_16leto8), + { 0, 0 } }; -FEEDER_DECLARE(feeder_16leto8); +FEEDER_DECLARE(feeder_16leto8, 1, NULL); /*****************************************************************************/ static int feed_monotostereo8(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct uio *stream) { - int i, j, k = f->source->feed(f->source, c, b, count / 2, stream); + int i, j, k = FEEDER_FEED(f->source, c, b, count / 2, stream); j = k - 1; i = j * 2 + 1; @@ -201,28 +198,23 @@ feed_monotostereo8(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, return k * 2; } -static struct pcm_feederdesc desc_monotostereo8[] = { +static struct pcm_feederdesc feeder_monotostereo8_desc[] = { {FEEDER_FMT, AFMT_U8, AFMT_U8 | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S8, AFMT_S8 | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_monotostereo8 = { - "monotostereo8", - 0, - desc_monotostereo8, - NULL, - NULL, - NULL, - feed_monotostereo8, +static kobj_method_t feeder_monotostereo8_methods[] = { + KOBJMETHOD(feeder_feed, feed_monotostereo8), + { 0, 0 } }; -FEEDER_DECLARE(feeder_monotostereo8); +FEEDER_DECLARE(feeder_monotostereo8, 0, NULL); /*****************************************************************************/ static int feed_monotostereo16(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct uio *stream) { - int i, j, k = f->source->feed(f->source, c, b, count / 2, stream); + int i, j, k = FEEDER_FEED(f->source, c, b, count / 2, stream); u_int8_t x, y; j = k - 1; @@ -238,37 +230,33 @@ feed_monotostereo16(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, return k * 2; } -static struct pcm_feederdesc desc_monotostereo16[] = { +static struct pcm_feederdesc feeder_monotostereo16_desc[] = { {FEEDER_FMT, AFMT_U16_LE, AFMT_U16_LE | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S16_LE, AFMT_S16_LE | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_U16_BE, AFMT_U16_BE | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S16_BE, AFMT_S16_BE | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_monotostereo16 = { - "monotostereo16", - 0, - desc_monotostereo16, - NULL, - NULL, - NULL, - feed_monotostereo16, +static kobj_method_t feeder_monotostereo16_methods[] = { + KOBJMETHOD(feeder_feed, feed_monotostereo16), + { 0, 0 } }; -FEEDER_DECLARE(feeder_monotostereo16); +FEEDER_DECLARE(feeder_monotostereo16, 0, NULL); /*****************************************************************************/ static int feed_stereotomono8_init(pcm_feeder *f) { - f->data = malloc(FEEDBUFSZ, M_DEVBUF, M_NOWAIT); - return (f->data == NULL); + f->data = malloc(FEEDBUFSZ, M_FMTFEEDER, M_WAITOK | M_ZERO); + return (f->data == NULL)? 0 : ENOMEM; } static int feed_stereotomono8_free(pcm_feeder *f) { - if (f->data) free(f->data, M_DEVBUF); + if (f->data) + free(f->data, M_FMTFEEDER); f->data = NULL; return 0; } @@ -279,7 +267,7 @@ feed_stereotomono8(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, u_int32_t i = 0, toget = count * 2; int j = 0, k; - k = f->source->feed(f->source, c, f->data, min(toget, FEEDBUFSZ), stream); + k = FEEDER_FEED(f->source, c, f->data, min(toget, FEEDBUFSZ), stream); while (j < k) { b[i++] = ((u_int8_t *)f->data)[j]; j += 2; @@ -287,35 +275,33 @@ feed_stereotomono8(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, return i; } -static struct pcm_feederdesc desc_stereotomono8[] = { +static struct pcm_feederdesc feeder_stereotomono8_desc[] = { {FEEDER_FMT, AFMT_U8 | AFMT_STEREO, AFMT_U8, 0}, {FEEDER_FMT, AFMT_S8 | AFMT_STEREO, AFMT_S8, 0}, {0}, }; -static pcm_feeder feeder_stereotomono8 = { - "stereotomono8", - 1, - desc_stereotomono8, - feed_stereotomono8_init, - feed_stereotomono8_free, - NULL, - feed_stereotomono8, +static kobj_method_t feeder_stereotomono8_methods[] = { + KOBJMETHOD(feeder_init, feed_stereotomono8_init), + KOBJMETHOD(feeder_free, feed_stereotomono8_free), + KOBJMETHOD(feeder_feed, feed_stereotomono8), + { 0, 0 } }; -FEEDER_DECLARE(feeder_stereotomono8); +FEEDER_DECLARE(feeder_stereotomono8, 1, NULL); /*****************************************************************************/ static int feed_stereotomono16_init(pcm_feeder *f) { - f->data = malloc(FEEDBUFSZ, M_DEVBUF, M_NOWAIT); - return (f->data == NULL); + f->data = malloc(FEEDBUFSZ, M_FMTFEEDER, M_WAITOK | M_ZERO); + return (f->data == NULL)? 0 : ENOMEM; } static int feed_stereotomono16_free(pcm_feeder *f) { - if (f->data) free(f->data, M_DEVBUF); + if (f->data) + free(f->data, M_FMTFEEDER); f->data = NULL; return 0; } @@ -326,7 +312,7 @@ feed_stereotomono16(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, u_int32_t i = 0, toget = count * 2; int j = 0, k; - k = f->source->feed(f->source, c, f->data, min(toget, FEEDBUFSZ), stream); + k = FEEDER_FEED(f->source, c, f->data, min(toget, FEEDBUFSZ), stream); while (j < k) { b[i++] = ((u_int8_t *)f->data)[j]; b[i++] = ((u_int8_t *)f->data)[j + 1]; @@ -335,23 +321,20 @@ feed_stereotomono16(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, return i; } -static struct pcm_feederdesc desc_stereotomono16[] = { +static struct pcm_feederdesc feeder_stereotomono16_desc[] = { {FEEDER_FMT, AFMT_U16_LE | AFMT_STEREO, AFMT_U16_LE, 0}, {FEEDER_FMT, AFMT_S16_LE | AFMT_STEREO, AFMT_S16_LE, 0}, {FEEDER_FMT, AFMT_U16_BE | AFMT_STEREO, AFMT_U16_BE, 0}, {FEEDER_FMT, AFMT_S16_BE | AFMT_STEREO, AFMT_S16_BE, 0}, {0}, }; -static pcm_feeder feeder_stereotomono16 = { - "stereotomono16", - 1, - desc_stereotomono16, - feed_stereotomono16_init, - feed_stereotomono16_free, - NULL, - feed_stereotomono16, +static kobj_method_t feeder_stereotomono16_methods[] = { + KOBJMETHOD(feeder_init, feed_stereotomono16_init), + KOBJMETHOD(feeder_free, feed_stereotomono16_free), + KOBJMETHOD(feeder_feed, feed_stereotomono16), + { 0, 0 } }; -FEEDER_DECLARE(feeder_stereotomono16); +FEEDER_DECLARE(feeder_stereotomono16, 1, NULL); /*****************************************************************************/ @@ -359,7 +342,7 @@ static int feed_endian(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct uio *stream) { u_int8_t t; - int i = 0, j = f->source->feed(f->source, c, b, count, stream); + int i = 0, j = FEEDER_FEED(f->source, c, b, count, stream); while (i < j) { t = b[i]; @@ -370,7 +353,7 @@ feed_endian(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct return i; } -static struct pcm_feederdesc desc_endian[] = { +static struct pcm_feederdesc feeder_endian_desc[] = { {FEEDER_FMT, AFMT_U16_LE, AFMT_U16_BE, 0}, {FEEDER_FMT, AFMT_U16_LE | AFMT_STEREO, AFMT_U16_BE | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S16_LE, AFMT_S16_BE, 0}, @@ -381,23 +364,18 @@ static struct pcm_feederdesc desc_endian[] = { {FEEDER_FMT, AFMT_S16_BE | AFMT_STEREO, AFMT_S16_LE | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_endian = { - "endian", - -1, - desc_endian, - NULL, - NULL, - NULL, - feed_endian, +static kobj_method_t feeder_endian_methods[] = { + KOBJMETHOD(feeder_feed, feed_endian), + { 0, 0 } }; -FEEDER_DECLARE(feeder_endian); +FEEDER_DECLARE(feeder_endian, 0, NULL); /*****************************************************************************/ static int feed_sign(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct uio *stream) { - int i = 0, j = f->source->feed(f->source, c, b, count, stream); + int i = 0, j = FEEDER_FEED(f->source, c, b, count, stream); int ssz = (int)f->data, ofs = ssz - 1; while (i < j) { @@ -407,50 +385,38 @@ feed_sign(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct ui return i; } -static struct pcm_feederdesc desc_sign8[] = { +static struct pcm_feederdesc feeder_sign8_desc[] = { {FEEDER_FMT, AFMT_U8, AFMT_S8, 0}, {FEEDER_FMT, AFMT_U8 | AFMT_STEREO, AFMT_S8 | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S8, AFMT_U8, 0}, {FEEDER_FMT, AFMT_S8 | AFMT_STEREO, AFMT_U8 | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_sign8 = { - "sign8", - 0, - desc_sign8, - NULL, - NULL, - NULL, - feed_sign, - (void *)1, +static kobj_method_t feeder_sign8_methods[] = { + KOBJMETHOD(feeder_feed, feed_sign), + { 0, 0 } }; -FEEDER_DECLARE(feeder_sign8); +FEEDER_DECLARE(feeder_sign8, 0, (void *)1); -static struct pcm_feederdesc desc_sign16le[] = { +static struct pcm_feederdesc feeder_sign16le_desc[] = { {FEEDER_FMT, AFMT_U16_LE, AFMT_S16_LE, 0}, {FEEDER_FMT, AFMT_U16_LE | AFMT_STEREO, AFMT_S16_LE | AFMT_STEREO, 0}, {FEEDER_FMT, AFMT_S16_LE, AFMT_U16_LE, 0}, {FEEDER_FMT, AFMT_S16_LE | AFMT_STEREO, AFMT_U16_LE | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_sign16le = { - "sign16le", - -1, - desc_sign16le, - NULL, - NULL, - NULL, - feed_sign, - (void *)2, +static kobj_method_t feeder_sign16le_methods[] = { + KOBJMETHOD(feeder_feed, feed_sign), + { 0, 0 } }; -FEEDER_DECLARE(feeder_sign16le); +FEEDER_DECLARE(feeder_sign16le, -1, (void *)2); /*****************************************************************************/ static int feed_table(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct uio *stream) { - int i = 0, j = f->source->feed(f->source, c, b, count, stream); + int i = 0, j = FEEDER_FEED(f->source, c, b, count, stream); while (i < j) { b[i] = ((u_int8_t *)f->data)[b[i]]; @@ -459,38 +425,26 @@ feed_table(pcm_feeder *f, pcm_channel *c, u_int8_t *b, u_int32_t count, struct u return i; } -static struct pcm_feederdesc desc_ulawtou8[] = { +static struct pcm_feederdesc feeder_ulawtou8_desc[] = { {FEEDER_FMT, AFMT_MU_LAW, AFMT_U8, 0}, {FEEDER_FMT, AFMT_MU_LAW | AFMT_STEREO, AFMT_U8 | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_ulawtou8 = { - "ulawtou8", - 0, - desc_ulawtou8, - NULL, - NULL, - NULL, - feed_table, - ulaw_to_u8, +static kobj_method_t feeder_ulawtou8_methods[] = { + KOBJMETHOD(feeder_feed, feed_table), + { 0, 0 } }; -FEEDER_DECLARE(feeder_ulawtou8); +FEEDER_DECLARE(feeder_ulawtou8, 0, ulaw_to_u8); -static struct pcm_feederdesc desc_u8toulaw[] = { +static struct pcm_feederdesc feeder_u8toulaw_desc[] = { {FEEDER_FMT, AFMT_U8, AFMT_MU_LAW, 0}, {FEEDER_FMT, AFMT_U8 | AFMT_STEREO, AFMT_MU_LAW | AFMT_STEREO, 0}, {0}, }; -static pcm_feeder feeder_u8toulaw = { - "u8toulaw", - 0, - desc_u8toulaw, - NULL, - NULL, - NULL, - feed_table, - u8_to_ulaw, +static kobj_method_t feeder_u8toulaw_methods[] = { + KOBJMETHOD(feeder_feed, feed_table), + { 0, 0 } }; -FEEDER_DECLARE(feeder_u8toulaw); +FEEDER_DECLARE(feeder_u8toulaw, 0, u8_to_ulaw); |