Some may recall my old set up I used to record the AWNOI net. A bit fiddly, but it worked, and worked well. However the machine I used was short-lived. Basically, I wanted to stream in both directions between a sound device connected to a HF radio transceiver, and a USB wireless headset, with a feed being recorded to disk.
The problem with newer sound devices is the rather limited sync range possible with the modern audio CODECs. Many will not do sample rates that aren’t a multiple of 44.1kHz or 48kHz, and I have a headset that won’t record any other sample rate other than 16kHz. ALSA’s plug: doesn’t play nice with JACK, and I shelved the whole project for later.
Well, tonight I did some tinkering with gstreamer to see if it could do the routing I needed. Certainly all the building blocks were there, I just had to get the pipeline right. A bit of jiggling of parameters, and I managed to get audio going in both directions, and to a RIFF wave file to boot. I’ve put it in a shell script for readability/maintainability:
#!/bin/sh # GStreamer bi-directional full-duplex audio routing script # Stuart Longland VK4MSL CAPT_BUFTIME=50000 CAPT_LATTIME=25000 PLAY_BUFTIME=20000 PLAY_LATTIME=1000 STREAM_FMT=audio/x-raw-int,channels=1,width=16,depth=16,rate=16000 OUTPUT_FMT=audio/x-raw-int,channels=2,width=16,depth=16,rate=16000 OUTPUT="${1:-out.wav}" HEADSET_DEV=hw:Headset HEADSET_CAPT_FMT=audio/x-raw-int,channels=1,width=16,depth=16,rate=16000 HEADSET_CAPT_BUFTIME=${CAPT_BUFTIME} HEADSET_CAPT_LATTIME=${CAPT_LATTIME} HEADSET_PLAY_FMT=audio/x-raw-int,channels=2,width=16,depth=16,rate=48000 HEADSET_PLAY_BUFTIME=${PLAY_BUFTIME} HEADSET_PLAY_LATTIME=${PLAY_LATTIME} SNDCARD_DEV=hw:NVidia SNDCARD_CAPT_FMT=audio/x-raw-int,channels=2,width=16,depth=16,rate=48000 SNDCARD_CAPT_BUFTIME=${CAPT_BUFTIME} SNDCARD_CAPT_LATTIME=${CAPT_LATTIME} SNDCARD_PLAY_FMT=audio/x-raw-int,channels=2,width=16,depth=16,rate=48000 SNDCARD_PLAY_BUFTIME=${PLAY_BUFTIME} SNDCARD_PLAY_LATTIME=${PLAY_LATTIME} exec gst-launch-0.10 \ alsasrc device=${HEADSET_DEV} \ name=headset-capt \ slave-method=resample \ buffer-time=${HEADSET_CAPT_BUFTIME} \ latency-time=${HEADSET_CAPT_LATTIME} \ ! ${HEADSET_CAPT_FMT} \ ! audioresample \ ! audioconvert \ ! ${STREAM_FMT} \ ! queue \ ! tee name=headset \ ! audioresample \ ! audioconvert \ ! ${SNDCARD_PLAY_FMT} \ ! alsasink device=${SNDCARD_DEV} \ name=sndcard-play \ buffer-time=${SNDCARD_PLAY_BUFTIME} \ latency-time=${SNDCARD_PLAY_LATTIME} \ alsasrc device=${SNDCARD_DEV} \ name=sndcard-capt \ slave-method=resample \ buffer-time=${SNDCARD_CAPT_BUFTIME} \ latency-time=${SNDCARD_CAPT_LATTIME} \ ! ${SNDCARD_CAPT_FMT} \ ! audioresample \ ! audioconvert \ ! ${STREAM_FMT} \ ! queue \ ! tee name=soundcard \ ! audioresample \ ! audioconvert \ ! ${HEADSET_PLAY_FMT} \ ! alsasink device=${HEADSET_DEV} \ name=headset-play \ buffer-time=${HEADSET_PLAY_BUFTIME} \ latency-time=${HEADSET_PLAY_LATTIME} \ interleave name=recorder-in \ ! audioconvert \ ! audioresample \ ! ${OUTPUT_FMT} \ ! wavenc \ ! filesink location="${OUTPUT}" \ headset. \ ! queue \ ! recorder-in.sink1 \ soundcard. \ ! queue \ ! recorder-in.sink0
Now the fun begins ironing out the kinks in my data cable for the FT-897. At present, it works for receive, and seems to work for transmit. I use VOX on the radio itself and keep the headset’s microphone on mute when I don’t want to transmit.
At present, I was getting a bit of distorted audio coming back through the headset when I transmitted, almost certainly RF-pickup in the cable and line-in circuitry of the computer’s sound card. I’ll have to see if I can filter it out, but the real test will be seeing if such distortion is present on the outgoing signal — or rather, if it’s significantly audible to be a problem.
Recent Comments