--rw-r--r-- M 0 rsc users  1124 Oct 10  2006 COPYRIGHT
--rwxr-xr-x M 0 rsc users   283 Oct 10  2006 Juke
--rw-r--r-- M 0 rsc users  3755 Oct 10  2006 README
--rw-r--r-- M 0 rsc users  8584 Oct 10  2006 acme.c
--rw-r--r-- M 0 rsc users  1499 Oct 10  2006 acme.h
--rw-r--r-- M 0 rsc users 21071 Oct 10  2006 ajuke.c
--rw-r--r-- M 0 rsc users   729 Oct 10  2006 aplay.c
--rw-r--r-- M 0 rsc users    25 Oct 10  2006 audio-FreeBSD.c
--rw-r--r-- M 0 rsc users  3396 Oct 10  2006 audio-Linux.c
--rw-r--r-- M 0 rsc users  3178 Oct 10  2006 audio-ssh.c
--rw-r--r-- M 0 rsc users   380 Oct 10  2006 audio.h
--rwxr-xr-x M 0 rsc users   328 Oct 10  2006 flacinfo
--rw-r--r-- M 0 rsc users    47 Aug 22 10:47 index.html
--rw-r--r-- M 0 rsc users  1867 Oct 10  2006 jukefmt.c
--rwxr-xr-x M 0 rsc users  3736 Oct 10  2006 jukeget
--rw-r--r-- M 0 rsc users 13767 Oct 10  2006 jukeindex.c
--rwxr-xr-x M 0 rsc users   202 Aug 22 10:47 jukeinfo
--rwxr-xr-x M 0 rsc users  1038 Aug 22 10:47 jukeplay
--rwxr-xr-x M 0 rsc users   277 Oct 10  2006 jukeput
--rwxr-xr-x M 0 rsc users   274 Oct 10  2006 jukesearch
--rwxr-xr-x M 0 rsc users    83 Oct 10  2006 jukesongfile
--rw-r--r-- M 0 rsc users  7078 Oct 10  2006 m4ainfo.c
--rw-r--r-- M 0 rsc users   861 Oct 10  2006 mkfile
--rw-r--r-- M 0 rsc users 10119 Oct 10  2006 mp3info.c
--rw-r--r-- M 0 rsc users  2556 Oct 10  2006 volume.c
--rw-r--r-- M 0 rsc users   626 Oct 10  2006 waitfor.c

This directory contains a collection of tools that
implement a music player for acme(1).  

Install on a plan9port system with

	mk install

Before running Juke, index your song files:

	mkdir -p $HOME/lib/jukedb
	jukeindex *.mp3 *.m4a

(replace the wildcards with real paths to your sound files).

Once you have indexed your songs, run Juke, which will
create an acme window named Juke/ that contains instructions
on using the browser.

There are two shell scripts you may need to customize to
your system: jukeinfo and jukeplay.  Jukeinfo is invoked by
jukeindex for each file name you specify.  It is expected to
print information about the music file, probably by invoking
a helper program like mp3info or m4ainfo.  See those programs
for the output format and field list.  Jukeplay is invoked to 
play the named file.  It must write the decoded audio to 
standard output, *not* to the audio device.  The audio must
be 44100 Hz, 16-bit stereo PCM.  A separate program 

Jukeinfo and jukeplay can handle MP3 and MP4 files with
extensions .mp3 and .m4a respectively.  Jukeinfo uses two
supplied programs mp3info and m4ainfo.  Jukeplay uses
madplay, faad, and flac.

Note that the programs cannot handle .m4p like you download
from iTunes.

The juke C programs never actually access the files,
so there's no need for them to be files at all.  You could
imagine changing jukeinfo and jukeplay to take URLs and
access files on a remote web server, and everything should
just work out.  Jukeplay does consult the environment variable
jukerx to get the files.  For example, to play MP3 files it uses:

	$jukerx cat $1 | madplay -q -S -o raw:/dev/stdout - 

If you run jukerx=(ssh tux) Juke, then files will be fetched
over ssh from the machine named tux.

The players write to standard output and Juke pipes that
into a helper program called aplay to redirect that into the
sound card.  

If you have installed aplay on a remote machine (named, say, amp)
then you can run aplay -x amp on the local machine to play
audio on the remote machine.  Juke will automatically do this
if you execute the internal "Dev" command, i.e. "Dev amp".
The special Dev local can be used to name the local machine.

There is also a standalone program "volume" included
that gives more detailed mixer access than Juke.

Comments and problems to Russ Cox <rsc@swtch.com>.


The pieces of the player you shouldn't need to touch are:

	Shell script that starts ajuke after sanity-checking environment.

	The program that talks to acme.  It manages all the windows
	named /juke/* and uses the following helper programs to
	make the windows useful.

aplay [-x machine]
	The program that reads 44.1kHz 16-bit stereo sound and plays
	it on a given audio device.  The -x flag says to play on a remote
	machine via ssh.

jukeget name
	Print the contents for a new window named name.
	Window names are:

		Juke/ - the playlist
		Juke/song/ - the list of songs
		Juke/song/n - song #n

	And also album, artist, composer, and genre, list in place of song.

jukesearch pattern
	Print the contents for a search window searching for pattern.

jukeput name
	Write standard input to the file for the window named name.
	Only the playlist Juke/ and the sublists Juke/list/* can
	be written.

jukefmt id
	Tab "song/n Title" lines so that they line up using the
	acme font in the window with the given id.

jukesongfile nnn
	Print the name of the song numbered nnn.

waitfor hh:mm
	Sleep until the given time.  Used to implement the alarm command.

The audio back end for volume and ajuke is system-specific,
and only Linux and FreeBSD are implemented.  If you add support
for another system, please mail it to me so I can include it.