#! /bin/sh
# Simple tool for controlling the FM radio on the command line.
# (c) 2009 Martin Grimme  <martin.grimme@gmail.com>


FREQ=$1
MODE=$2


send_request() {

  dbus-send --system --print-reply \
            --dest=de.pycage.FMRXEnabler \
            /de/pycage/FMRXEnabler\
            de.pycage.FMRXEnabler.request >/dev/null

}


require_root() {

  MSG=$1
  if [ "`id -u`" != "0" ]; then
    echo ${MSG}
    exit 1
  fi

}


find_sysfs_path() {

  F=`find /sys/class/i2c-adapter -name "fm_frequency"`
  echo `dirname ${F}`

}


mixer_on() {

  # set input source
  amixer -qc0 cset iface=MIXER,name='Input Select' 'ADC'
  amixer -qc0 cset iface=MIXER,name='PGA Capture Switch' on

  # enable line 
  amixer -qc0 cset iface=MIXER,name='Left PGA Mixer Line2L Switch' on
  amixer -qc0 cset iface=MIXER,name='Right PGA Mixer Line2R Switch' on

}


mixer_off() {

  # unset input source
  amixer -qc0 cset iface=MIXER,name='Input Select' 'Digital Mic'
  amixer -qc0 cset iface=MIXER,name='PGA Capture Switch' off

  amixer -qc0 cset iface=MIXER,name='Left PGA Mixer Line2L Switch' off
  amixer -qc0 cset iface=MIXER,name='Left DAC_L1 Mixer HP Switch' off
  amixer -qc0 cset iface=MIXER,name='Right PGA Mixer Line2R Switch' off
  amixer -qc0 cset iface=MIXER,name='Right DAC_L1 Mixer HP Switch' off

  amixer -qc0 cset iface=MIXER,name='HP DAC Playback Volume' 0,0
  
}


speaker_on() {

  # set headphone volume low or it will blow your ears away :)
  amixer -qc0 cset iface=MIXER,name='Headphone Playback Volume' 5,5
  
  amixer -qc0 cset iface=MIXER,name='Left DAC_L1 Mixer Line Switch' off
  amixer -qc0 cset iface=MIXER,name='Left DAC_L1 Mixer HP Switch' on
  amixer -qc0 cset iface=MIXER,name='Right DAC_R1 Mixer Line Switch' off
  amixer -qc0 cset iface=MIXER,name='Right DAC_R1 Mixer HP Switch' on

  amixer -qc0 cset iface=MIXER,name='HP DAC Playback Volume' 50,50
  amixer -qc0 cset iface=MIXER,name='Speaker Function' 1

}


speaker_off() {

  amixer -qc0 cset iface=MIXER,name='Left DAC_L1 Mixer Line Switch' on
  amixer -qc0 cset iface=MIXER,name='Left DAC_L1 Mixer HP Switch' off
  amixer -qc0 cset iface=MIXER,name='Right DAC_R1 Mixer Line Switch' on
  amixer -qc0 cset iface=MIXER,name='Right DAC_R1 Mixer HP Switch' off

  amixer -qc0 cset iface=MIXER,name='HP DAC Playback Volume' 0,0
  amixer -qc0 cset iface=MIXER,name='Speaker Function' 0

}


power_on() {

  # switch on
  echo 1 >${SYSFS_PATH}/power_state
  # set DAC audio route 
  echo 16 >${SYSFS_PATH}/audio_route
  # set stereo
  echo 12 >${SYSFS_PATH}/dac_output
  # set preset tune mode
  echo 1 >${SYSFS_PATH}/fm_search_tune_mode
  # unmute
  echo 0 >${SYSFS_PATH}/mute

}


power_off() {

  echo "powering off"
  echo ""
  
  # kill gstreamer pipe
  kill ${GST_PID}
   
  # mute
  echo 1 >${SYSFS_PATH}/mute
  # switch off
  echo 0 >${SYSFS_PATH}/power_state
  mixer_off

}


tune_in() {

  FREQ=$1
  echo "Frequency: $1 KHz"
  echo ${FREQ} >${SYSFS_PATH}/fm_frequency

}


if [ -z "${FREQ}" ]; then
  echo "Command line tool for controlling the FM radio."
  echo "Copyright (c) 2009 Martin Grimme"
  echo ""
  echo "  Usage: $0 <Frequency in KHz> [speaker|headphones]"
  echo ""
  echo "  Examples:"
  echo "         $0 87900"
  echo "         $0 87900 speaker"
  exit 1
fi


require_root "You need to be root to control the FM radio. Aborting."

# is gst-launch available?
if [ ! -x "/usr/bin/gst-launch" ]; then
  echo "gst-launch not available. Please install gstreamer-tools."
  exit 1
fi

send_request
SYSFS_PATH=`find_sysfs_path`
power_on
mixer_on
tune_in ${FREQ}

case "${MODE}" in
  headphones)
    speaker_off
    ;;
  speaker)
    speaker_on
    ;;
  *)
    speaker_off
    ;;
esac

gst-launch pulsesrc ! pulsesink >/dev/null &
GST_PID=$!

trap power_off HUP QUIT TERM EXIT
while true; do
  sleep 60
  send_request
done

