#!/bin/sh

# Automatic measuring script
# Copyright (C) 2002-2005 Denis Sbragion
# Copyright (C) 2005 Chris Birkinshaw

# This program may be freely redistributed under the terms of
# the GNU GPL and is provided to you as is, without any warranty
# of any kind. Please read the file "COPYING" for details.

# Useful programs
ECHO="echo"
RM="rm"
GLSWEEP="glsweep"
SOX="sox"
LSCONV="lsconv"
APLAY="aplay"
ARECORD="arecord"
SYNC="sync"
SLEEP="sleep"
ALSAPLAYER=alsaplayer

# Default parameters
TMP="/tmp"
AMPLITUDE="0.5"
LEADIN="0.05"
LEADOUT="0.005"
MINGAIN="0.1"
DLSTART="0.9"

$ECHO 
$ECHO "Automatic measuring script."
$ECHO "Copyright (C) 2002-2005 Denis Sbragion"
$ECHO "Copyright (C) 2005 Chris Birkinshaw"
$ECHO 
$ECHO "This program may be freely redistributed under the terms of"
$ECHO "the GNU GPL and is provided to you as is, without any warranty"
$ECHO "of any kind. Please read the file "COPYING" for details."
$ECHO 

# Command line check
if [[ $# != 9 && $# != 10 ]]; then
 $ECHO "Usage:"
 $ECHO " measure bits rate startf endf lslen lssil indev outdev impfile [sweepfile]"
 $ECHO
 $ECHO " bits: measuring bits (16 or 24)"
 $ECHO " rate: sample rate"
 $ECHO " startf: sweep start frequency in Hz"
 $ECHO " endf: sweep end frequency in Hz"
 $ECHO " lslen: log sweep length in seconds"
 $ECHO " lssil: log sweep silence length in seconds"
 $ECHO " indev: ALSA input device"
 $ECHO " outdev: JACK output device"
 $ECHO " impfile: impulse response output file"
 $ECHO " sweepfile: optional wav file name for the recorded sweep"
 $ECHO
 $ECHO "example: measurejack 16 44100 5 21000 45 2 plughw brutefir:input-0,brutefir:input-1 impulse.pcm"
 $ECHO
 $ECHO "Tip: jackd must not be using the recording channels of your soundcard, i.e. launch with the -P option"
 $ECHO
 exit 0
fi 

# Get command line parameters
BITS="$1"
RATE="$2"
STARTF="$3"
ENDF="$4"
LSLEN="$5"
LSSIL="$6"
INDEV="$7"
OUTDEV="$8"
IMPFILE="$9"
SWEEPFILE="${10}"

# Check bits to use
if [ "$BITS" == "24" ]; then
 SOXFMT="-s4"
 ARECORDFMT="S32_LE"
else
 SOXFMT="-s2"
 ARECORDFMT="S16_LE"
fi

# Generate the log sweep
$GLSWEEP $RATE $AMPLITUDE $STARTF $ENDF $LSLEN $LSSIL $LEADIN $LEADOUT ${TMP}/msrawsweep.pcm ${TMP}/msinverse.pcm

# Convert to WAV file
$ECHO "Converting sweep to play format..."
$SOX -t raw -r $RATE -c 1 -f4 ${TMP}/msrawsweep.pcm -t wav -c 2 $SOXFMT ${TMP}/msplaysweep.wav
$RM ${TMP}/msrawsweep.pcm

# Filesystem sync
$ECHO "Waiting 5 seconds for filesystem sync..."
$SYNC
$SLEEP 5

# Record the sweep
$ECHO "Sweep recording."
$ECHO "Measuring channel: left. Reference channel: right."
$SLEEP 1
RLEN=$(( $LSLEN + $LSSIL * 2 ))
$ALSAPLAYER -o jack -d "$OUTDEV" -i text ${TMP}/msplaysweep.wav &
$ARECORD -D $INDEV -t wav -r $RATE -f $ARECORDFMT -c 2 -d $RLEN ${TMP}/msrecsweep.wav

# Remove the play sweep file
$RM ${TMP}/msplaysweep.wav

# Convert sweep file
$ECHO "Sweep file extraction (left channel)..."
$SOX ${TMP}/msrecsweep.wav -t raw -r $RATE -f4 -c 1 ${TMP}/mssweep.pcm mixer -l

# Extract reference file
$ECHO "Reference file extraction (right channel)..."
$SOX ${TMP}/msrecsweep.wav -t raw -r $RATE -f4 -c 1 ${TMP}/msrefer.pcm mixer -r

# Move or remove the recorded file
if [ "$SWEEPFILE" != "" ]; then
	$ECHO "Copying sweepfile to ${SWEEPFILE}..."
	$MV ${TMP}/msrecsweep.wav "$SWEEPFILE"
else
	$RM ${TMP}/msrecsweep.wav
fi

# Print stats
$ECHO
$ECHO "Measuring channel (left) stats..."
$ECHO
$SOX -t raw -r $RATE -f4 -c 1 ${TMP}/mssweep.pcm -n stat

$ECHO
$ECHO "Reference channel (right) stats..."
$ECHO
$SOX -t raw -r $RATE -f4 -c 1 ${TMP}/msrefer.pcm -n stat

# Extract the impulse response
$LSCONV ${TMP}/mssweep.pcm ${TMP}/msinverse.pcm $IMPFILE ${TMP}/msrefer.pcm $MINGAIN $DLSTART

# Impulse response stats
$ECHO
$ECHO "Impulse response stats..."
$ECHO
$SOX -t raw -r $RATE -f4 -c1 $IMPFILE -n stat

$ECHO "Temporary file cleanup..."

$RM ${TMP}/mssweep.pcm
$RM ${TMP}/msrefer.pcm
$RM ${TMP}/msinverse.pcm

$ECHO "Impulse response measurement completed."
