summaryrefslogtreecommitdiff
path: root/filter.c (follow)
Commit message (Collapse)AuthorAge
* Switch to SPDX identifiers.Andre Noll2026-03-17
| | | | | | | | Generated with sed -i 's|Copyright.*Andre Noll.*|SPDX-License-Identifier: GPL-2.0 */|g' *.c *.h followed by manually tweaking the result a bit. No license change intended.
* Improve filter documentation.Andre Noll2025-10-08
| | | | | | | | | | | | | | | This extends the top level doxygen comments of filter.c and filter.h and the documentation of para_filter(1)'s main function. The new text outlines how filters in general and para_filter(1) in particular set up their buffer tree nodes and register the corresponding tasks. We re-order the function declarations of filter.h so that they are grouped together. The previously undocumented write_int16_host_endian() is doxified using the _static_inline_ macro to prevent doxygen from excluding the documentation. On the other hand, most comments of filter.c are dedoxified, so that only the top level file comment and the documentation of the main function make it into the web docs. Everything else is too special to be useful there.
* Revamp the stdin/stdout API.Andre Noll2025-08-27
| | | | | | | | | | | | | | | | | | With the current API it is impossible to free the memory that was allocated by stdin_task_register() after schedule() returns. This commit replaces the APIs defined in stdin.h and stdout.h to remove the memory leaks which are inevitable with the old API. We also make struct stdin_task and stdout_task opaque because the API users (client.c, filter.c, recv.c and write.c) should not be able to manipulate the fields of these structures directly. The new stdout API differs from the new stdin API only in that stdout_new() needs an additional argument to let the caller pass in a pointer to the parent buffer tree node. Other than that, the APIs are symmetric. Use the opportunity to do the non-blocking dance in std{in,out}_new() and std{in,out}_free() rather than in the post-monitor functions. This way we may get rid of the silly ->must_set_nonblock_flag boolean of struct std{in,out}_task.
* Make struct sched private, introduce sched_new().Andre Noll2025-07-13
| | | | | | | | | | | | | | | | This moves the declaration of the structure from sched.h to sched.c because the information stored in this structure has almost no users outside of the scheduler core. As a result, the size of the structure is no longer known outside of sched.c. To initialize a scheduler instance, users now must call the new sched_new(), passing an alternative poll function if needed, We don't let applications set the default timeout anymore because the value is kind of arbitrary anyway and most users specified one second. So hardcode this as the default. Besides allocating the scheduler structure, sched_new() also initializes the task list and the poll function pointer. Thanks to these initializations, the two conditions of sched.c removed in this patch are never true.
* filter.c: Remove pointless variable and assignment.Andre Noll2025-07-12
|
* Fix (benign) memory leak at exit in para_filter.Andre Noll2025-07-12
| | | | We missed to free the filter-specific lopsub parse result.
* filter.c: Constify dummy variable.Andre Noll2025-05-28
| | | | | It needs to be non-static, but it may be const because the amp filter only reads the values of this array.
* filter.c: Remove unused status_item_list[].Andre Noll2025-05-28
| | | | para_filter does not need this at all, and never has, afaict.
* Merge topic branch t/build into masterAndre Noll2025-05-20
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A medium sized series for the build system which improves the way the git version string is stored in the executables and man pages. Subsequent patches of the series remove some warts from the makefile: we no longer use order-only dependencies and the .PRECIOUS target. The merge results in a conflict against the "remove regex include" commit 67388cd4fae0. This is trivial to resolve, though. * refs/heads/t/build: Doxify version functions. Doxify OV_EXCLUDE_STATIC_CALLBACKS #define. Makefile: Fix braino in tarball target. build: Remove superfluous dependency in Makefile.real. build: Remove the .PRECIOUS target. build: Improve clean targets. build: Get rid of directory order-only dependencies. build: Compile with -Wunused -Wall also on BSD. build: Revamp git versioning. build: Merge version.{c,h} into string.{c,h}.
| * build: Merge version.{c,h} into string.{c,h}.Andre Noll2025-03-25
| | | | | | | | | | | | | | | | | | This is a preparatory patch for the upcoming revamp of the git version script. The revamped script generates version.c, a file which is currently tracked by git. We can easily get rid of it (and of version.h) since all paraslash executables link in both string.o and version.o. So let's move the three small functions of version.c to string.c and their declarations from version.h to string.h.
* | Include regex.h from para.h.Andre Noll2025-05-19
|/ | | | Every .c file includes it anyway.
* Return from filter_setup() so callers can reset the terminal.Andre Noll2024-05-26
| | | | | | | | | | | | | | | | This function of filter_common.c calls exit(3) on errors. This is OK for para_filter and para_audiod, but not for para_play because there the function is called after readline has initialized the terminal for its own use. If the function calls exit(3), the terminal settings are not reset as they should have been. This can be observed for example on the attempt to open an mp3 file with an para_play executable that lacks mp3 support. This commit changes the function to return an error code instead and deals with the fallout in the three callers. Although play.c already had error checking for calls to filter_setup(), it still needs a minor tweak because we now have to deal with the fact that the filter and writer node don't exist in eof_cleanup().
* Merge topic branch t/overflow into masterAndre Noll2022-10-03
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This series implements a new memory allocation API which checks for overflows. The first part of the series just renames the main allocation functions. Later patches in the series implement allocators which take two size_t arguments (like calloc(3)) and check whether the multiplication overflows by employing the __builtin_mul_overflow() primitive supported by gcc and clang. This requires us to bump the lowest supported gcc and clang version. * refs/heads/t/overflow: build: Compile with -ftrapv. string: Introduce arr_zalloc(). string: Introduce arr_alloc(). string: Introduce arr_realloc() and check for integer overflow. string: Rename para_calloc() -> zalloc(). string: Rename para_malloc() -> alloc(). string: Overhaul para_strdup().
| * string: Introduce arr_alloc().Andre Noll2022-07-29
| | | | | | | | | | | | | | | | Change all callers of alloc() which pass a product of two integers as the allocation size to call the new function instead. This function aborts if the multiplication overflows. With arr_alloc() in place, alloc() reduces to a trivial wrapper which calls new arr_alloc() with the first argument equal to one.
| * string: Rename para_calloc() -> zalloc().Andre Noll2022-07-29
| | | | | | | | | | Reword the documentation a bit since the function has never been a wrapper for calloc(3). No code changes.
| * string: Rename para_malloc() -> alloc().Andre Noll2022-07-29
| | | | | | | | | | | | | | Just because it's shorter and matches the naming of the new allocators we are about to introduce. The bulk of this patch was created with sed -i 's/para_malloc/alloc/g' *.c *.h yy/mp.y
* | Rename ->{pre,post}_select methods to ->{pre,post}_monitor.Andre Noll2022-08-25
| | | | | | | | | | | | | | The word "monitor" is neutral and continues to be correct after the switch from select(2) to poll(2). Pure rename, nothing to see here.
* | sched: Use integer value for select timeout.Andre Noll2022-08-25
|/ | | | | | | | | | | | | This modifies the public struct sched so that users pass in the default timeout as an integer value in milliseconds rather than a struct timeval. This simplifies the code a little and eases the transition from select(2) to poll(2) because poll(2) also takes a plain integer for the timeout. Since para_select() of fd.c now calls ms2tv() to convert the timeout back to a struct timeval, all executables which link with fd.o must also link with time.o. This was not the case for para_mixer and para_audioc, so configure.ac needs to be adjusted accordingly.
* filter: Use lsu_merge_config_file_options().Andre Noll2018-04-22
| | | | | Straight forward conversion. We now set the loglevel only once, after the config file options have been merged.
* Shorten copyright notice.Andre Noll2017-09-22
| | | | | | | | | | | | | | | | | | | | | The GPLv2 line does not add any additional information, so drop it. This leaves a single line of legalese text for most files, which is about the amount of screen real estate it deserves. This patch was created with the following script (plus some manual fixups): awk '{ if (NR <= 5) { gs = gensub(/.*Copyright.* ([0-9]+).*Andre Noll.*/, "\\1", "g") if (gs != $0) year = gs next } if (NR == 6 && year != "") printf("/* Copyright (C) %s Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */\n", year) print }'
* Define status items in para.h.Andre Noll2017-07-21
| | | | | | | | | | | | | | | | | | | | | The only reason the status item enum and string array are defined in configure.ac is that upper case identifiers and lower case strings are not easy to do in cpp as it lacks toupper(). However, configure.ac is not the right place for defining C language constructs as the configure script should only check for installed packages. This commit moves the definition of the status item enum and array to para.h and modifies all users to use lower case for the item names. This was automated with a script which essentially did upper=${i^^} sed -i "s/\<SI_$upper/SI_$i/g" $files for each status item $i. Care has been taken to leave the order of the status items unchanged. This is important because the item numbers must be considered part of the API between server and client.
* Convert para_filter to lopsub.Andre Noll2017-03-26
| | | | | | | | | | | | | | | | Changes the semantics in case --filter is not given. We used to print an error, but it makes more sense to show the list of supported filters in this case. If no filters are given, we now print the list of available filters. A new function in filter_common.c, print_filter_list(), is introduced for this purpose. The manual page of para_filter has been extended to include an overall description of the command. The only error code of filter.c, E_NO_FILTERS, becomes unused and is removed.
* Convert filters to lopsub.Andre Noll2017-03-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This replaces the *_filter.m4 gengetopt files by the filter_cmd lopsub suite, where each filter is realized as a subcommand. Due to this change, para_filter needs to be linked with -llopsub. The filter structure is now stored in the user_data pointer provided by lopsub, allowing to get rid of the global filters[] array, the FILTER_ENUM macro and the corresponding enumeration constants. The removal of the ->goo_help member of struct filter makes this structure constant. Hence ->init() of struct filter can also go away. We still can tell whether a filter is supported by checking the user_data pointer: if it is NULL, the filter is unsupported. The new filter_supported() helper in filter_common.c is provided for convenience. Parsing of the filter command line options is now performed generically, and the ->parse_config() method is renamed to ->setup(), an optional function which is supposed to perform semantic checks and the one-time setup of the filter, if any. It is accompanied by ->teardown() which replaces ->free_config(). The conversion of the individual filters is easy since most filters have a simple syntax or take no arguments at all. The resample_filter, however, needs a different way to copy the wav parameters from the lopsub parse result to the wav parms structure. A suitable macro, LLS_COPY_WAV_PARMS is added to check_wav.h for this purpose. The old COPY_WAV_PARMS needs to stay until para_write, the only other user of the macro, has been converted as well. The section heading of the manual page has changed slightly, causing t0005 to fail. Hence this test needs a slight adjustment.
* Simplify the error subsystem, get rid of error2.[ch].Andre Noll2016-12-20
| | | | | | | | | | | | | | | | | | | | | | | | | | This commit removes error2.c and the surrounding infrastructure of the build system, getting rid of ~600 LOC. After the change there are no more subsystems for error codes, and we don't need to host-compile error2.c any more. Since all executables now contain the text of every error code, the change has some impact on the sizes of the (stripped) executables: Before: After: 64K para_afh 71K para_afh 43K para_audioc 47K para_audioc 256K para_audiod 259K para_audiod 64K para_client 71K para_client 39K para_fade 47K para_fade 141K para_filter 144K para_filter 51K para_gui 59K para_gui 252K para_play 255K para_play 97K para_recv 104K para_recv 227K para_server 230K para_server 60K para_write 67K para_write This increase in size is justified by the major simplification.
* filter: Make ->open() optional.Andre Noll2016-08-25
| | | | | | | | There is no need to force each filter to supply this method, so teach the three callers of ->open() to check for NULL pointers. The commit also fixes some trivial language issues in the documentation of ->open() and ->close().
* filter.c: Use EXIT_SUCCESS.Andre Noll2016-05-07
| | | | Trivial change, since POSIX requires EXIT_SUCCESS to be zero.
* Constify struct filter access and introduce filter_get().Andre Noll2016-01-10
| | | | | | | | | | This modifies all users of the filter API to not access the filter array directly. Instead all callers now obtain a const pointer to the filter structure through the new filter_get() accessor function. However, the filter array can not be made constant yet because the ->init methods modify the filter structure. This requires some casts in filter_common.c unfortunately.
* Update year in copyright headers.Andre Noll2015-01-12
| | | | | | | | | | | | | | | | Done with files=$(git grep -l 'Copyright (C) [0-9]\{4\}\(-2014\)* Andre Noll') sed --in-place= -e 's/Copyright (C) \([0-9]\{4\}\)-2014 Andre Noll/Copyright (C) \1 Andre Noll/1' $files In previous years we ran a similar script to set the second year in the range to the current year. This is kind of silly, so let's get rid of this useless information. This commit replaces "Copyright (C) A-B" by "Copyright (C) A" in all file headers, i.e. only the first year (A) is left in. Accurate information including time stamps for each change can be obtained from the git history.
* filter.c: Add documentation of stat_item_values[].Andre Noll2015-01-12
|
* doc: Change email address to maan@tuebingen.mpg.deAndre Noll2014-08-18
| | | | | | | | | | | | | | The mail server on systemlinux.org was down for more than a week lately, so let's use an alternative official address. This commit changes all maan@systemlinux.org addresses to maan@tuebingen.mpg.de. Most .c and .h files contain the email address in the copyright header, so they must all be patched. Three other files contain the address for a different reason: * README lists email and git, gitweb and home page URLs * configure.ac needs it for configure -h * version.c contains it for the -V option of all commands
* task_register() conversion: filter tasksAndre Noll2014-05-25
|
* task_register() conversion: stdin taskAndre Noll2014-05-25
| | | | | | This renames stdin_set_defaults() to stdin_task_register() and changes the function to register the stdin task. Before this patch, the task was registered in the callers.
* sched: Introduce alternative task API.Andre Noll2014-05-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the current implementation struct task is public so users of this structure can mess with internal scheduler details as they please. This has led to many bugs and questionable code in the past. This commit is the first step to overcome this design mistake. At the end of this patch series struct task can be made private to sched.c. This commit introduces the following new public functions: * task_register, * task_context, * sched_shutdown. It also adds the new public task_info structure which carries the information passed to the scheduler when a new task is registered. This structure will stay public while struct task will become private once all users have been converted. task_register() is supposed to eventually replace register_task(). The main difference of the two is that the new function returns a _pointer_ to a task structure which is allocated dynamically. Users are not supposed to look at the fields of this pointer directly. task_context() is a temporary helper which can be removed again at the end of the series. Its sole purpose is to return the context pointer which was passed at task register time as part of struct task_info. The final new function, sched_shutdown(), deallocates the task structures allocated during task_register() to cleanly shut down the scheduler after all tasks have terminated. All users need to be converted to the new API. This patch only converts the stdout task though. The other tasks will be converted in subsequent patches. The scheduler can tell if a task was registered using the new API by means of the new ->owned_by_sched bit of struct task. This boolean variable can also be removed after all tasks have been converted. Some users will need to query the exit status of a terminated task. Hence we keep all tasks on the task list after ->post_select() returned negative but call neither ->pre_select() nor ->post_select() any more for such tasks. This leads to the concept of zombie tasks.
* Change copyright year to 2014.Andre Noll2014-02-22
| | | | | | | | | This year, we're really on time. The changes in this patch were created by the following silly script: files=$(git grep -l 'Copyright (C) [0-9]\{4\}\(-2013\)* Andre Noll') sed --in-place= -e 's/Copyright (C) \([0-9]\{4\}\)-2013 Andre Noll/Copyright (C) \1-2014 Andre Noll/1' $files sed --in-place= -e 's/Copyright (C) 2013 Andre Noll/Copyright (C) 2013-2014 Andre Noll/1' $files
* Revamp ggo help.Andre Noll2013-06-13
| | | | | | | | | | | | | This adds usage and description fields to struct ggo_help and changes ggo_print_help() to optionally print these. The boolean detailed_help flag of ggo_print_help() is replaced by a bitmask which lets the caller specify what to print. Four pre-defined masks are used to print the normal help, the detailed help, the help for modules (receivers, filters, writers) and the detailed module help. The new macro DEFINE_GGO_HELP can be employed to create a struct ggo_help from a gengetopt structure.
* Introduce version.c to limit recompilation on version changes.Andre Noll2013-06-13
| | | | | | | | | | | | | | Currently version.h includes git-version.h which changes whenever a different commit is checked out or the working tree becomes dirty because a file has been modified. Consequently, all .c files that include this header must be recompiled in this case. To limit the number of recompilations, this commit introduces version.c, which contains functions that return the various types of the version string. It is now the only file that includes version.h, so only version.o must be rebuilt if git-version.h changes. This also adds the build date, OS and CC version to the version output.
* Make all commands print git version and improve version string.Andre Noll2013-06-13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently the format of the first line of the help output varies between executables, for example: para_afh git (0.4.12.12.g15a4: spectral gravity) para_audioc git This difference comes from the fact that para_afh has its own ->print_help method which uses the VERSION_SINGLE_LINE macro of version.h while para_audioc relies on gengetopt's help output. The latter uses the make variable PACKAGE_VERSION which gets initialized at configure time through the second argument in AC_INIT of configure.ac. This value is either the version number for or the string "git". It's a good thing to have the abbreviated git version encoded in all executables, so this commit changes the argument of gengetopt's --set-version to the git version string including the codename. With the patch applied, the output of all commands looks like this if --version was given: para_filter 0.4.12.12.g11d7 (spectral gravity) To make sure things stay consistent, the patch introduces the VERSION_SINGLE_LINE macro and changes all commands to use it instead of open coding the version string.
* Avoid unwanted log messages during startup.Andre Noll2013-06-13
| | | | | | | | | | | | | | | | | | | | Regardless of the given loglevel, para_recv currently prints log messages like these at startup: afh_init: initializing mp3 handler afh_init: initializing ogg handler afh_init: initializing aac handler afh_init: initializing wma handler afh_init: initializing spx handler afh_init: initializing flac handler That's because recv_init() is called before the command line arguments are parsed, so the loglevel has not been set at this point. Other programs have similar problems. Fix these problems by always setting the loglevel right after a parser has been called so that the init functions run *after* loglevel has been set.
* Don't check return value of command line parsers unnecessarily.Andre Noll2013-06-13
| | | | | | All gengetopt parsers except the one for para_client are generated without the --no-handle-error option, i.e. these parsers exit on errors. Hence it is pointless to check return values.
* Change copyright year to 2013.Andre Noll2013-03-25
| | | | Better late than never.
* para_filter: Call proper ->free_config method on shutdown.Andre Noll2012-11-25
| | | | | | | | | Currently we just free the conf struct. For some filters this not enough to deallocate all resources and therefore results in a memory leak. This leak is not serious though, since it does not affect para_audiod, and para_filter is about to exit anyway at this point. Fix it anyway.
* btr: Remove btr_free_node().Andre Noll2012-07-08
| | | | | | | | | This has turned out to be source for bugs. Deallocate everything in btr_remove_node() hence making removing the node and freeing its resources an atomic operation. To avoid dangling pointers to freed btrn nodes, the argument of btr_remove_node() is changed to to struct btr_node **btrnp.
* Change year in copyright message to 2012.Andre Noll2012-01-07
|
* Always include stdbool.h.Andre Noll2011-12-18
| | | | | | | | | This adds the #include statement for stdbool.h to para.h. This allows to get rid of the individual includes in *.c. More importantly, since all *.c files include para.h, booleans will now be available everywhere so that we won't need to touch dozens of files anymore whenever a boolean is added to a public structure.
* sched: Allow more than one running scheduler instance.Andre Noll2011-11-20
| | | | | | | | | | | | | | | | The interactive completion code must be able to run a second, independent scheduler instance for generating the possible completions. This is currently not possible because the pre_select and post_select list heads of the scheduler are defined globally in sched.c. This patch moves these list heads from sched.c to struct sched. This leaves only the global "now" variable in sched.c, but it is OK to update this from all scheduler instances, so it can stay. Moving the two list heads to struct sched requires that several public functions, among them register_task(), grow an additional parameter. The (mostly trivial) changes that update all callers to provide the new argument make the patch rather invasive, unfortunately.
* Fix git-version file creation.Andre Noll2011-03-05
| | | | | | | | | | | | | | | | | | | | | | | | ATM, this does not work well, since only the executables depend on GIT-VERSION-FILE, but relinking these does not take into account the new contents of GIT-VERSION-FILE. Hence a "make clean" is necessary to produce executables that reports the correct version number. This patch changes GIT-VERSION-GEN so that it generates a preprocessor define instead of setting a Makefile variable. This value is written to stdout in any case and also to the file named "$1" if an argument was given and the current git version differs from the contents of this file (or if the file does not exist). In order to not have to recompile everything on version changes, the macros related to versioning are moved from para.h into the new version.h file which is included only where necessary. Makefile.in no longer uses phony targets to include the GIT_VERSION variable. Instead we simply execute $(shell ./GIT_VERSION_FILE version.h) at the top of the Makefile.
* Replace 2010 in copyright message by 2011.Andre Noll2011-01-17
|
* Change year in COPYRIGHT to 2010.Andre Noll2010-04-05
| | | | Hey, this is earlier than last year :)
* Introduce btr_node_description.Andre Noll2010-01-14
| | | | | | | | | As the number of arguments to btr_new_node() grows, the code becomes hard to read, especially since some callers must set many of the arguments to NULL. Using a pointer to a struct has the additional advantage that adding new parameters does no longer require to touch all callers.
* filter/audiod: Be nice to filters without close method.Andre Noll2010-01-12
|