Overview of the Indy Phone
The Indy Phone provides a two-way real-time voice communication link between
two or more Silcon Graphics Indy workstations.
Using the Indy's audio libraries, two programs were created to provide the
separate tasks of recording and playback of data streams.
audior (Audio Recording)
audior performs the tasks of recording 254 16-bit 8kHz samples from the Indy's
microphone, compressing the 16-bit to 8-bit mu-law, compressing the samples
further by silence compression, and then directing this output to stdout. This
process is repeated indefinitly. In addition, audior sets the microphone
level to a reasonable setting during the first execution of the program.
A more detailed breakdown of audior (in order of execution):
- 1. Variable declarations--including: silence compression parameters
and microphone level and sample size/rate settings.
- 2. Audio port creation and opening.
- 3. Table lookup created which will convert all 65536 16-bit samples
to the 256 8-bit mu-law samples.
- 4. Record 254 16-bit linear samples at 8kHz stereo.
- 5. Convert the left channel to 8-bit mu-law.
- 6. Process the left channel using silence compression and send it to stdout.
- 7. Repeat steps 4-6 again.
The silence compression looks for successive samples in which the
amplitude of the recording falls below a set level. If there are
a set minimum number of these valus in a row, audior will compress
them to a single silence designated byte (currently FFh) and a byte
whose value indicates the number of samples in the silence.
The mu-law conversion compresses the 16-bit linear scale to an 8-bit logarithmic
scale. Fidelity to 13-bits is kept near the minimum audio levels and decreases
as the amplitude increases; therefore, you can support a large range of audio
dynamics while maintaining small sample size without losing fidelity.
audiop (Audio Playback)
audiop reverses the steps of audior. It reads 254 or less bytes from stdin,
removes the silence compression, converts the 8-bit mu-law back to 16-bit linear,
and then plays back the result through the speaker. This process is also repeated
indefinitely. Likewise, audiop sets the speaker level to a reasonable setting
during the first execution of the program.
A more detailed breakdown of audiop (in order of execution):
- 1. Variable declaration--including: speaker level and sample size/rate
settings.
- 2. Audio port creation and opening.
- 3. Setting of audio playback buffer size.
- 4. Table lookup created which will covert the 256 8-bit mu-law
compressed samples back to 16-bit linear samples.
- 5. Reading of 254 samples (by reading 254 uncompressed bytes or less if
silence compression is detected.
- 6. Padding the silence copressed areas with zero amplitudes.
- 7. Converting back to 16-bit linear using the lookup table.
- 8. Reassembly of the stereo channel.
- 9. Processed data sent to the audio playback buffer.
- 10. Repeat steps 5 to 9.
The playback buffer allows data to be sent for playback while continued
execution of the program occurs.
It was discovered that many instances of audiop may run
simultaneously--allowing more than one conversation.
The data normally sent to stdin and stdout is redirected through sockets
using Richard Forsman's netpipes utility.
faucet (Socket generator)
faucet sets up a socket and port and begins to redirect a program's output
through this socket. It was also discovered that faucet supports
multicasting (the transmission of data to two or more pipes) allowing
conference calls.
hose (Socket connection client)
hose attempts a connection to a previously created socket and port. If
a connection is established, hose redirects the data it receives into the
stdin of a program.
Because the command line arguments to faucet and hose are fairly long, two
shell scripts were created to facilitate execution of the Indy phone.
talkto (transmission launcher)
talkto executes faucet to opens up a socket on the user's terminal on
port 2010. It then begins to redirect audior's output to the socket.
listento (reception launcher)
listento executes hose to open up a socket at a given address on port
2010 and then directs the input to audiop.
Both programs begin to run in the background and can be terminated using
the kill command.
Send mail to Jason Gayman
Last updated: December 16th, 1995
Jason Gayman (jase@owlnet.rice.edu, jase@gayman.hanszen.rice.edu)