Commit Graph

102 Commits

Author SHA1 Message Date
Leah Rowe 48e949263b switch spkmodem_decode back to spkmodem_recv
this version is more tested. i'll merge _decode back
once it's better tested. it contains a lot of invasive
changes, whereas recv is much closer to the original GNU
code that i inherited, that i also know works quite well.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-21 19:11:45 +01:00
Leah Rowe 30d5ca5146 rename util/spkmodem-recv to spkmodem-decode
it's no longer resembling the original util at all,
so a rename seems indicated. yes.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:49:05 +00:00
Leah Rowe a31cfa4592 add missing star
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:49:05 +00:00
Leah Rowe cefae03502 util/spkmodem-recv: extensive commenting
and with this, i'm now pretty much done modifying grub's
crappy code. this experiment started in 2023 has now
pretty much concluded.

the original GNU code was poorly written, hardcoded
everywhere, and not documented or commented at all.

i had to learn what the code is doing through inference
instead, and i'm pretty sure that these explanations
cover everything. i hope?

maybe the frenchman can explain anything i missed. haha.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:49:01 +00:00
Leah Rowe 78d583e5ec util/spkmodem: explain what the defines are
and calculate some of them instead of hard coding

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:47:55 +00:00
Leah Rowe 2a32e498c8 useful comments
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 20:06:23 +00:00
Leah Rowe 8ccaff0d8e util/spkmodem-recv: also cache sep_pos in decode
yet another optimisation for weaker compilers - but
some modern compilers may not optimise well for this
code either.

this reduces the amount of references to the struct,
which is very expensive (48000 times per second) on
very old CPUs.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 19:57:24 +00:00
Leah Rowe 9f41591a46 util/spkmodem-recv: optimise decode_pulse
the frame[] array is never actually used meaningfully.

that setting of frame[ringpos] on the decode_state is
only set here, but then the value isn't really used at
all. the entire size of the annay is used for sizeof
in print_stats, but then we can just declare that
manually. since we also know that this value never
changes, we can use a global define for the sizeof entry
in print_stats, thereby simplifying operation further

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 19:54:52 +00:00
Leah Rowe a7c69c3233 util/spkmodem-recv: clean up decode_pulse
make it easier to read by clearer variable naming.

this change also reduces memory accesses (fewer struct
dereferences - see: struct decoder_state), when using
much weaker/older compilers that don't optimise
properly. this, in the most active part of the code,
which is called.... 48000 times a second. peanuts on
modern CPUs, but on old (early 90s) CPUs it makes a
big difference.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 19:34:44 +00:00
Leah Rowe 3633878e1f util/spkmodem-recv: byte swap on big endian CPU
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 19:09:58 +00:00
Leah Rowe 594a5a02cd util/spkmodem-recv: remove errno define
may break on modern systems (macro)

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 18:45:32 +00:00
Leah Rowe 9375ecc6a4 add endianness check to spkmodem-recv
a bit dirty. should handle this at runtime.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 18:37:11 +00:00
Leah Rowe f7fc5b1651 util/spkmodem-recv: properly handle stdin err
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 18:34:43 +00:00
Leah Rowe a4f5061297 util/spkmodem-recv: code cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 07:13:42 +00:00
Leah Rowe 2479633368 util/spkmodem-recv: optimise pulse check
the last change was good, but this code, again,
has to do these calculations 48,000 times a second.

trivial on new computers. but now try it on a
computer from 1992.

we should try to make this as fast as possible :)

older compilers especially don't optimise these
checks. this patch shifts it to one subtraction and
one unsigned comparison, rather than checking less
than or greater than both. often used in... literally
exactly this type of program.

on a good compiler this will compile to an add, cmp
and conditional jump.

less readable, but the results (set 1 or 0) make it
pretty obvious what it does, after a few seconds.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:31:44 +00:00
Leah Rowe e23cecb496 util/spkmodem-recv: clearer pulse decoding
i turned this into abs() call earlier, but this isn't
obviously readable by some people.

make it absolutely clear what this does. also reduces
use of syscalls.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:28:34 +00:00
Leah Rowe 1d2ee1cabc util/spkmodem-recv: say what freq_sep/data are
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:25:24 +00:00
Leah Rowe fcecb1229e util/spkmodem-recv: add a usage function
replace the err call in getopt

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:22:25 +00:00
Leah Rowe 69fb0618cc util/spkmodem-recv: tidy up the getopt loop
more knf-compliant

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:20:09 +00:00
Leah Rowe 65a6205dab util/spkmodem-recv: allow short sample reads
fread() may return short reads, whereas the current
code assumes either EOF or a full read.

change if to a while. really, it's that simple.
just loop until it's done. i probably b0rked this
myself when refactoring the GNU code.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:17:09 +00:00
Leah Rowe 59f04eba9e util/spkmodem-recv: don't exit in print_stats
i treated ftell errors as fatal, but if fttell fails
with ESPIPE, and someone's using -d, the program may
exit immediately, even though there's no problem.

instead, skip printing the offset (basically no debug).

this fixes a bug that i introduced myself, when i forked
this code, because i added that error check; the GNU
code didn't have any check whatsoever.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:13:44 +00:00
Leah Rowe 9ac0331595 util/spkmodem-recv: buffer calls to fread()
we currently read small amounts of data with fread,
repeatedly, which is quite taxing on the CPU, on
very old systems.

48khz audio. 48000 calls to fread() per second?

yeah. let's optimise this.

performance now should be roughly O(1) in practise.
this and the other recent changes means no modulo
or division, reduced branching, memory memory roads,
and lots of buffering.

the buffering here is quite conservative, so the human
won't notice any difference. we're cutting the number
of times we call fread by a factor of several thousand,
but you'll still see text scrolling down pretty quick,
with minimal lag.

the old GNU code i forked was terrible at this.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 05:08:44 +00:00
Leah Rowe 2c3d0b5a3e util/spkmodem-recv: make new pulse calculation clearer
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:59:42 +00:00
Leah Rowe 62a496ec9e util/spkmodem-recv: tidy up pulse decoding
make it clearer about next/old, in the loop. this also
improves performance on older systems (cache the values
first, don't re-calculate)

again, this is GNU code. but you wouldn't know it, in my
current version. i forked this from GRUB several years
ago and started cleaning it for fun.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:55:18 +00:00
Leah Rowe 1953812efd util/spkmodem-recv: split up handle_audio()
the signal check should be its own function,
for clearer understanding

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:53:05 +00:00
Leah Rowe a31ccd8c3d util/spkmodem-recv: tidy up handle_audio
frame handling, error checks, pulse decoding and
character decoding are all jumbled up. this patch
separates them a bit, making it clearer.

should also help codegen. this tool is dealing with
high bandwidth text, which on slower computers may
be cumbersome. every optimisation counts.

not really relevant on newer systems.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:49:03 +00:00
Leah Rowe 44c6b453bc util/spkmodem-recv: optimise ring buffer pos calc
instead of computing next every time, just advance
two indexes. another performance optimisation on
older machines, especially old compilers, because
it reduces the amount of logical branching.

the old code was pretty much just advancing two
indexes in lockstep, when getting the next pulse,
but recalculating one of them based on the other,
each time.

this is yet another hangover from the old GNU code
that i forked three years ago.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:44:44 +00:00
Leah Rowe 54936a45a5 util/spkmodem-recv: don't use modulus on decode
it's slow on older compilers/systems that don't optimise.

instead, we branch (cheaper) and just do an above or
equal comparison), resetting appropriately or subtracting.

should yield an actually useful performance gain, on older
systems. a bit theoretical on modern systems, which optimise
well (modern compilers will produce assembly code much like
what the new C code is doing)

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:39:00 +00:00
Leah Rowe 19e0249a8a spkmodemrecv makefile: add -c to install
a bit pedantic. but that's my intention.

for backwards compatibility with older systems.

this flag means: create the directory. on modern
versions on all systems, it's the default behaviour.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:36:29 +00:00
Leah Rowe 72eed0b12c util/spkmodem-recv: further portability / cleanup
i used a bunch of global variables. that's gone.

added proper externs, including for errno. lots of
old unix systems require this. this version should
be perfectly polished and portable now.

all status is now handled in a struct, making the
code a bit easier to understand, because the variables
now are clearly pertinent to the state of the decoder,
rather than being seemingly random.

some indentation reduced.

also cleaned up ftell/feof usage again. the new code
is a bit more robust when dealing with piped input(which
is literally what this program takes, exclusively)

i started my cleanup of this tool from GNU GRUB in 2023.

i finished it today.

also the Openbsd pledge is more portable now (code made
to compile on pre-pledge openbsd as well)

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-12 04:30:40 +00:00
Leah Rowe bbb8825553 util/nvmutil: further clean up decode_pulse()
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:40:34 +00:00
Leah Rowe 42cad20ffd util/spkmodem-recv: tidy up frame decoding
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:34:43 +00:00
Leah Rowe bf9c4a67f8 util/spkmodem-recv: handle fread errors
also handle EOF condition and exit cleanly.

don't use dirty feof.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:30:22 +00:00
Leah Rowe 9195ff97b7 util/spkmodem-recv: fix getopt prototype
i use -pedantic and std=c90

also add the define

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:25:50 +00:00
Leah Rowe 62c0cc68c5 removed some unnecessary things
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:14:51 +00:00
Leah Rowe 361dbef41c another fix
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:13:33 +00:00
Leah Rowe 7af3015a89 tiny fix
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 23:12:27 +00:00
Leah Rowe 6962404ce5 util/spkmodem-recv: portability and code cleanup
borrowing recent improvements from nvmutil

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-11 22:39:16 +00:00
Leah Rowe a95cf1feeb util/spkmodem_recv: general code cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-02-19 12:21:35 +00:00
Leah Rowe e63fe256df util/spkmodem-recv: More correct Makefile
Set up the DESTDIR variable properly. Otherwise,
this is just style changes.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2025-01-03 02:09:55 +00:00
Leah Rowe 4cdf60e60a util/spkmodem-recv: detailed copyright history
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-10-17 13:55:20 +01:00
Leah Rowe b727f9666b util/: use SPDX license and copyright headers
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-09-25 02:49:34 +01:00
Leah Rowe b508245451 util/spkmodem-recv: rename function for clarity
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-14 08:43:54 +01:00
Leah Rowe 17cd0af9c1 util/spkmodem-recv: remove unnecessary error check
the loop in main() already checks EOF, and errno is
properly handled at the end of main()

we only need to call ferror(), to check error state

this fixes a bogus error message when pressing ctrl+D
to terminate the program, *which is the intended way
to terminate this program* (that, or EOF is reached
in any other another way)

do not treat intended behaviour as an error condition!

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 22:52:12 +01:00
Leah Rowe a1758a7ab0 util/spkmodem-recv: say cc, not gcc, in comment
i've build-tested this code with clang and that also
works. in practise, a user is going to have clang or gcc

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 22:35:34 +01:00
Leah Rowe 2b5727310c util/spkmodem-recv: fix bad comment
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 22:34:31 +01:00
Leah Rowe bd8b8919f9 util/spkmodem-recv: remove unnecessary assignment
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 22:29:34 +01:00
Leah Rowe 5be3d67ced util/spkmodem-recv: simplify getopt handling
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 21:01:15 +01:00
Leah Rowe 5c5c1c64fd util/spkmodem-recv: cleaner ring buffer handling
make it more obvious that this *is* a ring buffer being
handled, and make it more obvious when checking a pulse
in the next frame

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 20:47:17 +01:00
Leah Rowe f257eb6f9d remove errant file
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-06-13 12:11:56 +01:00