The script checks for SoX, padsp and otherwise ruby. It allows one to pass in args: each one is first checked to be a readable file and if it is it'll be processed as a file; otherwise it'll be processed as a string. If no arg is specified it runs the program on twinkle.abc and the strings ABC and CDEFGABc (the latter suggested by the author). If none of the three tools noted above are installed it tells the user to install one of them first. I was not able to test the padsp(1) one but the invocation matches the author's remarks. /dev/dsp seems to not be installed in modern linux systems so it would be useful to have padsp(1) if not SoX (which is preferable in general for entries that play sound). The ruby script wavify.rb provided by the author is the last resort which turns the output to a WAV file.
117 lines
4.1 KiB
Bash
Executable File
117 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# try.sh - demonstrate IOCCC winner 2013/endoh3
|
|
#
|
|
|
|
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
|
|
# this way allows us to have the user specify a different compiler in an easy
|
|
# way.
|
|
if [[ -z "$CC" ]]; then
|
|
CC="cc"
|
|
fi
|
|
|
|
make CC="$CC" all >/dev/null || exit 1
|
|
|
|
# clear screen after compilation so that only the entry is shown
|
|
clear
|
|
|
|
# Because there are numerous ways to run this entry we check for different tools
|
|
# being installed in order to determine how to proceed. Even so /dev/dsp seems
|
|
# to be uninstalled in modern systems so we check for what the author suggested
|
|
# with that but only if the other options won't work (like SoX not installed).
|
|
#
|
|
SOX="$(type -P sox)"
|
|
PADSP="$(type -P padsp)"
|
|
RUBY="$(type -P ruby)"
|
|
|
|
endoh3()
|
|
{
|
|
if [[ "$#" -ne 1 ]]; then
|
|
echo "$0: endoh3() requires one arg, got: $#" 1>&2
|
|
return
|
|
fi
|
|
if [[ -f "$1" && -r "$1" ]]; then
|
|
if [[ -n "$SOX" ]]; then
|
|
echo "$ cat $1 | ./endoh3 | $SOX -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio" 1>&2
|
|
read -r -n 1 -p "Press any key to continue: "
|
|
echo 1>&2
|
|
# The author suggested the form below and it simplifies the command
|
|
# as well so we disable the supposed useless cat (there are no
|
|
# useless cats).
|
|
#
|
|
# SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
|
|
# https://www.shellcheck.net/wiki/SC2002
|
|
# shellcheck disable=SC2002
|
|
cat "$1" | ./endoh3 | "$SOX" -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio
|
|
echo 1>&2
|
|
elif [[ -n "$PADSP" ]]; then
|
|
echo "$ cat $1 | ./endoh3 | $PADSP tee /dev/dsp > /dev/null" 1>&2
|
|
read -r -n 1 -p "Press any key to continue: "
|
|
echo 1>&2
|
|
# The author suggested the form below and it simplifies the command
|
|
# as well so we disable the supposed useless cat (there are no
|
|
# useless cats).
|
|
#
|
|
# SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
|
|
# https://www.shellcheck.net/wiki/SC2002
|
|
# shellcheck disable=SC2002
|
|
cat "$1" | ./endoh3 | "$PADSP" tee /dev/dsp > /dev/null
|
|
echo 1>&2
|
|
elif [[ -n "$RUBY" ]]; then
|
|
echo "$ cat $1 | ./endoh3 | $RUBY wavify.rb > $1.wav" 1>&2
|
|
read -r -n 1 -p "Press any key to continue: "
|
|
echo 1>&2
|
|
# The author suggested the form below and it simplifies the command
|
|
# as well so we disable the supposed useless cat (there are no
|
|
# useless cats).
|
|
#
|
|
# SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
|
|
# https://www.shellcheck.net/wiki/SC2002
|
|
# shellcheck disable=SC2002
|
|
cat "$1" | ./endoh3 | "$RUBY" wavify.rb > "$1".wav
|
|
echo "Now try playing $1.wav in a program that plays WAV files." 1>&2
|
|
echo 1>&2
|
|
else
|
|
echo "Please install either SoX, ruby or padsp (from PulseAudio)." 1>&2
|
|
exit 1
|
|
fi
|
|
else # no file
|
|
if [[ -n "$SOX" ]]; then
|
|
echo "$ echo $1 | ./endoh3 | $SOX -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio" 1>&2
|
|
read -r -n 1 -p "Press any key to continue: "
|
|
echo 1>&2
|
|
echo "$1" | ./endoh3 | "$SOX" -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio
|
|
echo 1>&2
|
|
elif [[ -n "$PADSP" ]]; then
|
|
echo "$ echo $1 | ./endoh3 | $PADSP tee /dev/dsp > /dev/null" 1>&2
|
|
read -r -n 1 -p "Press any key to continue: "
|
|
echo 1>&2
|
|
echo "$1" | ./endoh3 | "$PADSP" tee /dev/dsp > /dev/null
|
|
echo 1>&2
|
|
elif [[ -n "$RUBY" ]]; then
|
|
echo "$ echo $1 | ./endoh3 | $RUBY wavify.rb > $1.wav" 1>&2
|
|
read -r -n 1 -p "Press any key to continue: "
|
|
echo 1>&2
|
|
echo "$1" | ./endoh3 | "$RUBY" wavify.rb > "$1".wav
|
|
echo "Now try playing $1.wav in a program that plays WAV files." 1>&2
|
|
echo 1>&2
|
|
else
|
|
echo "Please install either SoX, ruby or padsp (from PulseAudio)." 1>&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
if [[ "$#" -lt 1 ]]; then
|
|
# if we have no arg just run endoh3 with twinkle.abc and the string ABC.
|
|
endoh3 twinkle.abc
|
|
endoh3 ABC
|
|
endoh3 CDEFGABc
|
|
else
|
|
# otherwise while we have an arg run endoh3 on it as a file or string
|
|
while [[ "$#" -gt 0 ]]; do
|
|
endoh3 "$1"
|
|
shift 1
|
|
done
|
|
fi
|