summaryrefslogtreecommitdiff
path: root/write_common.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 writer documentation.Andre Noll2025-10-08
| | | | | File comments for write.[ch], the usual cleanups and dedoxification and the improved comment for main() of write.c.
* Fix off-by-one in writer_get().Andre Noll2025-09-03
| | | | Writer numbers start at one, so zero is an invalid writer ID.
* Remove ->execute() of struct writer.Andre Noll2025-06-25
| | | | No writer implements this method.
* Include regex.h from para.h.Andre Noll2025-05-19
| | | | Every .c file includes it anyway.
* 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: 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.
* Teach writers to abort gracefully on early EOF.Andre Noll2021-10-21
| | | | | | | | | | | | | | | | | | | | For very short streams it may happen that the receiver and decoder unregister themselves from the buffer tree before the writer had a chance to query the information from the decoder which it needs to open the audio device. This leads to errors such as Aug 25 14:24:51 schubert (5) get_btr_value: cmd sample_rate: Operation not supported Aug 25 14:24:51 schubert (5) get_btr_value: cmd channels: Operation not supported Aug 25 14:24:51 schubert (5) get_btr_value: cmd sample_format: Operation not supported Aug 25 14:24:51 schubert (4) alsa_init: channels count not available: Invalid argument This may happen with all receivers, audio formats and writers, although it is most common with ogg streams. This commit changes get_btr_sample_rate() and friends to return a standard error code rather than assuming success. The alsa, ao and oss writers are patched to check the return value and fail gracefully if one of these functions fails.
* 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 }'
* Convert writers to lopsub.Andre Noll2017-03-26
| | | | | | | | | | | | | | | | | | | | | Similar to the previous commits for receivers and filters, this commit replaces the five gengetopt parsers for the alsa, ao, file, oss, osx writers by a lopsub suite and links para_write with -llopsub. This allows to get rid of the WRITER_ENUM and the writers array as a reference to each writer structure are stored in the lopsub user_data pointer. Moreover, ->init(), ->parse_config(), ->free_config() and ->ggo_help() of struct writer are not needed any more and can be removed. The patch also removes write_common.h and moves the few prototypes write.h. Now that receivers, filters and writers have all been converted, we may also stop to include ggo.h from audiod_command.c and play.c. As for the receivers and filters, t0005 needs slight adjustments due to the new section header in the man page.
* 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.
* 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: writersAndre Noll2014-05-25
|
* 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
* Add some missing includes.Andre Noll2014-02-22
| | | | | | | | | | | | Letting .c files include their "own" header file guarantees that the declaration in the header file stays in sync with the definition. Eventually we may even enable gcc's -Wmissing-declarations, but we're not there yet, mainly due to command handlers, init functions and completers. Note that including signal.h in signal.c required two other includes since the header file defines a task structure.
* Provide "purpose" texts.Andre Noll2013-06-13
| | | | | | | | | | This text will be printed right after the program name in the --help output. For para_afh, the inline text becomes redundant, so this text is removed. Each executable gets a purpose text, and for receivers, filters, writers the purpose will be printed as part of the help output of para_audiod, para_filter. para_recv and para_write.
* 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.
* sched: Rename new_post_select back to post_select.Andre Noll2013-04-30
|
* sched: Kill old ->post_select variant.Andre Noll2013-04-30
| | | | It has no more users.
* sched: Provide alternative post_select variant.Andre Noll2013-04-30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Code which accesses the ->error field of another task has been a source of bugs in the past. This patch is a first step to make ->error private to sched.c. Currently the ->post_select() methods of all tasks are supposed to set ->error to a negative value to indicate that the task should be terminated, i.e. t->error being negative instructs the scheduler to not call t->pre_select() or t->post_select() any more in subsequent iterations. An equivalent way to achieve the same is to let ->post_select() return an error code instead. Benefits include * It reduces the use of ->error outside of sched.c * It's impossible to miss setting the error code * It simplifies code slightly Therefore we'd like to change the prototype of the ->post_select() methods from void (*post_select)(struct sched *s, struct task *t); to int (*post_select)(struct sched *s, struct task *t); Changes to struct sched affects many parts of the code base, hence converting all users at once would result in a very large patch. Therefore we temporarily introduce an additional ->new_post_select() method according to the second declaration above. The scheduler calls the new method if it is defined and falls back to the old variant otherwise. This approach allows to switch over one task after another without breaking things. This patch introduces the infrastructure just described and switches over the http receiver. Subsequent commits will change all other tasks in the same way. After all tasks have been switched over we can get rid of the old ->post_select variant and rename ->new_post_select() back to ->post_select().
* Change copyright year to 2013.Andre Noll2013-03-25
| | | | Better late than never.
* write: Get rid of gengetopt's string parser.Andre Noll2012-08-27
| | | | | | | | | | | | | It causes gengetopt to generate quite some additional code for the string parsers of all writers. Moreover, this string parser is inferior to create_argv() and create_shifted_argv() of string.c as gengetopt's parser does not honor any quoting at all. This commit changes the signature of the ->parse_config_or_die method of struct writer to take an (argc, argv) pair instead of a string. All writers can thus call the vanilla command line parser of gengetopt. The single user in write_common.c now calls ->parse_config_or_die() with an (argc, argv) pair obtained from create_shifted_argv().
* 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.
* write_common: Make check_writer_arg() exit on syntax errors.Andre Noll2011-08-13
| | | | | | | | | | | | | | | This function parses the argument of the --writer option to extract the name of the writer, which is the first word of the argument. If this word is not the name of a supported writer, the function returns NULL to indicate that the given writer does not exist. Otherwise check_writer_arg() calls the ->parse_config_or_die method of this writer which parses the remaining part of the argument and exits on errors. It is more consistent and simpler to let this function exit also in case the writer was not found. This simplifies the callers a bit since they do not have to check the return value any more. It also allows to kill E_WRITE_COMMON_SYNTAX.
* Move setup_writer_node() from write_common.c to write.c.Andre Noll2011-08-13
| | | | | This function is only called from write.c, so move it there and make it static.
* doxygen: Add some missing documentation.Andre Noll2011-05-15
|
* Replace 2010 in copyright message by 2011.Andre Noll2011-01-17
|
* Merge branch 't/writer_cleanups'Andre Noll2010-12-05
|\
| * writers: Kill ->open.Andre Noll2010-11-23
| | | | | | | | | | Now that ->open is a dummy function for all writers, we may safely remove this method from struct writer and kill the dummy functions.
| * Change the ->open method of writers to void.Andre Noll2010-11-23
| | | | | | | | | | These methods always succeed. Add missing documentation of the public register_writer_node() function while we're at it.
| * write_common: Remove check which is never true.Andre Noll2010-11-23
| | | | | | | | | | | | All writers have a config parser. This check was bogus anyway: If there was a writer without config parser and we call it without arguments (i.e. "c" is NULL), this would lead to a NULL pointer dereference.
| * write: Simplify config parsers.Andre Noll2010-11-23
| | | | | | | | | | | | These functions all call the gengetopt parser which aborts on errors. It is therefore pointless to check the return value. Document this fact and make it explicit by renaming ->parse_config of struct writer to ->parse_config_or_die().
* | write_common: Don't abort if btr_exec_up() failed.Andre Noll2010-11-28
|/ | | | | | | | | | | btr_exec_up() failure is unusual but possible if the upper btr node dies just in the right moment. It happened for an aac file due to another bug in the fecdec filter (fixed in a subsequent patch) which caused the fecdec and hence the aacdec btr nodes to unregister themselves due to a full buffer tree pool. So replace the assertion by a fat error message. This sets the sample rate, channel count and the sample format to zero which makes the writer unregister itsself. This is better than aborting.
* Fix typo in write_common.h.Andre Noll2010-08-01
| | | | This makes doxygen happy again.
* write: Support audio formats != 16 bit little endian.Andre Noll2010-07-13
| | | | | | | | | | | | | | | | This adds the new --sample_format option to para_write and teaches the check_wav_task to read the sample format from the wav header rather than assuming 16 bit little endian. The alsa, oss and osx writers all ask the upper buffer tree nodes for the current audio format. For para_write the check_wav task answers this query by using the value given at the command line, looking at the wav header, or using 16 bit little endian as the default answer. For para_audiod, the current decoder answers this query. In this case the audio format is either 16 bit little endian or 16 bit big endian, depending on the endianness of the machine.
* write: Make get_btr_value() return void.Andre Noll2010-07-13
| | | | | | | | | | Asking upper buffer tree nodes for the sample rate and the channels count should never fail, because the writer only asks if there is already some output data to process. So, replace the tests by assertions, change the return value of get_btr_value() to void and fix up all callers accordingly. This simplifies the code a bit.
* Cosmetics: Rename samplerate to sample_rate.Andre Noll2010-07-13
| | | | | A subsequent patch will introduce sample_format which looks much nicer than sampleformat. So let's use the underscored variant throughout.
* 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.
* Skip btr suffix from {pre,post}_select_btr().Andre Noll2010-01-13
| | | | | Everything uses btr now, so there's no need for a suffix any more. Update the documentation a bit.
* Kill unused writer_node_group code.Andre Noll2010-01-13
|
* Switch audiod over to the buffer tree API.Andre Noll2010-01-07
| | | | Still a bit rough and there are too many btr merges.
* Add get_btr_samplerate() and get_btr_channels().Andre Noll2010-01-05
| | | | These are needed by more than one writer.
* Introduce btr_node_status() and add btr support to the file writer.Andre Noll2010-01-05
|
* Introduce prepare_writer_node().Andre Noll2010-01-04
| | | | Unused yet.
* write_common: Introduce and use setup_writer_node().Andre Noll2009-12-31
| | | | This makes para_write with no options work again.
* Add execute handler to struct writer.Andre Noll2009-12-31
|