#!/bin/bash 
 | 
  
 | 
device_1=$1 
 | 
device_2=$2 
 | 
  
 | 
prepare_mic_capture() 
 | 
{ 
 | 
    amixer set "Capture Digital" 192 
 | 
    amixer set "Capture Mute" 0 
 | 
    amixer set "Right PGA Mux" "DifferentialR" 
 | 
    amixer set "Left PGA Mux" "DifferentialL" 
 | 
    amixer set "Differential Mux" "Line 2" 
 | 
} 
 | 
  
 | 
prepare_adc_gains() 
 | 
{ 
 | 
    adc_mic_gain=$1 
 | 
  
 | 
    echo "Prepare ADC MIC GAINs with $adc_mic_gain dB" 
 | 
    # PGA gain 
 | 
    amixer set "Left Channel" $adc_mic_gain 
 | 
    amixer set "Right Channel" $adc_mic_gain 
 | 
} 
 | 
  
 | 
test_loopback() 
 | 
{ 
 | 
    # PATH_CAPTURE=/mnt/sdcard/cap_files 
 | 
    # PATH_CAPTURE=/media/usb0/cap_files 
 | 
    PATH_CAPTURE=/tmp/cap_files 
 | 
    play_device="default" 
 | 
    capt_device="default" 
 | 
    fs=16000 
 | 
    capt_bits="S16_LE" 
 | 
    capt_ch=2 
 | 
    capt_seconds=60            # capture once per 1min 
 | 
    capt_minutes=60            # capture minutes 
 | 
    switch_gain_count=8 
 | 
    play_seconds=2 
 | 
    play_start_doze=0.3 
 | 
    play_stop_doze=1 
 | 
    play_bits=16 
 | 
    play_ch=2 
 | 
  
 | 
    if [ -n "$1" ]; then 
 | 
        play_device=$1 
 | 
    fi 
 | 
  
 | 
    if [ -n "$2" ]; then 
 | 
        capt_device=$2 
 | 
    fi 
 | 
  
 | 
    # play_gain_tbl="-30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30" 
 | 
    play_gain_tbl="-30" 
 | 
    set -- $play_gain_tbl 
 | 
    play_gain_num=$# 
 | 
    test_hours=5 
 | 
    let "capt_count=$capt_minutes*$test_hours"        # capture 120 hours 
 | 
    let "play_count=$capt_seconds/($play_seconds+$play_stop_doze)" 
 | 
  
 | 
    mkdir -p $PATH_CAPTURE 
 | 
  
 | 
    echo "play_device: $play_device, capt_device: $capt_device, capt_count: $capt_count, play_count: $play_count, test $test_hours hours on PATH_CAPTURE: $PATH_CAPTURE" 
 | 
  
 | 
    echo "******** Test loopback start ********" 
 | 
  
 | 
    prepare_mic_capture 
 | 
  
 | 
    for capt_cnt in `seq 1 $capt_count`; do 
 | 
        capt_gain=0 
 | 
        # playback -> capture -> playback 
 | 
        sox -b $play_bits -r $fs -c $play_ch -n -t alsa $play_device synth $play_seconds sine 1000 gain -30 &  # do playback 
 | 
        # start doze 
 | 
        sleep $play_start_doze 
 | 
  
 | 
        let "temp=($capt_cnt-1)/($capt_count/$switch_gain_count)" 
 | 
        let "capt_gain=$temp%(switch_gain_count+1)*3" # step 3dB 
 | 
  
 | 
        DUMP_FILE=$(printf 'loopback_fs%d_format_%s_ch%d_mic%ddb_%04d.wav' $fs $capt_bits $capt_ch $capt_gain $capt_cnt) 
 | 
        echo "temp: $temp, capt_gain: $capt_gain DUMP_FILE: $DUMP_FILE" 
 | 
  
 | 
        prepare_adc_gains $capt_gain 
 | 
  
 | 
        # echo "capt_cnt: $capt_cnt" 
 | 
        # echo "play_count: $play_count, play_seconds: $play_seconds" 
 | 
        echo "arecord -D $capt_device -r $fs -f $capt_bits -c $capt_ch -d $capt_seconds $PATH_CAPTURE/$DUMP_FILE" 
 | 
        arecord -D $capt_device -r $fs -f $capt_bits -c $capt_ch -d $capt_seconds $PATH_CAPTURE/$DUMP_FILE &  # do capture 
 | 
  
 | 
        # wait the first playback stop 
 | 
        sleep $play_seconds 
 | 
  
 | 
        set -- $play_gain_tbl 
 | 
        for play_cnt in `seq 1 $play_count`; do 
 | 
            play_gain=$1 
 | 
            shift 
 | 
            let play_gain_index+=1 
 | 
  
 | 
            # echo "play_gain_index: $play_gain_index, play_gain_num: $play_gain_num" 
 | 
            echo "sox -b $play_bits -r $fs -c $play_ch -n -t alsa $play_device synth $play_seconds sine 1000 gain $play_gain" 
 | 
            if [ $play_gain_index -ge $play_gain_num ]; then 
 | 
                set -- $play_gain_tbl 
 | 
                play_gain_index=0 
 | 
            fi 
 | 
            # echo "play_cnt: $play_cnt" 
 | 
            sox -b $play_bits -r $fs -c $play_ch -n -t alsa $play_device synth $play_seconds sine 1000 gain $play_gain # do playback 
 | 
            # stop doze 
 | 
            sleep $play_stop_doze 
 | 
        done; 
 | 
    done; 
 | 
  
 | 
    echo "******** Test loopback end ********" 
 | 
} 
 | 
  
 | 
echo "******** Test loopback v0.1.0 ********" 
 | 
  
 | 
test_loopback $device_1 $device_2 
 |