Andre Noll [Mon, 9 Aug 2021 18:05:10 +0000 (20:05 +0200)]
mp4: Use para_strdup().
Like malloc(), strdup() may fail. The current code does not always
check that. Using the paraslash wrapper avoids the issue and has the
additional benefit that para_strdup(NULL) does not segfault.
Andre Noll [Mon, 9 Aug 2021 17:43:36 +0000 (19:43 +0200)]
mp4: Use para_{c,m}alloc() to allocate memory.
With mp4ff being internal we can afford to just abort if allocations
fail (which is what the para_ wrappers do). This allows us to simplify
the code quite a bit.
The code used to cast the pointer returned from malloc(). This is
unnecessary, so drop these casts.
Andre Noll [Mon, 9 Aug 2021 17:10:46 +0000 (19:10 +0200)]
mp4: Simplify and rename mp4ff_read_sample_getsize().
The new code is much shorter. It is equivalent because the single
caller only checks whether the return value is less or equal then zero,
and does not use the return value in this case.
Andre Noll [Mon, 9 Aug 2021 16:43:44 +0000 (18:43 +0200)]
aac: Move declaration of mp4ff_set_sample_position() to mp4.h.
We used to provide the declaration of mp4ff_set_sample_position()
in aac_afh.c. With the internal mp4.c this is no longer necessary as
we may as well declare the function in mp4.h.
Remove the documentation since it has become stale.
Andre Noll [Sun, 8 Aug 2021 20:09:28 +0000 (22:09 +0200)]
mp4: Make non-public functions static.
It's generally a good thing to reduce the scope to the compilation
unit where possible. Static functions also reduce the number of
symbols and help the compiler to optimize the generated code.
Andre Noll [Thu, 21 Oct 2021 17:09:59 +0000 (19:09 +0200)]
mp4: Wire it in and make it compile cleanly.
This switches to our local copy of libmp4ff. The configure script
now turns on support for the aac audio format even if libmp4ff is
not installed.
Some changes to mp4.c were necessary to silence warnings, most of
which are trivial. The single notably non-trivial change is the missing
initialization of chunk_sample and chunk in mp4ff_chunk_of_sample().
Andre Noll [Sun, 8 Aug 2021 19:13:41 +0000 (21:13 +0200)]
Provide our own copy of libmp4ff.
This library was removed from the faad repository in 2017. This
commit put everything we need from the libmp4ff code base into the
new mp4.c and mp4.h files. All content was taken unmodified from
commit 1cf5a505daf0 of the faad2 repo, the last commit that contains
the library.
The code needs a lot of cleanup and does not compile without warnings.
We commit it as-is to track what exactly has been copied from
libmp4ff. The new mp4.c has not been included into the build system,
however, so this commit has no effect yet.
It is broken because the recipe for the .d files does not honor
CPPFLAGS since we only modify the CPPFLAGS variable for the .o
targets. Adding the corresponding .d targets would be too ugly,
so revert the commit for now until a better solution has been found.
Andre Noll [Mon, 14 Mar 2022 21:28:27 +0000 (22:28 +0100)]
Makefile: Fix compilation after header removal.
When switching from an older git version which still contains some
header file to a newer version where it got removed, a .d file remains
in build/deps which lists the no longer existing header file as a
prerequisite. This causes the build to fail because the prerequisite
cannot be created. The problem can be worked around by removing the
stale .d file, for example by running make clean, but this is no real
fix, and is inefficient.
The root of the matter is that .d files depend on their .c counterpart,
but this dependency is not stated anywhere in the Makefile. Thus, we
need a rule for the .d target with the same prerequisites and the same
recipe as the object file target. GNU make supports multiple targets,
but the feature does not seem to work as advertised, regardless of
whether rules with independent targets or rules with grouped targets
(using the &: separator) are employed. Thus we bite the bullet and
use two separate rules.
We have to add at least one mood to trigger the bug. Since addmood is
a stdin command we must redirect stdin for the para_client command. It
does not hurt to do this for all commands, not just the new one.
Andre Noll [Wed, 16 Mar 2022 18:21:24 +0000 (19:21 +0100)]
Minor log severity adjustments.
Two small changes which improve the error output of para_audiod. The
first makes sure we get a message when hitting ctrl+c when audiod
is running in forground mode. The second decreases the severity of
the log message which is shown when a client connection terminates,
since this is not necessarily an error.
Andre Noll [Wed, 20 Oct 2021 19:13:58 +0000 (21:13 +0200)]
server: Early vss shutdown for command handlers.
Command must communicate with the vss through the shared memory area
(mmd). Deallocating all resources early in the command handler makes
the code more robust and saves some memory.
Andre Noll [Fri, 27 Aug 2021 13:12:34 +0000 (15:12 +0200)]
afh: Limit chunk numbers to 32 bit.
The number of chunks and the chunk offsets are stored in the audio
file table as 32 bit unsigned integers. Thus, chunk numbers and
sizes cannot exceed 2^32 - 1. Make this fact obvious by changing
the corresponding parameters of aac_afh_get_chunk() from size_t or
unsigned long to uint32_t.
Andre Noll [Wed, 9 Mar 2022 22:56:56 +0000 (23:56 +0100)]
audiod: Stop stream immediately when being switched off.
When para_audiod enters off/standby mode, we stop the receiver
but continue to filter and write data already received until the
input queue has drained. This can take several seconds, which may
be annoying.
To stop the stream immediately, stop the writer(s) rather than the
receiver. We still only stop the receiver when the server has paused
or stopped the stream because we don't want to discard any data in
this case.
Andre Noll [Sat, 19 Mar 2022 22:48:18 +0000 (23:48 +0100)]
vss: Reset afhi.chunks_total on eof.
Without this, the server can be crashed by running
para_client nomore # set the nomore flag
# wait for eof
para_client jmp 50 # set the repos flag, clear the next flag
para_client play # boom
The problem is that the command handler of the jmp command checks
afhi.chunks_total to determine if some audio file is currently
open. Since vss_eof() did not reset chunks_total, the command handler
wrongly believes that there is an open audio file, sets the repos
flag and clears the next flag. When streaming is resumed later, the
virtual streaming system attempts to access the chunk table which
was freed earlier in vss_eof().
Andre Noll [Thu, 17 Mar 2022 21:44:11 +0000 (22:44 +0100)]
afs.c: Improve documentation of callback_query.
It had some language issues and focussed too much on details rather than
explaining the big picture. The new text is shorter and should be much easier
to understand.
Andre Noll [Wed, 9 Mar 2022 21:43:26 +0000 (22:43 +0100)]
afs.c: Improve documentation of score table.
The text focussed on implementation details rather than describing the
purpose of the table. It was also slightly incorrect because playlists
also use the score tables, albeit in a much simpler way and without
"Gaussian normal distributions".
Andre Noll [Tue, 15 Mar 2022 20:33:03 +0000 (21:33 +0100)]
attribute.c: De-doxify static functions.
Because static functions don't need doxygen comments. The existing
comments for attribute_close() and attribute_open() did not contain
useful information, so remove these,
Andre Noll [Mon, 14 Mar 2022 18:52:46 +0000 (19:52 +0100)]
afs: Update dummy mood assumptions to reflect the reality.
The code in afs.c assumes that loading the dummy mood always succeeds,
and this is even documented in change_current_mood(). However, this
has never been true because we call into osl library functions which
may fail for various reasons. In particular, if the server is started
without a database the attempt to load the dummy mood fails because
the audio file table does not exist.
The current code was not prepared to handle this case, and does stupid
things like storing the negative error code in *num_admissible and
returning success.
Fix this confusion by adjusting the documentation and letting
activate_mood_or_playlist() fail early. One of its callers,
init_admissible_files(), needs also be adjusted because it asserted
in its error path that the mood which failed to load was not the
dummy mood.
This is a benign bug because the most common way to hit this is
at startup on a fresh install when the database does not exist. In
this case the caller, init_admissible_files(), ignores the negative
num_admissible value.
Andre Noll [Sun, 13 Feb 2022 20:29:03 +0000 (21:29 +0100)]
com_ls(): Drop "audio file table syntax error" messsage.
This error message is printed if ls is called with an invalid argument
for the listing mode or sort order. That's not a syntax error, so
use the standard EINVAL error code instead.
Andre Noll [Wed, 18 Aug 2021 14:44:15 +0000 (16:44 +0200)]
aac_afh: Be more lenient about zero sized reads.
These actually happen for example when the file contains a meta
tag with an empty string value. POSIX says that the read() function
shall return zero and have no other results, so don't return -1 if
the number of bytes read is zero.
Similarly, return zero if the file offset is beyond EOF.
Andre Noll [Sat, 12 Mar 2022 16:22:15 +0000 (17:22 +0100)]
Merge branch 'refs/heads/t/logo'
The fancy new svg logo and a couple of changes which streamline
the look of the web pages.
Cooking for a month.
* refs/heads/t/logo:
web: Add horizontal space between table columns.
web: Clean up style sheet.
web: Avoid bold face on main page.
web: Add padding to all pages.
web: Move navigation into top level table.
web: Link to "./index.html" rather than to ".".
web: Remove selected APIs page.
web: Avoid "integrated" in feature list of main page.
web: Shorten slogan.
web: The new logo for paraslash-0.7.
manual: Avoid vertical space between coding style items.
Andre Noll [Tue, 8 Mar 2022 22:37:08 +0000 (23:37 +0100)]
mood.c: Fix memory leak in change_current_mood().
In two error cases we return without freeing the bison mood parser
and the temporary array. Worse, in these cases we also expose the
partially loaded mood via the global current_mood.
The good news is that these errors should be "impossible" to trigger
in practice.
Andre Noll [Thu, 21 Oct 2021 19:48:24 +0000 (21:48 +0200)]
server: Loglevel adjustments for shutdown path.
The log output of the server is rather verbose with respect to
shutdown messages. These not only occur when the server exits but
also in command handler context each time a command is executed.
This patch quietens these messages in two ways. For some messages we
simply reduce the log level. For others we print the message only in
server context, i.e. when process_is_command_handler() returns false.
Andre Noll [Mon, 21 Feb 2022 14:52:42 +0000 (15:52 +0100)]
Merge branch 'refs/heads/t/sha256'
A couple of changes which start to eliminate the use of sha1 in favor
of sha256. This series is only the first step, though, as we need to
keep sha1 for the time being to provide backward compatibility.
Cooking for four months.
* refs/heads/t/sha256:
manual: Avoid sha1.
upgrade_db: Add copyright and purpose to upgrade_db.c.
web: Add link to the para_upgrade_db(1) man page.
afs: Switch to sha256 and change default database path.
Add para_upgrade_db.
Use sha256 for the challenge response.
Introduce hash2 (sha256).
Assume sideband and aes_ctr128 are always supported/requested.
Andre Noll [Thu, 25 Nov 2021 19:25:43 +0000 (20:25 +0100)]
audiod: Avoid delay in status transition from standby to on.
In close_receiver() we invalidate the current audio format value
to prevent the receiver from re-starting too quickly. See commit 2d61a8005c74 (audiod: Invalidate current audio format on close)
from seven years ago for details.
This invalidation happens in particular when the receiver is closed
because audiod was told to enter standby mode. If audiod is switched
back on shortly thereafter, no receiver can't be started because we
forgot the current audio format and must wait up to one minute until
the next status item dump arrives from the server which re-initializes
the current audio format value.
Fix this flaw by only invalidating the current audio format when
audiod operates in "on" mode.
Andre Noll [Sun, 14 Nov 2021 19:16:01 +0000 (20:16 +0100)]
web: Add horizontal space between table columns.
This tweaks the style sheet to make the rows of the tables easier to
read. It affects the topic list on the development page and the list
of files on the doxygen API page.
Andre Noll [Sat, 6 Nov 2021 20:31:59 +0000 (21:31 +0100)]
web: Link to "./index.html" rather than to ".".
When browsing the generated html locally, clicking the logo or the
about link may cause the browser to open the directory view, which
is annoying. This commit makes these links open the main page instead.
Andre Noll [Sun, 31 Oct 2021 22:07:06 +0000 (23:07 +0100)]
web: The new logo for paraslash-0.7.
This new svg logo was not made with a graphical editor but with a
plain text exitor. Unfortunately, ImageMagick is unable to create
a working .ico file from the svg source. Therefore we continue to
carry a manually created .ico file in the repo.
The new logo is less wide than the previous one, and it does not look
nice when it floats to the right side of its tabular cell. Fortunately
this can be fixed by removing some code from the style sheet.
Andre Noll [Sat, 4 Dec 2021 16:41:34 +0000 (17:41 +0100)]
manual: Avoid sha1.
The section on client-server authentication is no longer accurate
because it depends on the version of client and server whether sha1
or sha256 is used for authentication. Since the hash function is an
implementation detail which should not be mentioned in the manual,
let's avoid the term and talk about cryptographic hash functions
instead.
Andre Noll [Mon, 15 Nov 2021 18:31:41 +0000 (19:31 +0100)]
Merge branch 'refs/heads/t/list-cleanups'
A bunch of simple patches which streamline the macros and inline
functions of list.h which were taken from linux long ago without
adjusting the coding style.
Cooking for three months.
* refs/heads/t/list-cleanups:
list.h: Convert INIT_LIST_HEAD macro to inline function.
list.h: Fix parameter doc of iterators.
list.h: Move list_is_singular() up.
list.h: Rename argument of list_move().
list.h: Don't use "new" as an variable name.
list.h: Open-code LIST_POISON1 and LIST_POISON2.
list.h: Get rid of internal helpers.
list.h: Trivial cleanups.
list.h: Remove unused list_for_each_entry_safe_reverse.
Andre Noll [Thu, 4 Nov 2021 16:15:26 +0000 (17:15 +0100)]
paraslash 0.6.4
Another v0.6 release to mark the destination of the maint branch
which will now be fast-forwarded to this commit. Subsequent merges
of topic branches into master will incorporate incompatible changes,
so from now on the master branch should be regarded as pre-0.7.
Andre Noll [Thu, 4 Nov 2021 15:56:56 +0000 (16:56 +0100)]
paraslash 0.5.9
A final v0.5-release to record the tip of the maint branch when
paraslash-0.5 became EOL. Shortly after this commit the 0.6.4 release
will be drawn from master, and maint will be fast-forwarded to point
to the v0.6.4 commit.
Andre Noll [Tue, 26 Oct 2021 18:19:58 +0000 (20:19 +0200)]
string: Remove malloc attribute from para_realloc().
Quoting from the corresponding section of the gcc-10 manual:
This tells the compiler that a function is 'malloc'-like, i.e.,
that the pointer P returned by the function cannot alias any other
pointer valid when the function returns, and moreover no pointers to
valid objects occur in any storage addressed by P.
Using this attribute can improve optimization. Compiler predicts
that a function with the attribute returns non-null in most cases.
Functions like 'malloc' and 'calloc' have this property because they
return a pointer to uninitialized or zeroed-out storage. However,
functions like 'realloc' do not have this property, as they can return
a pointer to storage containing pointers.
Found by code inspection, the unpached code never caused problems.
Also, the function definition in string.c does not contain the
attribute.
Andre Noll [Sun, 5 Sep 2021 18:16:59 +0000 (20:16 +0200)]
Teach writers to abort gracefully on early EOF.
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.
Andre Noll [Fri, 13 Mar 2020 18:44:00 +0000 (19:44 +0100)]
afs: Switch to sha256 and change default database path.
This switches the hash column of the audio file table to use sha256
rather than sha1. Due to the preparations implemented in the previous
patches this is a mechanical conversion that could have been performed
by a script.
The only non-trivial thing is the rename of the audio file table
directory, which changes from "audio_files" to "audio-files" because
this is the name the conversion script introduced in the previous
commit picked.
Andre Noll [Fri, 6 Mar 2020 13:26:39 +0000 (14:26 +0100)]
Add para_upgrade_db.
This new executable is required to convert existing paraslash databases
to the new format. Only the layout of the audio file table changes
due to the switch from sha1 to sha256. The command creates and opens
a new audio file table and copies over each row, using an arbitrary
(incorrect) hash value for the values in hash column of the destination
table.
After all rows have been copied in this way, the old table is deleted
and the database directory is renamed from afs-database-0.4 to
afs-database-0.7, which will be the default path in paraslash-0.7.
Subsequent patches will modify para_server to load the database
from the new path and use sha256 instead of sha1 for the hash that
identifies the audio file. The user must then start the thusly patched
para_server and force-add all audio files to correct the hashes. This
approach keeps para_upgrade_db minimal and shortens its running time.
Andre Noll [Thu, 12 Mar 2020 22:13:17 +0000 (23:13 +0100)]
Use sha256 for the challenge response.
sha1 is broken and should no longer be used. This commit introduces
the new server feature "sha256". It is announced during the handshake
with the client. The client code is patched to detect whether the
server supports the feature and uses sha256 if it does.
This change is backwards compatible. That is, old clients can still
connect to a new server (using sha1). Also new clients can connect
to an old server (and also use sha1 in this case).
Andre Noll [Thu, 12 Mar 2020 15:06:12 +0000 (16:06 +0100)]
Introduce hash2 (sha256).
This adds a second hash function which will replace sha1. Both openssl
and libgcrypt support sha256, so it is easy to do. There are no users
of the new functions so far, so this patch has no effect yet.
Andre Noll [Thu, 12 Mar 2020 21:08:16 +0000 (22:08 +0100)]
Assume sideband and aes_ctr128 are always supported/requested.
Sideband connections and the AES-based stream cipher have become
mandatory in paraslash-0.6.
The server no longer needs to annouce the feature as 0.6.x clients
request it, regardless of whether it was announced or not. It needs
to still accept the option, though.
On the client side, we don't need to request the features any more
as the server just ignores the request.
Andre Noll [Tue, 5 Oct 2021 19:31:06 +0000 (21:31 +0200)]
client_common: Improve documentation of client_{pre,post}_select().
It was outdated and not worded very well. In particular, it referred
to a task pointer although the argument is named "context". Also,
client_open() does not return a "client data structure", so talk
about the effect of that function rather than its return value.