ref: 7249d5febf377411ff6c1cf47ffaaa63954ca149
parent: 8d5de3e1ab2a9e0e85ace4a1a85d58055a7de730
author: qwx <[email protected]>
date: Tue Oct 31 23:29:58 EDT 2023
update manpage
--- a/cmd.c
+++ b/cmd.c
@@ -10,7 +10,6 @@
static int epfd[2];
-// FIXME: cursor moves too fast
static int
setright(char *s)
{
@@ -159,7 +158,6 @@
threadexits(nil);
}
-// FIXME: make sure writes complete even after exit
static int
pipeline(char *arg, int rr, int wr)
{
--- a/pplay.man
+++ b/pplay.man
@@ -4,32 +4,31 @@
.SH SYNOPSIS
.B audio/pplay
[
-.B -Dbc
+.B -bc
] [
-.B pcmfile
+.B pcmfiles..
]
.SH DESCRIPTION
.I Pplay
-is a PCM audio player which displays a time-domain graphical plot of the data
-and allows for some simple editing operations.
-It operates on the same raw format used by the audio device (see
+is a PCM audio player displaying a time-domain graphical plot of the data
+and allowing for some simple editing operations
+or piping to/from external programs.
+It operates on raw PCM audio, the same format used by the audio device (see
.IR audio (3)).
.PP
-At startup, all input is loaded in its entirety into memory,
-either from
-.B pcmfile
-if provided, or from standard in.
-It then writes samples to
-.BR /dev/audio ,
+All input is fully loaded into memory,
+either from one or more input files
+.BR pcmfiles ,
+or from standard in if run without arguments.
+It loops through the entire buffer or a selected portion forever,
+writing samples to
+.B /dev/audio
unless
.B -c
is specified.
.SS "Command line parameters"
-.TF "-D"
+.TF "-b"
.TP
-.B -D
-Turn verbose debugging info on immediately
-.TP
.B -b
Use inverted colors (dark background)
.TP
@@ -45,7 +44,7 @@
Quit
.TP
.B D
-Toggle debug tracing and draws
+Toggle drawing cut/insert positions in the buffer
.TP
.B S
Toggle stereo display (default left channel only)
@@ -100,8 +99,8 @@
.I Pplay
loops indefinitely an interval referred to as the
.IR dot .
-The dot is simply the start and end loop points,
-by default the data's start and end.
+The dot is simply the start (left) and end (right) loop points,
+by default the data's beginning and end.
The current playback position within it is refered to as the
.IR cursor .
The dot is set using the middle mouse button and with respect to the cursor:
@@ -109,9 +108,9 @@
if to the right, the right loop point is set.
The cursor is set with the left mouse button
and may never escape the dot.
-The last left mouse click is saved as the
+The last left mouse click is referred to as the
.I anchor
-point, used in editing.
+point.
Dot, cursor and anchor are indicated
by distinctly colored vertical lines.
.SS "Display"
@@ -127,7 +126,7 @@
The first value is the
.IR period ,
or number of samples per vertical pixel column.
-The next fields are offsets from the start of the data
+The next fields are offsets from the beginning of the data
given in the form
.IR [hh:mm:ss.tt]\ (samples) ,
where the first part is in time format (see
@@ -137,7 +136,7 @@
If set, either the dot or only the anchor follow it.
.SS "Editing"
Commands:
-.TF "r file"
+.TF "L sample"
.TP
.BI <\ cmd
Pipe output of a shell command into dot
@@ -148,6 +147,17 @@
.BI |\ cmd
Pipe dot to a shell command
.TP
+.BI L\ sample
+Set left bound/loop point to
+.I sample
+.TP
+.BI R\ sample
+Set right bound/loop point to
+.I sample
+.TP
+.B U
+Redo an edit and restore dot
+.TP
.B c
Set snarf buffer to the contents of the dot
.TP
@@ -154,14 +164,20 @@
.B d
Cut dot, replacing snarf buffer
.TP
+.BI j\ sample
+Jump and set current position to
+.I sample
+.TP
.B p
Paste snarf buffer into dot or insert at the cursor
.TP
.BI r\ file
-Read file into dot or at the cursor
+Read
+.I file
+into dot or at the cursor
.TP
.B s
-Show dot by piping it to a new
+Replicate dot by piping it to a new
.IR pplay (1)
instance
.TP
@@ -169,7 +185,8 @@
Undo an edit and dot change
.TP
.BI w\ file
-Write dot to file
+Write dot to
+.I file
.TP
.B x
Crop to dot (exclusive cut); does
@@ -183,39 +200,38 @@
and all following text is used as an arguments list.
.PP
Editing is performed upon a range or at a position:
-the dot if a bound is set, or the anchor if iet is set, or the entire data.
+the dot's range if the left or right bound is set, else at the anchor if it exists, else on the entire data.
.PP
-Operations are entirely decomposable into a series of one or more
-insertions or deletions
-.RI ( indels ).
-Insertions place new data at an offset from the start,
-either the left bound of the dot or the anchor.
-Deletions act upon a range, either the dot or the entire data.
-The
+Behavior depends on the dot.
+If a left or right bound is set,
+inserts replace the range and deletions delete it.
+Otherwise, if an anchor point exists,
+insertion inserts a buffer at its position
+while deletion is disallowed.
+If nothing is set,
+insertion replaces the entire buffer,
+and deletion is also disallowed.
+.PP
.BR < ,
-.BR r ,
+.BR r\ (read),
and
-.B p
-commands either insert new data at the anchor point,
-or replace the contents of the dot.
-In the latter case, two operations occur, first to delete the dot,
-then to insert the new data.
+.BR p\ (paste)
+insert data from an external command or the copy buffer,
+following the rules above.
.PP
The
-.B u
-(undo) command reverts a single indel and restores the dot as it were before.
-Compound operations are not undone in one go.
-For example, undoing a paste/replace command will require two commands.
-.I Undo
-is not infinite and there currently is no
-.I redo
-command.
+.BR u\ (undo)
+command reverts a single indel and restores the dot as it were before,
+and
+.BR U\ (redo)
+similarly replays the last action that was undone.
+Undo is infinite.
.PP
Commands
.BR < ,\ ^\ and\ |
-need a valid
+require a valid
.IR rc (1)
-expression, which is then passed uninterpreted.
+expression, passed uninterpreted (quoting is unnecessary).
In other words, expressions such as:
.IP
.EX
@@ -222,13 +238,13 @@
| stretch -r1.2 | norm -f 2 | audio/wavenc > seymourbutz.wav
.EE
.PP
-will be passed as a single string to and evaluated in a subshell,
+are passed as a single string and then evaluated in a subshell,
with the dot written to its standard in.
.I Pplay
does not handle any subprocess' abnormal exits in any way.
.PP
File i/o commands
-.BR r ,\ w
+.BR r\ and\ w
prompt for a pathname which is also uninterpreted.
Consequently, commands and i/o may fail once actually executed;
in case
@@ -235,6 +251,12 @@
.I pplay
was reading from a file or pipe,
the partial content already loaded will not be discarded.
+External commands launched from within
+.I pplay
+.B are not
+interrupted on exit,
+causing it to appear stuck.
+Multiple commands may run concurrently.
.SS Memory management
No data loaded into memory is ever freed unless it can be
guaranteed to never be used again.
@@ -244,6 +266,8 @@
However, memory is never duplicated.
Therefore, it is dangerous to load large amounts of data,
but once loaded, memory usage will not grow much.
+The maximum size of a single buffer is bound by the limits of
+.IR malloc (2).
.SH EXAMPLES
Use
.IR play (1)
@@ -261,18 +285,15 @@
.I Pplay
first spawned on 9front (October, 2017), beyond the environment.
.SH BUGS
-Undo is still unreliable.
-.PP
-Drawing halts while playback is paused.
-.PP
-Mousing, in particular for panning, can be uncomfortable or annoying.
-.PP
-There are no safeguards against races when writing to file.
-.PP
-The data structure implementation underlying the editing commands
-is, despite much effort to the contrary, still prone to off-by-ones
-and other bugs.
+Undo may irreversibly duplicate buffer contents,
+and there are still some issues with what is used as a dot
+when replacing content.
Trust, but save often.
+.PP
+An external command that never exits will freeze
+.I pplay
+forever on exit due to the reliance on
+.BR thread (2).
.PP
Any unintended interruption in playback due to scheduling,
or slower than instaneous redraws, are considered bugs,