#!/bin/bash
#
# Jack configure script
#
# Copyright  (C) 2014 Manu Kebab <io.gnu.linux@free.fr>
#
#------------------------------------------------------


PROGNAME=${0##*/}

set -a
source gettext.sh
set +a
export TEXTDOMAIN="${PROGNAME}"
export TEXTDOMAINDIR="/usr/share/locale"
. /usr/bin/gettext.sh

TAB="$(printf '\t')"
TITLE="~ Jack Configure ~"

set -x

# Display a usage message.
usage()
{
	cat <<EOF

Usage: $PROGNAME { -sc1 | --set-conf1 }
       $PROGNAME { -h | --help }

This program facilite Jack2 and Ladish configuration.

Options:
    -h, --help                        display this usage message and exit
    -cs, --check-soundcard            display the sound card selector
    -sc1, --set-conf1                 set configuration 1 (48000/1024/3)
    -sc2, --set-conf2                 set configuration 2 (48000/1024/2)
    -sc3, --set-conf3                 set configuration 3 (48000/512/3)
    -sc4, --set-conf4                 set configuration 4 (48000/512/2)
    -sc5, --set-conf5                 set configuration 5 (44100/1024/2)
    -sjal, --set-jack-alsa-loop       set soundserver to jack + alsaloop
    -sjzb, --set-jack-zita-bridge     set soundserver to jack + zitabridge
    -sjpa, --set-jack-pulseaudio      set soundserver to jack + pulseaudio
    -sa, --set-alsa                   set soundserver to alsa
    -spa, --set-pulseaudio            set soundserver to jack pulseaudio
EOF
}


basic_checks()
{
	# Ensure config file is OK
	[ ! -e ~/.config/io-studio.conf ] && cp /etc/io-studio.conf ~/.config/io-studio.conf

	for arg in `grep -qs "=\"" /etc/io-studio.conf | cut -d \= -f 1`
	do
		if ! cat ~/.config/io-studio.conf | grep ${arg}
		then
			cat /etc/io-studio.conf | grep ${arg} >> ~/.config/io-studio.conf
		fi
	done

	# Check for first run...
	if [ ! -d ~/.config/jack ]
	then
		jack_control ds alsa
		parse_conf
		jack_control dps rate ${RATE}
		jack_control dps period ${PERIOD}
		jack_control dps nperiods ${NPERIOD}
		jack_control ips audioadapter device ${HW_ID}
		jack_control ips audioadapter rate ${RATE}
		jack_control ips audioadapter periodsize ${PERIOD}
		jack_control ips audioadapter nperiods ${NPERIOD}
		jack_control eps realtime-priority 95
	fi
	#jack_control status | grep stopped && jack_control start
	#sleep 1

	[ ! -d ~/.ladish/studios ] && mkdir -p ~/.ladish/studios
	[ ! -e ~/.ladish/studios/DefaultAlsa.xml ] && cp /etc/skel/.ladish/studios/DefaultAlsa.xml ~/.ladish/studios/

	gladish_runcheck
}


parse_conf()
{
	# Parse default conf
	. /etc/io-studio.conf

	# Parse user conf
	[ -e ~/.config/io-studio.conf ] && . ~/.config/io-studio.conf
}


launch_configure()
{
	parse_conf

	# Studio checks
	# Ensure a studio has been selected, otherwise set DefaultAlsa as default
	if [ ! -n "${STUDIO}" ]
	then
		grep -qs "STUDIO=" ~/.config/io-studio.conf \
			&& sed -i -e 's@^STUDIO.*@STUDIO=\"DefaultAlsa\"@g' ~/.config/io-studio.conf \
			|| echo "STUDIO=\"DefaultAlsa\"" >> ~/.config/io-studio.conf
	fi
	
	# Get ladish last studio name
	if ladish_control sname | grep -qs "DBus exception"
	then
		STUDIO="DefaultAlsa"
		grep -qs "STUDIO=" ~/.config/io-studio.conf \
			&& sed -i -e 's@^STUDIO.*@STUDIO=\"DefaultAlsa\"@g' ~/.config/io-studio.conf \
			|| echo "STUDIO=\"DefaultAlsa\"" >> ~/.config/io-studio.conf
	else
		var=$(ladish_control sname | sed '1d')
		STUDIO=$(echo ${var:1:$((${#var}-2))})
		grep -qs "STUDIO=" ~/.config/io-studio.conf \
			&& sed -i -e 's@^STUDIO.*@STUDIO=\"'"${STUDIO}"'\"@g' ~/.config/io-studio.conf \
			|| echo "STUDIO=\"${STUDIO}\"" >> ~/.config/io-studio.conf
	fi

	if [ "${SOUNDSERVER}" = "Jack+AlsaLoop" ] || [ "${SOUNDSERVER}" = "Jack+ZitaBridge" ] || [ "${SOUNDSERVER}" = "Jack+PulseAudio" ]
	then
		if [ -z "${HW_ID}" ] || [ -z "${SOUNDCARD}" ]
		then
			check_soundcard
		fi
	fi

	sleep 0.5
	JACK_CONF_MODE=$(yad --list --title "${TITLE}" \
						--width=560 --height=312 \
						--image=/usr/share/icons/Gant/128x128/apps/jack-configure.png \
						--window-icon=jack-quickstart \
						--text-align=center \
						--no-headers \
						--hide-column=1 \
						--column "Nº" \
						--column "Action:" \
						--print-column "1" \
						--separator "" \
						--text "$(eval_gettext $'\\n<b><big><u>Studio settings</u></big></b>\\n')" \
							1 "$(eval_gettext $'Start LADI Session Handler')" \
							2 "$(eval_gettext $'Current studio: (<span foreground=\'cyan\'>${STUDIO}</span>)')" \
							3 "$(eval_gettext $'Sound card: (<span foreground=\'cyan\'>${SOUNDCARD}</span>)')" \
							4 "$(eval_gettext $'Sound server: (<span foreground=\'cyan\'>${SOUNDSERVER}</span>)')" \
							5 "$(eval_gettext $'Jack parameters: (<span foreground=\'cyan\'>${RATE}/${PERIOD}/${NPERIOD}</span>)')" \
							6 "$(eval_gettext $'Reset parameters to default')" \
							7 "$(eval_gettext $'Restart Jack sound server')")
	ret=$?

	if [ "${ret}" -eq 0 ]
	then
		[ -z "${JACK_CONF_MODE}" ] && launch_configure

		if [ "${JACK_CONF_MODE}" -eq 1 ]
		then
			if ! ps -ef | grep -v grep | grep gladish
			then
				gladish &
				exit 0
			fi
		elif [ "${JACK_CONF_MODE}" -eq 2 ]
		then
			configure_studio
		elif [ "${JACK_CONF_MODE}" -eq 3 ]
		then
			check_soundcard
		elif [ "${JACK_CONF_MODE}" -eq 4 ]
		then
			configure_soundserver
		elif [ "${JACK_CONF_MODE}" -eq 5 ]
		then
			configure_custom
		elif [ "${JACK_CONF_MODE}" -eq 6 ]
		then
			set_conf1
			grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
				&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"Jack+PulseAudio\"@g' ~/.config/io-studio.conf \
				|| echo "SOUNDSERVER=\"Jack+PulseAudio\"" >> ~/.config/io-studio.conf
			done_window
			jack_quickstart
		elif [ "${JACK_CONF_MODE}" -eq 7 ]
		then
			jack_quickstart -r
		fi
	elif [ "${ret}" -eq 1 ]
	then
		exit 0 
	fi
}


check_soundcard()
{
	grep ']:' /proc/asound/cards | grep -v Loopback \
	| sed  -r -e 's/^ *//g' -e 's/\[//g' -e 's/\]//g' -e 's/  //g' \
	-e 's/ :/:/g' -e 's/: /:'"${TAB}"'/g' > /tmp/soundcards-info

	AUDIO_CARDS=$(cat /tmp/soundcards-info | wc -l)

	case "${AUDIO_CARDS}" in
		0)
			yad --title "${TITLE}" \
				--image=/usr/share/icons/Gant/64x64/status/dialog-error.png \
				--window-icon=jack-configure \
				--button=gtk-ok:0 \
				--buttons-layout=center \
				--text-align=center \
				--text="$(eval_gettext $'  No sound card detected, Exiting...  ')"
			exit 1
			;;

		1)
			HW_ID=$(cat /tmp/soundcards-info | awk '{print $2}' | sed 's@:@@g')
			SOUNDCARD=$(cat /tmp/soundcards-info | cut -d '[' -f2)
			sed -i 's/^HW_ID.*/HW_ID\=\"'"${HW_ID}"'\"/g' ~/.config/io-studio.conf
			sed -i 's/^SOUNDCARD.*/SOUNDCARD\=\"'"${SOUNDCARD}"'\"/g' ~/.config/io-studio.conf
			jack_quickstart -s
			if ladish_control sisloaded | grep -qs yes && jack_control status | grep -qs started && jack_lsp | grep -qsv "JACK server not running"
			then
				echo "I: Let's play"
			#	sleep 0.5
			#	yad --title "${TITLE}" \
			#		--image=/usr/share/icons/Gant/64x64/status/dialog-information.png \
			#		--window-icon=jack-quickstart \
			#		--button=gtk-ok:0 \
			#		--buttons-layout=center \
			#		--text-align=center \
			#		--text="$(eval_gettext $'  Only one sound card detected and Jack running.  \\n\\n  Back to menu...  ')"
			#	launch_configure
			fi
			;;

		*)
			sleep 0.5
			var=$(cat /tmp/soundcards-info | awk '{$1="";print}' | sed 's/  / /g' | sed 's/:/:|/g' | column -t -s \| \
					| yad --list --title "${TITLE}" \
					--width=520 --height=250 \
					--on-top \
					--image=/usr/share/icons/Gant/128x128/apps/alsaconf.png \
					--window-icon=jack-quickstart \
					--text-align=center \
					--no-headers \
					--column "Soundcard:TXT" \
					--separator=" " \
					--text "$(eval_gettext $'<b><big><u>Audio configuration</u></big></b>\\n\\nSelect your sound card:')")
			ret=$?

			if [ "${ret}" -eq 0 ]
			then
				if [ -n "${var}" ]
				then
					HW_ID=$(echo $var | awk '{print $1}' | sed 's@\:@@g')
					SOUNDCARD=$(echo $var | cut -d '[' -f2)
					sed -i 's/HW_ID.*/HW_ID\=\"'"${HW_ID}"'\"/g' ~/.config/io-studio.conf
					sed -i 's/SOUNDCARD.*/SOUNDCARD\=\"'"${SOUNDCARD}"'\"/g' ~/.config/io-studio.conf
					configure_card
					jack_quickstart -r
				else
					check_soundcard
				fi

			elif [ "${ret}" -eq 1 ]
			then
				if ladish_control sisloaded | grep -qs yes && jack_control status | grep -qs started && jack_lsp | grep -qsv "JACK server not running"
				then
					launch_configure
				else
					sleep 0.5
					yad --title "${TITLE}" \
						--image=/usr/share/icons/Gant/64x64/status/dialog-question.png \
						--window-icon=jack-quickstart \
						--button=gtk-yes:0 \
						--button=gtk-no:1 \
						--buttons-layout=center \
						--text-align=center \
						--text="$(eval_gettext $'\\n  Cancel, are you sure?  \\n\\n  (Will use PulseAudio instead of ${SOUNDSERVER})  \\n')"
					ter=$?

					if [ "${ter}" -eq 0 ]
					then
						jack_quickstart -k &
						sleep 2
						set_pulseaudio
						pulseaudio --start
						exit 0

					elif [ "${ter}" -eq 1 ]
					then
						check_soundcard
					fi
				fi
			fi
			;;
	esac

	#configure_rtirq
	configure_card
}


configure_studio()
{
	sleep 0.5
	LADI_STUDIO=$(ladish_control slist | grep -v list | cut -d \" -f 2 \
			| yad --list --title "${TITLE}" \
				--width=440 --height=270 \
				--image=/usr/share/icons/Gant/128x128/apps/gladish.png \
				--window-icon=jack-quickstart \
				--text-align=center \
				--no-headers \
				--column "Studio:TXT" \
				--separator=" " \
				--text "$(eval_gettext $'<b><big><u>Ladish configuration</u></big></b>\\n\\nSelect the default studio:')")
	ret=$?

	if [ "${ret}" -eq 0 ]
	then
		if [ -n "${LADI_STUDIO}" ]
		then
			LADI_STUDIO=${LADI_STUDIO%% }
			sed -i 's/^STUDIO.*/STUDIO\=\"'"${LADI_STUDIO}"'\"/g' ~/.config/io-studio.conf
			if ladish_control sisloaded | grep yes
			then
				ladish_control sstop
				ladish_control sunload
			fi
			jack_quickstart -s
		else
			configure_studio
		fi

	elif [ "${ret}" -eq 1 ]
	then
		launch_configure
	fi
}


configure_card()
{
	echo "I:  Configure soundcard"
	if [ -n "${HW_ID}" ]
	then
		if ladish_control sisloaded | grep yes
		then
			ladish_control sstop
			ladish_control sunload
		fi
		sed -i 's@>hw\:.*@>hw\:'"${HW_ID}"'<\/option>@g' ~/.config/jack/conf.xml
		sed -i 's@>hw\:.*@>hw\:'"${HW_ID}"'<\/parameter>@g' ~/.ladish/studios/*.xml
		[ ! -e ~/.config/io-studio.conf ] && exit 0 || jack_quickstart --start-jack
		jack_quickstart -s
		exit 0

	else
		yad --title "${TITLE}" \
			--image=/usr/share/icons/Gant/64x64/status/dialog-error.png \
			--window-icon=jack-configure \
			--button=gtk-ok:0 \
			--buttons-layout=center \
			--text-align=center \
			--text="$(eval_gettext $'  No sound card detected, Exiting...  ')"
		set_alsa
		exit 0
	fi
}


configure_soundserver()
{
	parse_conf

	CUR_SOUNDSERVER="${SOUNDSERVER}"
	YAD_SOUNDSERVER=$(echo "Jack+AlsaLoop@Jack+ZitaBridge@Jack+PulseAudio@Alsa@PulseAudio" | sed -e 's|'"${SOUNDSERVER}"'@||' | sed -e 's|@'"${SOUNDSERVER}"'||')

	sleep 0.5
	SOUND_SERVER=$(yad --title="${TITLE}" \
				--width=460 \
				--image=/usr/share/icons/Gant/128x128/apps/gladish.png \
				--window-icon=jack-configure \
				--text-align=center \
				--text="$(eval_gettext $'<b><big><u>Sound server configuration</u></big></b>\\n\\n(Default: Jack+AlsaLoop)')" \
				--field=":LBL" \
				--form --field="$(eval_gettext $'Sound server:'):CB" --field="Auto connect:CHK"\
				--item-separator=@ "" "${SOUNDSERVER}@${YAD_SOUNDSERVER}" "${AUTO_CONNECT}")
	ret=$?

	[ "${ret}" -eq 1 ] && launch_configure

	if [ "${ret}" -eq 0 ]
	then
		SOUNDSERVER=$(echo "${SOUND_SERVER}" | cut -d "|" -f2)
		AUTO_CONNECT=$(echo "${SOUND_SERVER}" | cut -d "|" -f3)
		grep -qs "AUTO_CONNECT=" ~/.config/io-studio.conf \
			&& sed -i -e 's@^AUTO_CONNECT.*@AUTO_CONNECT=\"'"${AUTO_CONNECT}"'\"@g' ~/.config/io-studio.conf \
			|| echo "AUTO_CONNECT=\"${AUTO_CONNECT}\"" >> ~/.config/io-studio.conf

		if [ "${SOUNDSERVER}" = "Jack+AlsaLoop" ] || [ "${SOUNDSERVER}" = "Jack+ZitaBridge" ]
		then
			if ! grep -qs "\[Loopback" /proc/asound/cards
			then
				diag_error_module
				launch_configure
			fi
		fi

		if [ "${CUR_SOUNDSERVER}" = "Jack+AlsaLoop" ] || [ "${CUR_SOUNDSERVER}" = "Jack+ZitaBridge" ] || [ "${CUR_SOUNDSERVER}" = "Jack+PulseAudio" ]
		then
			if [ "${SOUNDSERVER}" = "Jack+AlsaLoop" ]
			then
				set_jack_alsa_loop
				set_soundserver
				if jack_control status | grep -qs started && ladish_control sisloaded | grep -qs yes
				then
					jack-aloop-daemon &
					exit 0
				else
					jack_quickstart
					exit 0
				fi
			elif [ "${SOUNDSERVER}" = "Jack+ZitaBridge" ]
			then
				set_jack_zita_bridge
				set_soundserver
				if jack_control status | grep -qs started && ladish_control sisloaded | grep -qs yes
				then
					jack-zbridge-daemon &
					exit 0
				else
					jack_quickstart
					exit 0
				fi
			elif [ "${SOUNDSERVER}" = "Jack+PulseAudio" ]
			then
				set_jack_pulseaudio
				set_soundserver
				if jack_control status | grep -qs started && ladish_control sisloaded | grep -qs yes
				then
					jack-pulse-daemon &
					exit 0
				else
					jack_quickstart
					exit 0
				fi
			fi
		else
			if [ "${SOUNDSERVER}" = "Jack+AlsaLoop" ]
			then
				set_jack_alsa_loop
				set_soundserver
				jack_quickstart
				exit 0
			elif [ "${SOUNDSERVER}" = "Jack+ZitaBridge" ]
			then
				set_jack_zita_bridge
				set_soundserver
				jack_quickstart
				exit 0
			elif [ "${SOUNDSERVER}" = "Jack+PulseAudio" ]
			then
				set_jack_pulseaudio
				set_soundserver
				jack_quickstart
				exit 0
			fi
		fi

		if  [ "${SOUNDSERVER}" = "Alsa" ] || [ "${SOUNDSERVER}" = "PulseAudio" ]
		then
			if jack_control status | grep -qs started && ladish_control sisloaded | grep -qs yes
			then
				jack_quickstart --kill-jack
			fi
			if  [ "${SOUNDSERVER}" = "Alsa" ]
			then
				set_alsa
				set_soundserver
				exit 0
			elif [ "${SOUNDSERVER}" = "PulseAudio" ]
			then
				set_pulseaudio
				set_soundserver
				pulseaudio --start
				exit 0
			fi
		fi
	fi
}


configure_custom()
{
	parse_conf

	YAD_RATE=$(echo "48000@22050@32000@44100@88200@96000@192000" | sed -e 's|'"${RATE}"'@||' | sed -e 's|@'"${RATE}"'||')
	YAD_PERIOD=$(echo "1024@16@32@64@128@256@512@2048@4096" | sed -e 's|'"${PERIOD}"'@||' | sed -e 's|@'"${PERIOD}"'||')
	YAD_NPERIOD=$(echo "2@3@4@5@6@7@8@9@10@11@12@13@14@15@16@17@18@19@20" | sed -e 's|'"${NPERIOD}"'@||' | sed -e 's|@'"${NPERIOD}"'||')
	YAD_PORTMAX=$(echo "1024@128@256@512@2048" | sed -e 's|'"${PORTMAX}"'@||' | sed -e 's|@'"${PORTMAX}"'||')

	sleep 0.5
	CUSTOM_SETTINGS=$(yad --title="${TITLE}" \
				--width=460 \
				--image=/usr/share/icons/Gant/128x128/apps/gladish.png \
				--window-icon=jack-configure \
				--text-align=center \
				--text="$(eval_gettext $'<b><big><u>Jack and Ladish configuration</u></big></b>\\n\\nSettings:')" \
				--field=":LBL" \
				--form --field="$(eval_gettext $'Sample Rate:'):CB" \
				--field="$(eval_gettext $'Frames/Period:'):CB" \
				--field="$(eval_gettext $'Periods/Buffer:'):CB" \
				--field="$(eval_gettext $'Port Max:'):CB" \
				--item-separator=@ "" "${RATE}@${YAD_RATE}" "${PERIOD}@${YAD_PERIOD}" "${NPERIOD}@${YAD_NPERIOD}"  "${PORTMAX}@${YAD_PORTMAX}")
	ret=$?

	[ "${ret}" -eq 1 ] && launch_configure

	if [ "${ret}" -eq 0 ]
	then
		apply_changes
		#jack_control stop > /dev/null 2>&1
		#jack_quickstart --kill-jack

		CRATE=$(echo "${CUSTOM_SETTINGS}" | cut -d "|" -f2)
		CPERIOD=$(echo "${CUSTOM_SETTINGS}" | cut -d "|" -f3)
		CNPERIOD=$(echo "${CUSTOM_SETTINGS}" | cut -d "|" -f4)
		CPORTMAX=$(echo "${CUSTOM_SETTINGS}" | cut -d "|" -f5)

		apply_conf
		jack_quickstart --restart-jack
	fi
}


configure_rtirq()
{
	if grep -qs threadirqs /proc/cmdline && [ -e /etc/default/rtirq ]
	then
		if ffado-test ListDevices | grep "=== 1394"
		then 
			sudo sed -i -r -e 's|RTIRQ_NAME_LIST.*|RTIRQ_NAME_LIST="rtc ohci1394 snd usb i8042"|' \
					-e 's|RTIRQ_NON_THREADED.*|RTIRQ_NON_THREADED="rtc ohci1394 snd usb"|' \
				/etc/default/rtirq
		elif echo ${SOUNDCARD} | grep "USB-Audio"
		then 
			sudo sed -i -r -e 's|RTIRQ_NAME_LIST.*|RTIRQ_NAME_LIST="rtc usb snd i8042"|' \
					-e 's|RTIRQ_NON_THREADED.*|RTIRQ_NON_THREADED="rtc usb snd"|' \
				/etc/default/rtirq
		else
			sudo sed -i -r -e 's|RTIRQ_NAME_LIST.*|RTIRQ_NAME_LIST="rtc snd usb i8042"|' \
					-e 's|RTIRQ_NON_THREADED.*|RTIRQ_NON_THREADED="rtc snd usb"|' \
				/etc/default/rtirq
		fi
		sudo /etc/init.d/rtirq restart
	fi
}


apply_changes()
{
	gladish_runcheck

	sleep 0.5
	yad --title "${TITLE}" \
		--image=/usr/share/icons/Gant/64x64/status/dialog-question.png \
		--window-icon=jack-quickstart \
		--button=gtk-ok:0 \
		--button=gtk-cancel:1 \
		--buttons-layout=center \
		--text-align=center \
		--text="$(eval_gettext $'  Apply changes?  \\n\\n  Close all programs that are using sound,  \\n  then press OK.  ')"
	ter=$?

	#parse_conf

	if [ "${ter}" -eq 1 ]
	then
		launch_configure
	fi
}


gladish_runcheck()
{
	echo "I:  Check if Gladish is running..."
	if ps -ef | grep -v grep | grep gladish
	then
		GLADISH_RUN="TRUE"
		echo "I:  ... Gladish on"
	else
		GLADISH_RUN="FALSE"
		echo "I:  ... Gladish off"
	fi

	grep -qs "GLADISH_RUN=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^GLADISH_RUN.*@GLADISH_RUN=\"'"${GLADISH_RUN}"'\"@g' ~/.config/io-studio.conf \
		|| echo "GLADISH_RUN=\"${GLADISH_RUN}\"" >> ~/.config/io-studio.conf

}


set_conf1()
{
	echo "I:  Set configuration 1 (48000/1024/3)"

	CRATE="48000"
	CPERIOD="1024"
	CNPERIOD="3"
	CPORTMAX="1024"

	apply_conf
}


set_conf2()
{
	echo "I:  Set configuration 2 (48000/1024/2)"

	CRATE="48000"
	CPERIOD="1024"
	CNPERIOD="2"
	CPORTMAX="1024"

	apply_conf
}


set_conf3()
{
	echo "I:  Set configuration 3 (48000/512/3)"

	CRATE="48000"
	CPERIOD="512"
	CNPERIOD="3"
	CPORTMAX="1024"

	apply_conf
}


set_conf4()
{
	echo "I:  Set configuration 4 (48000/512/2)"

	CRATE="48000"
	CPERIOD="512"
	CNPERIOD="2"
	CPORTMAX="1024"

	apply_conf
}


set_conf5()
{
	echo "I:  Set configuration 5 (44100/1024/2)"

	CRATE="44100"
	CPERIOD="1024"
	CNPERIOD="2"
	CPORTMAX="1024"

	apply_conf
}


set_soundserver()
{
	grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"'"${SOUNDSERVER}"'\"@g' ~/.config/io-studio.conf \
		|| echo "SOUNDSERVER=\"${SOUNDSERVER}\"" >> ~/.config/io-studio.conf
}


apply_conf()
{
	[ "${CRATE}" -eq 48000 ] && ALTERNATE_RATE="44100" || ALTERNATE_RATE="48000"

	if ladish_control sisloaded | grep -qs yes
	then
		echo "I:  Stop/unload running ladish studio"
		ladish_control sstop
		ladish_control sunload
	fi
	grep -qs "RATE=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^RATE.*@RATE=\"'"${CRATE}"'\"@g' ~/.config/io-studio.conf \
		|| echo "RATE=\"${CRATE}\"" >> ~/.config/io-studio.conf

	grep -qs "PERIOD=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^PERIOD.*@PERIOD=\"'"${CPERIOD}"'\"@g' ~/.config/io-studio.conf \
		|| echo "PERIOD=\"${CPERIOD}\"" >> ~/.config/io-studio.conf

	grep -qs "NPERIOD=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^NPERIOD.*@NPERIOD=\"'"${CNPERIOD}"'\"@g' ~/.config/io-studio.conf \
		|| echo "NPERIOD=\"${CNPERIOD}\"" >> ~/.config/io-studio.conf

	grep -qs "PORTMAX=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^PORTMAX.*@PORTMAX=\"'"${CPORTMAX}"'\"@g' ~/.config/io-studio.conf \
		|| echo "PORTMAX=\"${CPORTMAX}\"" >> ~/.config/io-studio.conf

	echo "I:  Apply conf"
	[ -e ~/.config/pulse/daemon.conf ] && \
		sed -i -r -e 's@.*default-sample-rate.*@default-sample-rate = '"${CRATE}"'@g' \
			-e 's@.*alternate-sample-rate.*@alternate-sample-rate = '"${ALTERNATE_RATE}"'@g' \
		~/.config/pulse/daemon.conf

	[ -e ~/.ladish/studios/"${STUDIO}".xml ] && \
		sed -i -r -e 's@rate">.*@rate">'"${CRATE}"'</parameter>@g' \
			-e 's@period">.*@period">'"${CPERIOD}"'</parameter>@g' \
			-e 's@periodsize">.*@periodsize">'"${CPERIOD}"'</parameter>@g' \
			-e 's@nperiods">.*@nperiods">'"${CNPERIOD}"'</parameter>@g' \
			-e 's@port-max">.*@port-max">'"${CPORTMAX}"'</parameter>@g' \
		~/.ladish/studios/"${STUDIO}".xml
}


diag_error_module()
{
	sleep 0.5
	yad --title "${TITLE}" \
		--image=/usr/share/icons/Gant/64x64/status/dialog-error.png \
		--window-icon=jack-configure \
		--button=gtk-ok:0 \
		--buttons-layout=center \
		--selectable-labels \
		--text-align=center \
		--text="$(eval_gettext $'  Error, module snd-aloop is not loaded...  \\n\\n  Add: "snd-aloop" without quotes to /etc/modules and reboot,  \\n\\n  You can load it manually with the command:  \\n  sudo modprobe snd-aloop')"
}


done_window()
{
	yad --title "${TITLE}" \
		--image=/usr/share/icons/Gant/64x64/status/dialog-ok.png \
		--window-icon=jack-configure \
		--button=gtk-ok:0 \
		--text-align=center \
		--text="$(eval_gettext $'\\n  Update parameters for the soundcard:  \\n\\n  Done.  ')"
}


set_jack_alsa_loop()
{
	grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"Jack+AlsaLoop\"@g' ~/.config/io-studio.conf \
		|| echo "SOUNDSERVER=\"Jack+AlsaLoop\"" >> ~/.config/io-studio.conf

	asoundrc_loop
	pulse_jack
	pulse_custom_rate
}


set_jack_zita_bridge()
{
	grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"Jack+ZitaBridge\"@g' ~/.config/io-studio.conf \
		|| echo "SOUNDSERVER=\"Jack+ZitaBridge\"" >> ~/.config/io-studio.conf

	asoundrc_loop
	pulse_jack
	pulse_custom_rate
}


set_jack_pulseaudio()
{
	grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"Jack+PulseAudio\"@g' ~/.config/io-studio.conf \
		|| echo "SOUNDSERVER=\"Jack+PulseAudio\"" >> ~/.config/io-studio.conf

	asoundrc_noloop
	pulse_jack
	pulse_custom_rate
}


set_alsa()
{
	grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"Alsa\"@g' ~/.config/io-studio.conf \
		|| echo "SOUNDSERVER=\"Alsa\"" >> ~/.config/io-studio.conf

	asoundrc_noloop
	pulse_nojack
	pulse_fixed_rate
}


set_pulseaudio()
{
	grep -qs "SOUNDSERVER=" ~/.config/io-studio.conf \
		&& sed -i -e 's@^SOUNDSERVER.*@SOUNDSERVER=\"PulseAudio\"@g' ~/.config/io-studio.conf \
		|| echo "SOUNDSERVER=\"PulseAudio\"" >> ~/.config/io-studio.conf

	asoundrc_noloop
	pulse_nojack
	pulse_fixed_rate
}


asoundrc_loop()
{
	parse_conf

	if [ ! -e ~/.asoundrc.aloop ] && [ -e /etc/skel/.asoundrc.aloop ]
	then
		cp /etc/skel/.asoundrc.aloop ~/
	fi
	if [ -e ~/.asoundrc ] && [ ! -h ~/.asoundrc ]
	then
		mv ~/.asoundrc ~/.asoundrc-$(date +%Y.%m.%d-%H.%M).bak
	fi
	if [ -h ~/.asoundrc ]
	then
		rm -f ~/.asoundrc
		ln -sf ~/.asoundrc.aloop ~/.asoundrc
	fi
	if [ ! -e ~/.asoundrc ]
	then
		ln -sf ~/.asoundrc.aloop ~/.asoundrc
	fi
	sed -i -r -e 's@period_size.*@period_size '"${PERIOD}"'@g' \
			-e 's@rate.*@rate '"${RATE}"'@g' \
		~/.asoundrc
}


asoundrc_noloop()
{
	if [ -e ~/.asoundrc ] && [ ! -h ~/.asoundrc ]
	then
		mv ~/.asoundrc ~/.asoundrc-$(date +%Y.%m.%d-%H.%M).bak
	fi
	[ -e ~/.asoundrc ] && rm -f ~/.asoundrc
}


pulse_jack()
{
	[ -e ~/.config/pulse/client.conf ] \
		&& sed -i -r -e "s|.*default-sink = jack_out|default-sink = jack_out|" \
				-e "s|.*default-source = jack_in|default-source = jack_in|" \
			~/.config/pulse/client.conf
}


pulse_nojack()
{
	[ -e ~/.config/pulse/client.conf ] \
		&& sed -i -r -e "s|default-sink = jack_out|; default-sink = jack_out|" \
				-e "s|default-source = jack_in|; default-source = jack_in|" \
				-e "s|; ; |; |" \
			~/.config/pulse/client.conf
}


pulse_custom_rate()
{
	parse_conf

	if [ "${RATE}" -eq 48000 ]
	then
		ALTERNATE_RATE="44100"
	else
		ALTERNATE_RATE="48000"
	fi

	[ -e ~/.config/pulse/daemon.conf ] \
		&& sed -i -r -e 's@.*default-sample-rate.*@default-sample-rate = '"${RATE}"'@g' \
				-e 's@.*alternate-sample-rate.*@alternate-sample-rate = '"${ALTERNATE_RATE}"'@g' \
			~/.config/pulse/daemon.conf
}


pulse_fixed_rate()
{
	[ -e ~/.config/pulse/daemon.conf ] \
		&& sed -i -r -e 's@.*default-sample-rate.*@default-sample-rate = 44100@g' \
				-e 's@.*alternate-sample-rate.*@alternate-sample-rate = 48000@g' \
			~/.config/pulse/daemon.conf
}


# Validate arguments.
case "$1" in
	-h|--help)
		usage
		exit 0
		;;
	-cs|--check-soundcard)
		check_soundcard
		;;
	-sc1|--set-conf1)
		basic_checks
		parse_conf
		set_conf1
		;;
	-sc2|--set-conf2)
		basic_checks
		parse_conf
		set_conf2
		;;
	-sc3|--set-conf3)
		basic_checks
		parse_conf
		set_conf3
		;;
	-sc4|--set-conf4)
		basic_checks
		parse_conf
		set_conf4
		;;
	-sc5|--set-conf5)
		basic_checks
		parse_conf
		set_conf5
		;;
	-sjal|--set-jack-alsa-loop)
		set_jack_alsa_loop
		;;
	-sjzb|--set-jack-zita-bridge)
		set_jack_zita_bridge
		;;
	-sjpa|--set-jack-pulseaudio)
		set_jack_pulseaudio
		;;
	-sa|--set-alsa)
		set_alsa
		;;
	-spa|--set-pulseaudio)
		set_pulseaudio
		;;
	*)
		basic_checks
		launch_configure
		;;
esac


exit 0
