From: Andre Noll Date: Sun, 3 Jan 2010 21:44:19 +0000 (+0100) Subject: Add btr support for the amp filter. X-Git-Tag: v0.4.2~210 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=764e787bc065694b2e9b05159a92104d585f59eb;p=paraslash.git Add btr support for the amp filter. --- diff --git a/amp_filter.c b/amp_filter.c index b3aa2700..0ed2d8e0 100644 --- a/amp_filter.c +++ b/amp_filter.c @@ -98,6 +98,55 @@ static void amp_open(struct filter_node *fn) fn->buf = para_malloc(fn->bufsize); } +static void amp_post_select(__a_unused struct sched *s, struct task *t) +{ + struct filter_node *fn = container_of(t, struct filter_node, task); + struct private_amp_data *pad = fn->private_data; + struct btr_node *btrn = fn->btrn; + int ret, factor = 64 + pad->amp; + char *in; + size_t in_len = btr_next_buffer(btrn, &in); + size_t i, length = in_len / 2; + int16_t *ip = (int16_t *)in, *op; + bool inplace = btr_inplace_ok(btrn); + + ret = prepare_filter_node(fn); + if (ret < 0) + goto err; + if (ret == 0) + return; + + if (inplace) + op = ip; + else + op = para_malloc(length * 2); + if (pad->amp == 0) { + memcpy(op, ip, length * 2); + goto success; + } + for (i = 0; i < length; i++) { + int x = (ip[i] * factor) >> 6; + + op[i] = x; + if (op[i] != x) + op[i] = (x >= 32768)? 32767 : -32768; + } +success: + t->error = 0; + if (inplace) + btr_pushdown_one(btrn); + else { + btr_consume(btrn, length * 2); + btr_add_output((char *)op, length * 2, btrn); + } + return; +err: + assert(ret < 0); + amp_close(fn); + t->error = ret; + btr_del_node(btrn); +} + /** * The init function of the amplify filter. * @@ -111,6 +160,8 @@ void amp_filter_init(struct filter *f) f->open = amp_open; f->close = amp_close; f->convert = amp_convert; + f->pre_select = generic_filter_pre_select; + f->post_select = amp_post_select; f->parse_config = amp_parse_config; f->help = (struct ggo_help) { .short_help = amp_filter_args_info_help, diff --git a/buffer_tree.c b/buffer_tree.c index 5d8e33fc..1a6b6e60 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -137,6 +137,17 @@ void btr_pushdown(struct btr_node *btrn) btr_pushdown_br(br, btrn); } +int btr_pushdown_one(struct btr_node *btrn) +{ + struct btr_buffer_reference *br; + + if (list_empty(&btrn->input_queue)) + return 0; + br = list_first_entry(&btrn->input_queue, struct btr_buffer_reference, node); + btr_pushdown_br(br, btrn); + return 1; +} + /* Return true if this node has no children. */ bool btr_no_children(struct btr_node *btrn) { diff --git a/buffer_tree.h b/buffer_tree.h index 77343f83..785cd272 100644 --- a/buffer_tree.h +++ b/buffer_tree.h @@ -22,3 +22,5 @@ void *btr_context(struct btr_node *btrn); void btr_merge(struct btr_node *btrn, size_t dest_size); bool btr_eof(struct btr_node *btrn); void btr_log_tree(struct btr_node *btrn, int loglevel); +int btr_pushdown_one(struct btr_node *btrn); +bool btr_inplace_ok(struct btr_node *btrn);