#include "sample-util.h"
#include "util.h"
#include "modargs.h"
+#include "xmalloc.h"
struct userdata {
struct pa_sink *sink;
struct pa_memblock **in_memblocks, **out_memblocks;
unsigned out_current, in_current;
+ struct pa_module *module;
};
static const char* const valid_modargs[] = {
#define DEFAULT_SOURCE_NAME "oss_input"
#define DEFAULT_DEVICE "/dev/dsp"
+static void update_usage(struct userdata *u) {
+ pa_module_set_used(u->module,
+ (u->sink ? pa_idxset_ncontents(u->sink->inputs) : 0) +
+ (u->sink ? pa_idxset_ncontents(u->sink->monitor_source->outputs) : 0) +
+ (u->source ? pa_idxset_ncontents(u->source->outputs) : 0));
+}
+
static void out_fill_memblocks(struct userdata *u, unsigned n) {
assert(u && u->out_memblocks);
struct count_info info;
assert(u && u->sink);
+ update_usage(u);
+
if (ioctl(u->fd, SNDCTL_DSP_GETOPTR, &info) < 0) {
fprintf(stderr, "SNDCTL_DSP_GETOPTR: %s\n", strerror(errno));
return;
struct count_info info;
assert(u && u->source);
+ update_usage(u);
+
if (ioctl(u->fd, SNDCTL_DSP_GETIPTR, &info) < 0) {
fprintf(stderr, "SNDCTL_DSP_GETIPTR: %s\n", strerror(errno));
return;
struct pa_modargs *ma = NULL;
assert(c && m);
- m->userdata = u = malloc(sizeof(struct userdata));
- assert(u);
- memset(u, 0, sizeof(struct userdata));
+ m->userdata = u = pa_xmalloc0(sizeof(struct userdata));
+ u->module = m;
u->fd = -1;
u->core = c;
pa_source_set_owner(u->source, m);
u->source->description = pa_sprintf_malloc("Open Sound System PCM/mmap() on '%s'", p);
-
- u->in_memblocks = malloc(sizeof(struct pa_memblock *)*u->in_fragments);
- memset(u->in_memblocks, 0, sizeof(struct pa_memblock *)*u->in_fragments);
+ u->in_memblocks = pa_xmalloc0(sizeof(struct pa_memblock *)*u->in_fragments);
enable_bits |= PCM_ENABLE_INPUT;
}
pa_sink_set_owner(u->sink, m);
u->sink->description = pa_sprintf_malloc("Open Sound System PCM/mmap() on '%s'", p);
- u->out_memblocks = malloc(sizeof(struct memblock *)*u->out_fragments);
- memset(u->out_memblocks, 0, sizeof(struct pa_memblock *)*u->out_fragments);
+ u->out_memblocks = pa_xmalloc0(sizeof(struct memblock *)*u->out_fragments);
enable_bits |= PCM_ENABLE_OUTPUT;
}
struct userdata *u;
assert(c && m);
- u = m->userdata;
- assert(u);
+ if (!(u = m->userdata))
+ return;
if (u->out_memblocks) {
unsigned i;
for (i = 0; i < u->out_fragments; i++)
if (u->out_memblocks[i])
pa_memblock_unref_fixed(u->out_memblocks[i]);
- free(u->out_memblocks);
+ pa_xfree(u->out_memblocks);
}
if (u->in_memblocks) {
for (i = 0; i < u->in_fragments; i++)
if (u->in_memblocks[i])
pa_memblock_unref_fixed(u->in_memblocks[i]);
- free(u->in_memblocks);
+ pa_xfree(u->in_memblocks);
}
if (u->in_mmap && u->in_mmap != MAP_FAILED)
if (u->fd >= 0)
close(u->fd);
- free(u);
+ pa_xfree(u);
}