2 * Copyright (C) 2009 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. */
12 #include "amp_filter.cmdline.h"
20 /** The size of the output data buffer. */
21 #define AMP_CHUNK_SIZE 40960
23 extern char *stat_item_values
[NUM_STAT_ITEMS
];
25 /** Data specific to the amplify filter. */
26 struct private_amp_data
{
27 /** Points to the configuration data for this instance of this filter. */
28 struct amp_filter_args_info
*conf
;
29 /** Amplification factor. */
33 static ssize_t
amp_convert(char *inbuf
, size_t inbuf_len
, struct filter_node
*fn
)
35 size_t i
, length
= PARA_MIN((inbuf_len
/ 2),
36 (fn
->bufsize
- fn
->loaded
) / 2);
37 struct private_amp_data
*pad
= fn
->private_data
;
38 int16_t *ip
= (int16_t *)inbuf
, *op
= (int16_t *)(fn
->buf
+ fn
->loaded
);
39 int factor
= 64 + pad
->amp
;
45 memcpy(op
, ip
, length
* 2);
48 for (i
= 0; i
< length
; i
++) {
49 int x
= (ip
[i
] * factor
) >> 6;
53 op
[i
] = (x
>= 32768)? 32767 : -32768;
56 fn
->loaded
+= length
* 2;
60 static void amp_close(struct filter_node
*fn
)
62 free(fn
->private_data
);
66 static int amp_parse_config(int argc
, char **argv
, void **config
)
68 struct amp_filter_args_info
*amp_conf
= para_calloc(sizeof(*amp_conf
));
69 int ret
= -E_AMP_SYNTAX
;
71 if (amp_cmdline_parser(argc
, argv
, amp_conf
))
73 ret
= -ERRNO_TO_PARA_ERROR(EINVAL
);
74 if (amp_conf
->amp_arg
< 0)
76 PARA_NOTICE_LOG("amplification: %u (scaling factor: %1.2f)\n",
77 amp_conf
->amp_arg
, amp_conf
->amp_arg
/ 64.0 + 1.0);
85 static void amp_open(struct filter_node
*fn
)
87 struct private_amp_data
*pad
= para_calloc(sizeof(*pad
));
90 fn
->private_data
= pad
;
91 if (!pad
->conf
->amp_given
&& stat_item_values
[SI_AMPLIFICATION
])
92 sscanf(stat_item_values
[SI_AMPLIFICATION
], "%u", &pad
->amp
);
94 pad
->amp
= pad
->conf
->amp_arg
;
95 fn
->bufsize
= AMP_CHUNK_SIZE
;
96 fn
->buf
= para_malloc(fn
->bufsize
);
100 * The init function of the amplify filter.
102 * \param f Pointer to the struct to initialize.
104 void amp_filter_init(struct filter
*f
)
106 struct amp_filter_args_info dummy
;
108 amp_cmdline_parser_init(&dummy
);
110 f
->close
= amp_close
;
111 f
->convert
= amp_convert
;
112 f
->parse_config
= amp_parse_config
;
113 f
->help
= (struct ggo_help
) {
114 .short_help
= amp_filter_args_info_help
,
115 .detailed_help
= amp_filter_args_info_detailed_help