2 * Copyright (C) 2008 Andre Noll <maan@systemlinux.org>
4 * Licensed under the GPL v2. For licencing details see COPYING.
7 /** \file amp_filter.c Paraslash's amplify filter. */
10 #include "amp_filter.cmdline.h"
17 /** The size of the output data buffer. */
18 #define AMP_CHUNK_SIZE 40960
20 extern char *stat_item_values
[NUM_STAT_ITEMS
];
22 /** Data specific to the amplify filter. */
23 struct private_amp_data
{
24 /** Points to the configuration data for this instance of this filter. */
25 struct amp_filter_args_info
*conf
;
26 /** Amplification factor. */
30 static ssize_t
amp_convert(char *inbuf
, size_t inbuf_len
, struct filter_node
*fn
)
32 size_t i
, length
= PARA_MIN((inbuf_len
/ 2) * 2,
33 (fn
->bufsize
- fn
->loaded
) / 2 * 2);
34 struct private_amp_data
*pad
= fn
->private_data
;
35 int16_t *ip
= (int16_t *)inbuf
, *op
= (int16_t *)(fn
->buf
+ fn
->loaded
);
39 for (i
= 0; i
< length
/ 2; i
++) {
40 int x
= (PARA_ABS(*ip
) * (64 + pad
->amp
)) >> 6;
41 *op
++ = *ip
++ > 0? PARA_MIN(x
, 32767) : PARA_MAX(-x
, -32768);
47 static void amp_close(struct filter_node
*fn
)
49 free(fn
->private_data
);
53 static void *amp_parse_config(int argc
, char **argv
)
55 struct amp_filter_args_info
*conf
= para_calloc(sizeof(*conf
));
57 if (amp_cmdline_parser(argc
, argv
, conf
))
59 if (conf
->amp_arg
< 0)
61 PARA_NOTICE_LOG("amplification: %u (scaling factor: %1.2f)\n", conf
->amp_arg
,
62 conf
->amp_arg
/ 64.0 + 1.0);
69 static void amp_open(struct filter_node
*fn
)
71 struct private_amp_data
*pad
= para_calloc(sizeof(*pad
));
74 fn
->private_data
= pad
;
75 if (!pad
->conf
->amp_given
&& stat_item_values
[SI_AMPLIFICATION
]) {
76 int i
= SI_AMPLIFICATION
;
77 char *s
= stat_item_values
[i
] + strlen(status_item_list
[i
]) + 1;
78 sscanf(s
, "%u", &pad
->amp
);
80 pad
->amp
= pad
->conf
->amp_arg
;
81 fn
->bufsize
= AMP_CHUNK_SIZE
;
82 fn
->buf
= para_malloc(fn
->bufsize
);
86 * The init function of the amplify filter.
88 * \param f Pointer to the struct to initialize.
90 void amp_init(struct filter
*f
)
94 f
->convert
= amp_convert
;
95 f
->print_help
= amp_cmdline_parser_print_help
;
96 f
->parse_config
= amp_parse_config
;