1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun 3*4882a593Smuzhiyundevice_1=$1 4*4882a593Smuzhiyundevice_2=$2 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunprepare_mic_capture() 7*4882a593Smuzhiyun{ 8*4882a593Smuzhiyun amixer set "Capture Digital" 192 9*4882a593Smuzhiyun amixer set "Capture Mute" 0 10*4882a593Smuzhiyun amixer set "Right PGA Mux" "DifferentialR" 11*4882a593Smuzhiyun amixer set "Left PGA Mux" "DifferentialL" 12*4882a593Smuzhiyun amixer set "Differential Mux" "Line 2" 13*4882a593Smuzhiyun} 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunprepare_adc_gains() 16*4882a593Smuzhiyun{ 17*4882a593Smuzhiyun adc_mic_gain=$1 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun echo "Prepare ADC MIC GAINs with $adc_mic_gain dB" 20*4882a593Smuzhiyun # PGA gain 21*4882a593Smuzhiyun amixer set "Left Channel" $adc_mic_gain 22*4882a593Smuzhiyun amixer set "Right Channel" $adc_mic_gain 23*4882a593Smuzhiyun} 24*4882a593Smuzhiyun 25*4882a593Smuzhiyuntest_loopback() 26*4882a593Smuzhiyun{ 27*4882a593Smuzhiyun # PATH_CAPTURE=/mnt/sdcard/cap_files 28*4882a593Smuzhiyun # PATH_CAPTURE=/media/usb0/cap_files 29*4882a593Smuzhiyun PATH_CAPTURE=/tmp/cap_files 30*4882a593Smuzhiyun play_device="default" 31*4882a593Smuzhiyun capt_device="default" 32*4882a593Smuzhiyun fs=16000 33*4882a593Smuzhiyun capt_bits="S16_LE" 34*4882a593Smuzhiyun capt_ch=2 35*4882a593Smuzhiyun capt_seconds=60 # capture once per 1min 36*4882a593Smuzhiyun capt_minutes=60 # capture minutes 37*4882a593Smuzhiyun switch_gain_count=8 38*4882a593Smuzhiyun play_seconds=2 39*4882a593Smuzhiyun play_start_doze=0.3 40*4882a593Smuzhiyun play_stop_doze=1 41*4882a593Smuzhiyun play_bits=16 42*4882a593Smuzhiyun play_ch=2 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun if [ -n "$1" ]; then 45*4882a593Smuzhiyun play_device=$1 46*4882a593Smuzhiyun fi 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun if [ -n "$2" ]; then 49*4882a593Smuzhiyun capt_device=$2 50*4882a593Smuzhiyun fi 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun # play_gain_tbl="-30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30" 53*4882a593Smuzhiyun play_gain_tbl="-30" 54*4882a593Smuzhiyun set -- $play_gain_tbl 55*4882a593Smuzhiyun play_gain_num=$# 56*4882a593Smuzhiyun test_hours=5 57*4882a593Smuzhiyun let "capt_count=$capt_minutes*$test_hours" # capture 120 hours 58*4882a593Smuzhiyun let "play_count=$capt_seconds/($play_seconds+$play_stop_doze)" 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun mkdir -p $PATH_CAPTURE 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun 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" 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun echo "******** Test loopback start ********" 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun prepare_mic_capture 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun for capt_cnt in `seq 1 $capt_count`; do 69*4882a593Smuzhiyun capt_gain=0 70*4882a593Smuzhiyun # playback -> capture -> playback 71*4882a593Smuzhiyun sox -b $play_bits -r $fs -c $play_ch -n -t alsa $play_device synth $play_seconds sine 1000 gain -30 & # do playback 72*4882a593Smuzhiyun # start doze 73*4882a593Smuzhiyun sleep $play_start_doze 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun let "temp=($capt_cnt-1)/($capt_count/$switch_gain_count)" 76*4882a593Smuzhiyun let "capt_gain=$temp%(switch_gain_count+1)*3" # step 3dB 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun DUMP_FILE=$(printf 'loopback_fs%d_format_%s_ch%d_mic%ddb_%04d.wav' $fs $capt_bits $capt_ch $capt_gain $capt_cnt) 79*4882a593Smuzhiyun echo "temp: $temp, capt_gain: $capt_gain DUMP_FILE: $DUMP_FILE" 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun prepare_adc_gains $capt_gain 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun # echo "capt_cnt: $capt_cnt" 84*4882a593Smuzhiyun # echo "play_count: $play_count, play_seconds: $play_seconds" 85*4882a593Smuzhiyun echo "arecord -D $capt_device -r $fs -f $capt_bits -c $capt_ch -d $capt_seconds $PATH_CAPTURE/$DUMP_FILE" 86*4882a593Smuzhiyun arecord -D $capt_device -r $fs -f $capt_bits -c $capt_ch -d $capt_seconds $PATH_CAPTURE/$DUMP_FILE & # do capture 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun # wait the first playback stop 89*4882a593Smuzhiyun sleep $play_seconds 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun set -- $play_gain_tbl 92*4882a593Smuzhiyun for play_cnt in `seq 1 $play_count`; do 93*4882a593Smuzhiyun play_gain=$1 94*4882a593Smuzhiyun shift 95*4882a593Smuzhiyun let play_gain_index+=1 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun # echo "play_gain_index: $play_gain_index, play_gain_num: $play_gain_num" 98*4882a593Smuzhiyun echo "sox -b $play_bits -r $fs -c $play_ch -n -t alsa $play_device synth $play_seconds sine 1000 gain $play_gain" 99*4882a593Smuzhiyun if [ $play_gain_index -ge $play_gain_num ]; then 100*4882a593Smuzhiyun set -- $play_gain_tbl 101*4882a593Smuzhiyun play_gain_index=0 102*4882a593Smuzhiyun fi 103*4882a593Smuzhiyun # echo "play_cnt: $play_cnt" 104*4882a593Smuzhiyun sox -b $play_bits -r $fs -c $play_ch -n -t alsa $play_device synth $play_seconds sine 1000 gain $play_gain # do playback 105*4882a593Smuzhiyun # stop doze 106*4882a593Smuzhiyun sleep $play_stop_doze 107*4882a593Smuzhiyun done; 108*4882a593Smuzhiyun done; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun echo "******** Test loopback end ********" 111*4882a593Smuzhiyun} 112*4882a593Smuzhiyun 113*4882a593Smuzhiyunecho "******** Test loopback v0.1.0 ********" 114*4882a593Smuzhiyun 115*4882a593Smuzhiyuntest_loopback $device_1 $device_2 116