# Maintainer: David Runge <dvzrv@archlinux.org>
# Contributor: Lieven Moors <lievenmoors@gmail.com>

# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
#  - export OPTIMIZATIONS to override Makefiles without x86isms

pkgbase=x42-plugins
pkgname=(
  x42-plugins
  x42-plugins-{lv2,standalone}
)
pkgver=20240611
pkgrel=1
pkgdesc="Professional audio processing units available as LV2-plugin and JACK-application"
arch=(x86_64)
url="https://x42-plugins.com/x42/"
license=(
  GPL-2.0-or-later
  GPL-3.0-or-later
)
makedepends=(
  cairo
  fftw
  ftgl
  gendesk
  glib2
  glu
  help2man
  jack
  liblo
  libltc
  libsamplerate
  libsndfile
  lv2
  pango
  ttf-dejavu
)
checkdepends=(
  kxstudio-lv2-extensions
  lv2lint
)
source=(
  https://gareus.org/misc/$pkgname/$pkgname-$pkgver.tar.xz
  $pkgname.png::https://x42-plugins.com/x42/static/img/x42.png
  $pkgname.directory
  $pkgname.menu
)
sha512sums=('19c782cb5f6f9ac22da448c8d72308f93e89c76eea4efa1e68a6bb1036201bde0cff16dc8996ca34b855ad5f6dfcdf882f4cd3045160b9083ebc023a5f680fd2'
            '956fdd8e04c846d06a5267d1748916744418e0ddfce0ac2e9dd3a1c1376aea61499177af80709d9fe78f8c0c2ddcbf9f9e5b2e413adc9a7eca9b648a87ad4860'
            'fef75b22b2c1fed8586af4dfd01ea291a7c1506e80ce384f05f13dc04c4b7e3e934003c20d89ae94f36ad1021b7ad75097da836ca30ee965b4107b559305b496'
            '411015b0feb8a289272cb821afa7e2a284d3e9d994a446baa73b3a6ce0f0ebd1e94c4cb3392a0afb1d741ce6d8b2d14c9bd124a0684b830275b4ba8e14680aa3')
b2sums=('1e744f90e3ee29fee9e8eb0e2791bb24e12a7aff2f200e0c68c2b7e692612340a9749041b193ea0b672a6822b1ea19247e2eddb0985f1e46a2afa230b8904298'
        '35a8cfcdf7f8c57ba655049a6d75b3bf9d253c25702a3f191d3f6cab215887f7de5025d025993861ae88c1b4daae132e9cc1ddf083e5b822f1b53a683c0fcaa3'
        'fb6557cd2e8b83dae1cb38503f2a72093085ddcc0a4ba2e5e0375f7063b83b3fb4180091ce10524cd336eeb33cffed45ada93055b960c9189f83d664216b33ee'
        '9c695f58099fcbfdce3e693e491d851ff7894a650ea12e079894176ef054b5f592785467c286bd8feaa340fdcdfb53d930b3a44ea890112e3fc1a4d172beb243')

_names=(
  darc
  dpl
  fat1
  fil4
  matrixmixer8x8
  meter
  mixtri
  phaserotate
  scope
  spectr
  stepseq
  tuna
)

_pick() {
  local p="$1" f d; shift
  for f; do
    d="$srcdir/$p/${f#$pkgdir/}"
    mkdir -p "$(dirname "$d")"
    mv "$f" "$d"
    rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
  done
}

prepare() {
  declare -A comments=(
    ["darc"]="A general purpose audio signal compressor"
    ["dpl"]="Look-ahead digital peak limiter intended but not limited to the final step of mastering or mixing"
    ["fat1"]="Auto-tuner based on Fons Adriaensen's zita-at1"
    ["fil4"]="4 band parametric equalizer with additional low+high shelf filters, Low and High-pass"
    ["matrixmixer8x8"]="Matrix Mixer 8x8"
    ["mixtri"]="Matrix mixer and trigger processor"
    ["phaserotate"]="Audio Phase rotate"
    ["scope"]="Simple audio oscilloscope with variable time scale, triggering, cursors and numeric readout"
    ["spectr"]="Spectrum Analyzer"
    ["stepseq"]="Simple step sequencer for moddevices.com"
  )
  declare -A generic=(
    ["darc"]="Dynamic Audio Range Compressor"
    ["dpl"]="Peak Limiter"
    ["fat1"]="Auto Tune"
    ["fil4"]="Parametric Equalizer"
    ["matrixmixer8x8"]="Matrix Mixer"
    ["mixtri"]="Mixer'n'Trigger"
    ["phaserotate"]="Phase Rotation"
    ["scope"]="Oscilloscope"
    ["spectr"]="Spectrum Analyzer"
    ["stepseq"]="Step Sequencer"
  )
  declare -A meter_types=(
    [0]='EBU R128 Meter'
    [1]='K20/RMS Meter (Stereo)'
    [2]='K14/RMS Meter (Stereo)'
    [3]='K12/RMS Meter (Stereo)'
    [4]='BBC Meter (Stereo)'
    [5]='BBC M-6'
    [6]='DIN Meter (Stereo)'
    [7]='EBU Meter (Stereo)'
    [8]='Nordic Meter (Stereo)'
    [9]='VU Meter (Stereo)'
    [10]='True-Peak and RMS Meter (Stereo)'
    [11]='DR-14 - Crest Factor Loudness Range Meter'
    [12]='Stereo Phase-Correlation Meter'
    [13]='Goniometer'
    [14]='Phase/Frequency Wheel'
    [15]='1/3 Octave Spectrum Analyzer'
    [16]='Stereo/Frequency Scope'
    [17]='Signal Distribution Histogram'
    [18]='Bit Meter'
    [19]='Surround Level 8'
  )
  declare -A tuna_types=(
    [0]='Instrument Tuner'
    [1]='Instrument Tuner (Spectrum)'
  )

  # XDG desktop files
  for name in "${_names[@]}"; do
    case "$name" in
      meter)
        for type in {0..19}; do
          gendesk -n -f \
                  --pkgname "com.x42_plugins.x42_meter_$type" \
                  --name "x42-meter ${meter_types[$type]}" \
                  --pkgdesc "${meter_types[$type]}" \
                  --exec "x42-meter $type" \
                  --icon "x42-meter" \
                  --genericname "Audio Meter"
        done
        ;;
      tuna)
        for type in {0,1}; do
          gendesk -n -f \
                  --pkgname "com.x42_plugins.x42_${name}_$type" \
                  --name "x42-${name} ${tuna_types[$type]}" \
                  --pkgdesc "${tuna_types[$type]}" \
                  --exec "x42-$name $type" \
                  --icon "x42-$name" \
                  --genericname "Music Instrument Tuner"
        done
        ;;
      *)
        gendesk -n -f \
                --pkgname "com.x42_plugins.x42_$name" \
                --name "x42-$name" \
                --pkgdesc "${comments[$name]}" \
                --exec "x42-$name" \
                --icon "x42-$name" \
                --genericname "${generic[$name]}"
        ;;
    esac
  done
  sed -e '/Categories/d' -i *.desktop

  cd $pkgname-$pkgver
  # moving images to correct location so installation is not such a hassle later on
  mv -v fat1.lv2/img/x42{_,-}fat1.png
  mv -v fil4.lv2/img/x42{_,-}fil4.png
  mv -v mixtri.lv2/img/x42{_,-}mixtri.png
  mv -v meters.lv2/img/x42-meter{s,}.png
  mv -v matrixmixer.lv2/img/x42-matrixmixer{,8x8}.png
}

build() {
  cd $pkgbase-$pkgver
  # replace ttf-freefont with ttf-liberation
  export FONTFILE=/usr/share/fonts/TTF/DejaVuSans-Bold.ttf
  export OPTIMIZATIONS="-ffast-math -fomit-frame-pointer -O3 -fno-finite-math-only"
  make
}

check() {
  local _name _version _convolver _controlfilter _default _meter _midifilter _onsettrigger _sisco _tuna
  local _controlfilters=(
    exp
    invert
    linearscale
    lowpass
    nlog
  )
  local _convolvers=(
    Mono
    MonoToStereo
    Stereo
  )
  local _defaults=(
    mono
    stereo
  )
  local _meters=(
    VUmono
    VUstereo
    BBCmono
    BBCstereo
    BBCM6
    EBUmono
    EBUstereo
    DINmono
    DINstereo
    NORmono
    NORstereo
    COR
    EBUr128
    goniometer
    spectr30mono
    spectr30stereo
    dBTPmono
    dBTPstereo
    K12mono
    K12stereo
    K14mono
    K14stereo
    K20mono
    K20stereo
    phasewheel
    stereoscope
    dr14mono
    dr14stereo
    TPnRMSmono
    TPnRMSstereo
    SigDistHist
    bitmeter
    surround8
    surround5
    surround4
    surround3
  )
  local _midifilters=(
    cctonote
    channelfilter
    channelmap
    chokefilter
    enforcescale
    eventblocker
    keyrange
    keysplit
    mapcc
    mapkeychannel
    mapkeyscale
    midichord
    mididelay
    mididup
    midistrum
    miditranspose
    monolegato
    noactivesensing
    nodup
    notetocc
    notetoggle
    ntapdelay
    onechannelfilter
    passthru
    quantize
    randvelocity
    scalecc
    sostenuto
    velocitygamma
    velocityrange
    velocityscale
  )
  local _onsettriggers=(
    bassdrum_mono
    bassdrum_stereo
  )
  local _siscos=(
    Mono
    Stereo
    3chan
    4chan
  )
  local _tunas=(
    one
    two
  )
  local _zconvolvers=(
    Mono
    CfgMono
    Stereo
    CfgStereo
    MonoToStereo
    CfgMonoToStereo
  )
  local _url="http://gareus.org/oss/lv2/"

  cd $pkgbase-$pkgver

  while IFS=" " read -r _name _version; do
    echo "lv2lint test for $_name $_version"
    case "$_name" in
      controlfilter.lv2 )
        for _controlfilter in "${_controlfilters[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_controlfilter"
        done
        ;;
      convoLV2 )
        for _convolver in "${_convolvers[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}$_name#$_convolver"
        done
        ;;
      darc.lv2|dpl.lv2|fil4.lv2 )
        for _default in "${_defaults[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_default"
        done
        ;;
      matrixmixer.lv2 )
        lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#i8o8"
        ;;
      meters.lv2 )
        for _meter in "${_meters[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_meter"
        done
        ;;
      midifilter.lv2 )
        for _midifilter in "${_midifilters[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_midifilter"
        done
        ;;
      mixtri.lv2 )
        lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#lv2"
        ;;
      onsettrigger.lv2 )
        for _onsettrigger in "${_onsettriggers[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_onsettrigger"
        done
        ;;
      sisco.lv2 )
        for _sisco in "${_siscos[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_sisco"
        done
        ;;
      spectra.lv2 )
        lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#Mono"
        ;;
      stepseq.lv2 )
        lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#s8n8"
        ;;
      tuna.lv2 )
        for _tuna in "${_tunas[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}#$_tuna"
        done
        ;;
      zconvo.lv2 )
        for _zconvolver in "${_zconvolvers[@]}"; do
          lv2lint -Mpack -I "$_name/build" "${_url}zeroconvolv#$_zconvolver"
        done
        ;;
      robtk )
        echo "Toolkit. Skipping..."
        ;;
      * )
        lv2lint -Mpack -I "$_name/build" "${_url}${_name//.lv2/}"
        ;;
    esac
  done < plugin.versions
}

package_x42-plugins() {
  depends=(
    x42-plugins-{lv2,standalone}=$pkgver
  )

  make install DESTDIR="$pkgdir/" PREFIX=/usr -C $pkgbase-$pkgver

  (
    cd "$pkgdir"
    _pick $pkgbase-lv2 usr/lib/lv2

    _pick $pkgbase-standalone usr/bin
    _pick $pkgbase-standalone usr/share
  )
}

package_x42-plugins-lv2() {
  pkgdesc+=" - LV2 plugins"
  depends=(
    cairo
    ftgl
    fftw libfftw3f.so
    gcc-libs
    glib2 libgobject-2.0.so
    glibc
    libglvnd
    libltc libltc.so
    libsamplerate libsamplerate.so
    libsndfile libsndfile.so
    libx11
    lv2-host
    pango libpango-1.0.so libpangocairo-1.0.so
  )
  groups=(
    lv2-plugins
    pro-audio
  )

  mv -v $pkgname/* "$pkgdir"
}

package_x42-plugins-standalone() {
  declare -A _dirs=(
      ["darc"]="darc.lv2"
      ["dpl"]="dpl.lv2"
      ["fat1"]="fat1.lv2"
      ["fil4"]="fil4.lv2"
      ["matrixmixer8x8"]="matrixmixer.lv2"
      ["meter"]="meters.lv2"
      ["mixtri"]="mixtri.lv2"
      ["phaserotate"]="phaserotate.lv2"
      ["scope"]="sisco.lv2"
      ["spectr"]="spectra.lv2"
      ["stepseq"]="stepseq.lv2"
      ["tuna"]="tuna.lv2"
  )

  pkgdesc+=" - JACK standalones"
  depends=(
    cairo
    fftw libfftw3f.so
    gcc-libs
    glib2 libgobject-2.0.so
    glibc
    hicolor-icon-theme
    jack libjack.so
    libglvnd
    liblo liblo.so
    libltc libltc.so
    libx11
    pango libpango-1.0.so libpangocairo-1.0.so
  )
  groups=(
    pro-audio
  )

  mv -v $pkgname/* "$pkgdir"

  # xdg desktop integration
  install -vDm 644 ./*.desktop -t "$pkgdir/usr/share/applications/"

  cd $pkgbase-$pkgver
  # icons
  for name in "${_names[@]}"; do
    install -vDm 644 "${_dirs[$name]}/img/x42-$name.png" -t "$pkgdir/usr/share/icons/hicolor/256x256/apps/"
  done
  install -vDm 644 ../$pkgbase.png -t "$pkgdir/usr/share/icons/hicolor/256x256/apps/"
  # menu integration
  install -vDm 644 ../$pkgbase.menu -t "$pkgdir/etc/xdg/menus/applications-merged/"
  install -vDm 644 ../$pkgbase.directory -t "$pkgdir/usr/share/desktop-directories/"
}

# vim:set ts=2 sw=2 et: