#!/bin/sh

# This script runs pianobooster with fluidsynth
# It supports JACK and ALSA both
# It switches on JACK automatically if ALSA is not available
# License: same with Pianobooster
# Author: Alexey Loginov <alexl@mageia.org>

MES1="Error: SoundFonts SF1 and SF2 were not found!"
MES2="Error: fluidsynth was not run!"
MES3="Error: SoundFont SF was not found!"
MES4="Supported audio drivers are jack, alsa!"
MES5="Please try again!"
MES6="Error: fluidsynth was not found or broken!"
MES7="Error: jackd was not found!"
MES8="Starting fluidsynth..."
MES9="Please wait 10 more seconds!"
MES10="Fluidsynth does not have ALSA support!"
MES11="Switching on using JACK..."
MES12="Error: pianobooster was not found!"
MES13="Error: No support for audio driver:"
MES14="Ignoring..."

use_jack="0"
audioDevice="plughw:0"
bufferCounts="6"
bufferSize="128"
chorus="0"
masterGain="0.4"
reverb="0"
sampleRate="44100"

if [ -f ~/.config/PianoBooster/"Piano Booster.ini" ]
then
  cp -f ~/.config/PianoBooster/"Piano Booster.ini" ~/.config/PianoBooster/PianoBooster.ini
  sed -i '/\[/d' ~/.config/PianoBooster/PianoBooster.ini
  sed -i '/^$/d' ~/.config/PianoBooster/PianoBooster.ini
  sed -i "s|=|=\'|g" ~/.config/PianoBooster/PianoBooster.ini
  sed -i "s|$|\'|g" ~/.config/PianoBooster/PianoBooster.ini
  sed -i "s|''|'|g" ~/.config/PianoBooster/PianoBooster.ini
  sed -i "s|'\"='\"'|'='|g" ~/.config/PianoBooster/PianoBooster.ini
  . ~/.config/PianoBooster/PianoBooster.ini 2>/dev/null
  rm -f ~/.config/PianoBooster/PianoBooster.ini
fi

if [ ! -z "$audioDeviceLineEdit" ]
then
  audioDevice="$audioDeviceLineEdit"
fi

if [ ! -z "$bufferCountsSpin" ]
then
  bufferCounts="$bufferCountsSpin"
fi

if [ ! -z "$bufferSizeSpin" ]
then
  bufferSize="$bufferSizeSpin"
fi

if [ ! -z "$masterGainSpin" ]
then
  masterGain="$masterGainSpin"
fi

if [ ! -z "$sampleRateCombo" ]
then
  sampleRate="$sampleRateCombo"
fi

if [ "$audioDriverCombo" = "jack" ]
then
  use_jack="1"
fi

if [ "$chorusCheck" = "true" ]
then
  chorus="1"
fi

if [ "$reverbCheck" = "true" ]
then
  reverb="1"
fi

lang=`echo $LANGUAGE|cut -d ":" -f 2`

if [ -z "$lang" ]
then
  lang=`echo $LANG|cut -d "." -f 1`
  if [ ! "$lang" = "pt_BR" ] && [ ! "$lang" = "bs_BA" ] && [ ! "$lang" = "zh_HK" ]
  then
     lang=`echo $LANG|cut -d "_" -f 1`
  fi
fi

case $lang in
     ru|be)
          MES1="Ошибка: Звуковые шрифты SF1 и SF2 не были найдены!"
          MES2="Ошибка: fluidsynth не был запущен!"
          MES3="Ошибка: Звуковой шрифт SF не был найден!"
          MES4="Поддерживаемые аудио драйверы - jack, alsa!"
          MES5="Пожалуйста, попытайтесь снова!"
          MES6="Ошибка: fluidsynth не был найден, или он неработоспособен!"
          MES7="Ошибка: jackd не был найден!"
          MES8="Запускается fluidsynth..."
          MES9="Пожалуйста, ожидайте около 10 секунд!"
          MES10="Fluidsynth не имеет поддержки ALSA!"
          MES11="Переключение на использование JACK..."
          MES12="Ошибка: pianobooster не был найден!"
          MES13="Ошибка: Нет поддержки для аудио драйвера:"
          MES14="Игнорирование..."
          ;;
     fi)
          MES1="Virhe: SF1 ja SF2 ei löytynyt!"
          MES2="Virhe: fluidsynth ei toimi!"
          MES3="Virhe: SF ei löytynyt!"
          MES5="Yritä uudelleen!"
          MES6="Virhe: fluidsynth ei löytynyt tai rikki!"
          MES7="Virhe: jackd ei löytynyt!"
          MES8="Alkaa fluidsynth..."
          MES9="Odota 10 sekuntia!"
          MES10="Fluidsynthillä ei ole ALSA-tukea!"
          MES11="Kytketään käyttäen JACK..."
          MES12="Virhe: pianobooster ei löytynyt!"
          ;;
     de)
          MES1="Fehler: SoundFonts SF1 und SF2 wurden nicht gefunden!"
          MES2="Fehler: Fluidsynth wurde nicht ausgeführt!"
          MES3="Fehler: SoundFont SF wurde nicht gefunden!"
          MES4="Unterstützte Audio-Treiber sind JACK und ALSA!"
          MES5="Bitte erneut versuchen!"
          MES6="Fehler: Fluidsynth wurde nicht gefunden oder ist beschädigt!"
          MES7="Fehler: jackd wurde nicht gefunden!"
          MES8="Fluidsynth wird gestartet..."
          MES9="Bitte noch 10 Sekunden warten!"
          MES10="Fluidsynth bietet keine ALSA-Unterstützung!"
          MES11="Es wird zu JACK gewechselt..."
          MES12="Fehler: pianobooster wurde nicht gefunden!"
          MES13="Fehler: Keine Unterstützung für den Audio-Treiber."
          MES14="Ignorieren..."
          ;;
     uk)
          MES1="Помилка: не знайдено звукових шрифтів SF1 та SF2!"
          MES2="Помилка: fluidsynth не запущено!"
          MES3="Помилка: не знайдено звукового шрифту SF!"
          MES5="Будь ласка, повторіть спробу!"
          MES6="Помилка: fluidsynth не знайдено або дані програми пошкоджено!"
          MES7="Помилка: jackd не знайдено!"
          MES8="Запускаємо fluidsynth..."
          MES9="Будь ласка, зачекайте ще 10 секунд!"
          MES10="У Fluidsynth не передбачено підтримки ALSA!"
          MES11="Перемикаємося на використання JACK..."
          MES12="Помилка: pianobooster не знайдено!"
          ;;
     cs)
          MES1="Chyba: Zvukové banky SF1 a SF2 nebyly nalezeny!"
          MES2="Chyba: fluidsynth nebyl spuštěn!"
          MES3="Chyba: Zvuková banka SF nebyla nalezena!"
          MES5="Zkuste to, prosím, znovu!"
          ;;
     gl)
          MES1="Erro: Non se atopou SoundFonts SF1 e SF2!"
          MES2="Erro: o fluidsynth non foi executado!"
          MES3="Erro: Non se atopou SoundFont SF!"
          MES5="Tenteo de novo!"
          ;;
     bg)
          MES1="Грешка: SoundFonts SF1 и SF2 не бяха намерени!"
          MES2="Грешка: Не намирам fluidsynth!"
          MES5="Моля, опитайте отново!"
          ;;
     pl)
          MES1="Błąd: SoundFonts SF1 i SF2 nie zostały znalezione!"
          MES2="Błąd: fluidsynth nie został uruchomiony!"
          MES3="Błąd: Nie znaleziono SoundFont SF!"
          MES4="Wspierane sterowniki dźwięku to: JACK, ALSA!"
          MES5="Spróbuj ponownie!"
          MES6="Błąd: fluidsynth nie został znaleziony lub jest uszkodzony!"
          MES7="Błąd: jackd nie został znaleziony!"
          MES8="Uruchamianie fludsynth..."
          MES9="Poczekaj jeszcze 10 sekund!"
          MES10="Fluidsynth nie ma wsparcia ALSA!"
          MES11="Przełączanie na JACK..."
          MES12="Błąd: pianobooster nie został znaleziony!"
          MES13="Błąd: Brak wsparcia dla sterownika dźwięku."
          MES14="Ignorowanie..."
          ;;
esac

if [ -f "/usr/share/soundfonts/FluidR3_GM.sf2" ]
then
  sf2_1="/usr/share/soundfonts/FluidR3_GM.sf2"
fi

if [ -f "/usr/share/soundfonts/FluidR3_GS.sf2" ]
then
  sf2_2="/usr/share/soundfonts/FluidR3_GS.sf2"
fi

if [ -f "/usr/share/sounds/sf2/FluidR3_GM.sf2" ]
then
  sf2_1="/usr/share/sounds/sf2/FluidR3_GM.sf2"
fi

if [ -f "/usr/share/sounds/sf2/FluidR3_GS.sf2" ]
then
  sf2_2="/usr/share/sounds/sf2/FluidR3_GS.sf2"
fi

if [ -f "/usr/local/share/sounds/sf2/FluidR3_GM.sf2" ]
then
  sf2_1="/usr/local/share/sounds/sf2/FluidR3_GM.sf2"
fi

if [ -f "/usr/local/share/sounds/sf2/FluidR3_GS.sf2" ]
then
  sf2_2="/usr/local/share/sounds/sf2/FluidR3_GS.sf2"
fi

notify_send=`notify-send -v 2>/dev/null`

fluidsynth=`fluidsynth -V 2>/dev/null`

pianobooster=`pianobooster -v 2>/dev/null`

if [ -z "$pianobooster" ]
then
  echo "$MES12"
  if [ ! -z "$notify_send" ]
  then
    notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES12"
  fi
  exit 1
fi

if [ -z "$fluidsynth" ]
then
  echo "$MES6"
  if [ ! -z "$notify_send" ]
  then
    notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES6"
  fi
  exit 1
fi

if [ ! -z "$SoundFont2_1" ]
then
  if [ ! -f "$SoundFont2_1" ]
  then
    MES0=`echo "$MES3"|sed "s|SF|$SoundFont2_1|g"`
    echo "$MES0" "$MES14"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES0 $MES14"
    fi
  else
    sf2_1="$SoundFont2_1"
    sf2_2=""
  fi
fi

if [ ! -z "$SoundFont2_2" ]
then
  if [ ! -f "$SoundFont2_2" ]
  then
    MES0=`echo "$MES3"|sed "s|SF|$SoundFont2_2|g"`
    echo "$MES0" "$MES14"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES0 $MES14"
    fi
  else
    sf2_1=""
    sf2_2="$SoundFont2_2"
  fi
fi

if [ ! -z "$SoundFont2_1" ] && [ ! -z "$SoundFont2_2" ]
then
  if [ ! -f "$SoundFont2_1" ] && [ ! -f "$SoundFont2_2" ]
  then
    MES0=`echo "$MES1"|sed "s|SF1|$sf2_1|g"|sed "s|SF2|$sf2_2|g"`
    echo "$MES0" "$MES14"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES0 $MES14"
    fi
  else
    sf2_1="$SoundFont2_1"
    sf2_2="$SoundFont2_2"
  fi
fi

if [ -z "$sf2_1" ]
then
    MES0=`echo "$MES3"|sed "s|SF|FluidR3_GM.sf2|g"`
    echo "$MES0"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES0"
    fi
    exit 1
fi

if [ ! "$audioDriverCombo" = "jack" ] && [ ! "$audioDriverCombo" = "alsa" ] && [ ! -z "$audioDriverCombo" ]
then
  echo "$MES13" "$audioDriverCombo". "$MES4" "$MES14"
  if [ ! -z "$notify_send" ]
  then
    notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES13 $audioDriverCombo. $MES4 $MES14"
  fi
fi

if [ ! -z "$sf2_1" ] && [ -z "$sf2_2" ]
then
  if [ ! -f "$sf2_1" ]
  then
    MES0=`echo "$MES3"|sed "s|SF|$sf2_1|g"`
    echo "$MES0"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES0"
    fi
    exit 1
  fi
fi

if [ -z "$sf2_1" ] && [ ! -z "$sf2_2" ]
then
  if [ ! -f "$sf2_2" ]
  then
    MES0=`echo "$MES3"|sed "s|SF|$sf2_2|g"`
    echo "$MES0"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES0"
    fi
    exit 1
  fi
fi

alsa=`fluidsynth -o help|grep alsa`

if [ "$use_jack" = "0" ] && [ -z "$alsa" ]
then
  echo "$MES10" "$MES11"
  if [ ! -z "$notify_send" ]
  then
    notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES10 $MES11"
  fi
  use_jack="1"
  sed -i "s|audioDriverCombo=.*|audioDriverCombo=jack|g" ~/.config/PianoBooster/"Piano Booster.ini" 2>/dev/null
fi

if [ ! -f "/usr/bin/jackd" ] && [ "$use_jack" = "1" ]
then
  if [ ! -f "/usr/local/bin/jackd" ]
  then
    echo "$MES7"
    if [ ! -z "$notify_send" ]
    then
      notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES7"
    fi
    exit 1
  fi
fi

if [ "$use_jack" = "1" ] && [ ! -z `uname -s|grep BSD` ]
then
  if [ ! -f ~/.jackdrc ]
  then
    echo "/usr/local/bin/jackd -r -d oss" > ~/.jackdrc
    touch ~/.pianobooster
  fi
fi

if [ "$use_jack" = "1" ]
then
  echo "$MES8" "$MES9"
  if [ ! -z "$notify_send" ]
  then
    notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES8 $MES9"
  fi
fi

if [ "$use_jack" = "1" ]
then
  if [ ! -z "$alsa" ]
  then
    fluidsynth -i -s -g $masterGain -C $chorus -R $reverb -r $sampleRate -c $bufferCounts -z $bufferSize -l -a jack -o midi.alsa_seq.id=fs -j $sf2_1 $sf2_2 &
  else
    fluidsynth -i -s -g $masterGain -C $chorus -R $reverb -r $sampleRate -c $bufferCounts -z $bufferSize -l -a jack -j $sf2_1 $sf2_2 &
  fi
else
  fluidsynth -i -s -g $masterGain -C $chorus -R $reverb -r $sampleRate -c $bufferCounts -z $bufferSize -l -a alsa -o audio.alsa.device=$audioDevice -o midi.alsa_seq.id=fs $sf2_1 $sf2_2 &
fi

PID=$!

if [ "$use_jack" = "1" ]
then
  sleep 10
else
  sleep 3
fi

process=`ps -p $PID -o comm= 2>/dev/null`

if [ -z $process ]
then
  echo "$MES2 $MES5"
  if [ ! -z "$notify_send" ]
  then
    notify-send -a pianobooster -i pianobooster "PianoBooster" "$MES2 $MES5"
  fi
  exit 1
fi

pianobooster

kill $PID

if [ "$use_jack" = "1" ]
then
  sleep 5
fi

if [ -f ~/.pianobooster ]
then
  rm -f ~/.jackdrc
  rm -f ~/.pianobooster
fi
