summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm/feeder_fmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pcm/feeder_fmt.c')
-rw-r--r--sys/dev/sound/pcm/feeder_fmt.c218
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);
OpenPOWER on IntegriCloud