Notes on Soundmodem

From HacDC Wiki

Soundmodem emulates a hardware modulator/demodulator in software, vis a vis a daemon running in userspace.

v0.15 is the latest, I recommend using that. v0.14 requires libxml, which I don't think anybody makes available anymore. libxml2 is used for storing the config file in /etc/ax25.

Soundmodem will either turn your soundcard into a KISS radiomodem or an AX.25 network interface. We're going to be working with the AX.25 side of the house.


From Source: Ubuntu Karmic and Lucid

sudo apt-get install libasound2-dev libxml2-dev libgtk2.0-dev libaudiofile-dev

tar xvzf soundmodem-0.15.tar.gz
cd soundmodem-0.15
./configure && sudo make install
sudo mkdir /etc/ax25  ## or else it won't be able to save your configurations

Configure it by running (as root) /usr/local/bin/soundmodemconfig. It will open a window on your desktop with nothing in it. Click File, New, Configuration. Give your configuration a name (I used 'default').

Apt-Get: Ubuntu Lucid and Up

Gets you version 0.13 on Lucid, and 0.15 on Maverick and Natty

As root do the following

apt-get install soundmodem
mkdir /etc/ax25
soundmodemconfig /etc/ax25/soundmodem.conf #see below for configs
soundmodem /etc/ax25/soundmodem.conf -R -M >/dev/null 2>/dev/null& #this makes an awful noise when it works

On Fedora



IO Tab

On the I/O tab, choose your sound driver (out of soundcard, file, simulation, and alsa, I picked alsa). You'll have to play around with the value of the ALSA Audio Driver field to get one that works. On Windbringer, I used plughw:0,0. Check half duplex for now. Leave the Capture Channel field set to 'mono'. I don't know what to set the PTT Driver field to yet, so I left it on 'none'.

It's possible that we'll have to develop some sort of serial or USB push-to-talk interface for the comm system, or use full duplex with two radios, using one to transmit and one to receive. We could rig up PTT circuits with microcontrollers, build a known circuit (like the serial port or VOX one from the above link), or evade the problem entirely.

Channel Access Tab

Don't change the settings on the Channel Access tab.

Channel 0

Right below the name of your configuration in the tree you will see a new entry, Channel 0. If you select it you'll be presented with three new tabs on the right.

Modulator Tab

The possible values for the Mode selector are Off, fsk, afsk, pam, psk, and newqpsk. I picked afsk because the Xastir wiki told me so. I left the values for Bits, Frequency 0, and Frequency 1 set to 1200, but we can play with that later. Leave Differential Encoding checked.

Demodulator Tab

On the Demodulator tab (which governs decoding audio signals into bits) the options are much the same, save that the Mode selector has an extra option (p3d). Leave everything else the same for now.

Packet IO Tab

On the Packet IO tab, the network/non-serial side of soundmodem is configured. Pick an IP address, netmask, and broadcast addres for a network interface (hint: stick with RFC 1918 for now). There are two options in the Mode selector, KISS and MKISS. I went with the default (MKISS).


When running the soundmodem utility (soundmodem /etc/ax25/default.conf &), the daemon configures the sound card to send and receive bitstreams encoded as audio through the jacks in the soundcard. On the network side of the house, it allocates a virtual network interface (sm0) which has a callsign associated with it (relevant for ham radio, not so much for other applications) as well as an IP address, network mask, and broadcast address. The idea is that whatever packets are sent through that network interface will be transparently converted into sound and transmitted using whatever device is connected to the headphone and microphone jacks of the computer. Conversely, any data received by the broadcast device (ham radio, laser, etc) is demodulated into bits, encapsulated into network frames, and made available to the OS.

In theory, it's just like a point-to-point IP link, only instead of ethernet you're using a nebulously defined network technology. You should then be able to do with this network interface what you could do with any other: send and receive traffic, route packets, use IPtables to filter traffic, et cetera.

Diagnostics, Testing, and Configuration

Here's where you debug your configuration. It's going to take some flipping back and forth between tabs to get right the first time.

You really should run soundmodemconfig from a terminal, because if you got something wrong (like the audio device) it'll be printed to stderr. It doesn't show up in a window.

The Diagnostics menu only appears when you have a channel (Channel 0) highlighted.

The first option is Scope, for oscilloscope. To get a test signal, click the PTT button (make sure your speakers are turned down!)

The second option is Spectrum, for spectrum analyzer of the signal being send to the sound card. To get a test signal, click the PTT button (again, make sure your speakers are turned down!)

The third option, Modem, dumps the raw bitstreams that your soundcard-emulating-a-modem is sending and receiving. Seeing strings of bits (even when disconnected) means that you have probably configured soundmodem correctly.

I do not know what the AO40-P3D option does. (It's an amateur satellite protocol thingy. We don't need it?)

To save your config file, use the File, Quit option. It'll save it automagically to /etc/ax25/soundmodem.conf.

So, how is this supposed to work, anyway?

Assume that you have a laptop running Linux (or Windows if you dare) and soundmodem. Assume that soundmodem is configured correctly. Assume that you have a transceiver - a black box that has a pair of audio jacks (speaker and microphone) on the back, can receive signals, and can broadcast signals.

Further assume that there is a third jack on the black box which plugs into the USB port of a computer. Whenever a signal is sent to that jack, the black box stops receiving and transmits whatever signal it gets through its microphone jack. Alternatively two radios one transmitting only and one receiving only (possibly on different channels) such that there is no need for drivers or a switching mechanism.

You'd connect the speaker jack on the black box into the microphone jack on your laptop. You would then connect the headphone jack of your laptop into the microphone jack of the black box. Then plug the push-to-talk USB jack of the black box into a USB port on your laptop.

Whenever a packet (say an ICMP4 echo request) is transmitted to the IP address of device sm0 on your laptop, it is converted by the soundmodem daemon into modulated sound which goes out through the headphone jack to the black box. The push-to-talk circuit engages and the black box stops receiving and goes into transmit mode. The black box receives that modulated static and broadcasts it. When the broadcast is done the PTT disengages and the black box goes back into receive mode. Conversely, whenever the black box picks up a signal it converts it into modulated static, which then goes out through its speaker jack into the microphone jack of your laptop. After the signal hits the mic jack, the soundmodem daemon demodulates the static into bits, packages them into an IP packet, and drops it into the networking subsystem of the kernel.

If I'm reading everything, correctly, because we'll be using whatever device we build as a KISS modem (rather than an MKISS TNC) we don't have to worry about AX.25.

Other resources