#!/bin/bash

INSMOD="/sbin/insmod"
MODDIR="../modules"
MAP="../snd.map"
OLDMAP="../snd.map.old"

function basic() {
  if ! $INSMOD -m $MODDIR/snd.o > $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-mixer.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-pcm.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-pcm1.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-pcm1-oss.o >> $MAP; then exit 1; fi  
  if ! $INSMOD -m $MODDIR/snd-midi.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-timer.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-synth.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-seq.o >> $MAP; then exit 1; fi
  if ! $INSMOD -m $MODDIR/snd-seq-midi.o >> $MAP; then exit 1; fi
}

function insert() {
  if ! $INSMOD -m $MODDIR/$@ >> $MAP; then exit 1; fi
}

function restore() {
  if [ -r /etc/asound/$1 ]; then
    /usr/sbin/alsactl -f /etc/asound/$1 restore
  fi
}

if [ -z "$1" ]; then
  echo "Specify soundcard ID..."
  exit
fi

mv -f $MAP $OLDMAP

./remove

case "$1" in
  interwave-stb|stb)
    basic
    insert snd-cs4231.o
    insert snd-gus.o
    insert snd-i2c.o
    insert snd-tea6330t.o
    insert snd-interwave-stb.o snd_dma1=5 snd_dma2=6 snd_midi=1
    restore interwave-stb.conf
    ;;
  interwave|iw)
    basic
    insert snd-cs4231.o
    insert snd-gus.o
    insert snd-interwave.o snd_dma1=5 snd_dma2=6 snd_midi=1
    restore interwave.conf
    ;;
  es1688)
    basic
    insert snd-es1688.o
    insert snd-mpu401-uart.o 
    insert snd-opl3.o
    insert snd-audiodrive1688.o snd_mpu_port=0x330
    restore es1688.conf
    ;;
  es1869)
    basic
    insert snd-es1869.o
    insert snd-mpu401-uart.o 
    insert snd-opl3.o
    insert snd-audiodrive1869.o
    restore es1869.conf
    ;;
  sb16)
    basic
    insert snd-sb-dsp.o
    insert snd-mpu401-uart.o 
    insert snd-opl3.o
    insert snd-sb16.o snd_irq=5 snd_dma8=1 snd_dma16=5
    restore sb16.conf
    ;;
  sbawe)
    basic
    insert snd-sb-dsp.o
    insert snd-mpu401-uart.o 
    insert snd-opl3.o
    insert snd-emu8000.o
    insert snd-sbawe.o snd_irq=5 snd_dma8=1 snd_dma16=5
    restore sbawe.conf
    ;;
  sb8)
    basic
    insert snd-sb-dsp.o
    insert snd-opl3.o
    insert snd-sb8.o snd_irq=5 snd_dma8=1
    restore sb8.conf
    ;;
  gusm*|max)
    basic
    insert snd-cs4231.o
    insert snd-gus.o
    insert snd-gusmax.o
    restore gusmax.conf
    ;;
  gusc*|clas*)
    basic
    insert snd-gus.o
    insert snd-gusclassic.o snd_irq=11 snd_dma1=6 snd_dma2=7
    restore gusclassic.conf
    ;;
  guse*|ext*)
    basic
    insert snd-es1688.o
    insert snd-mpu401-uart.o 
    insert snd-opl3.o
    insert snd-gus.o
    insert snd-gusextreme.o snd_irq1=11 snd_mpu_port=0x300
    restore gusextreme.conf
    ;;
  opl3sa)
    basic
    insert snd-cs4231.o
    insert snd-mpu401-uart.o
    insert snd-opl3.o
    insert snd-opl3sa.o snd_port=0x100 snd_wss_port=0xe80 \
                        snd_fm_port=0x388 snd_midi_port=0x300 \
                        snd_irq=5 snd_dma1=0 snd_dma2=1
    restore opl3sa.conf
    ;;
  mozart)
    basic
    insert snd-ad1848.o
    insert snd-mozart.o
    restore mozart.conf
    ;;
  p1)
    basic
    insert snd-sb-dsp.o
    insert snd-mpu401-uart.o 
    insert snd-sb16.o snd_irq=5 snd_dma8=1 snd_dma16=5 snd_mpu_port=0x330
    insert snd-gus.o
    insert snd-gusclassic.o snd_dma2=-1
    restore p1.conf
    ;;
  p2)
    basic
    insert snd-cs4231.o
    insert snd-es1688.o
    insert snd-mpu401-uart.o 
    insert snd-gus.o
    insert snd-gusmax.o
    insert snd-gusextreme.o snd_irq1=11 snd_mpu_port=0x300
    restore p2.conf
    ;;
  s3)
    basic
    insert snd-mpu401-uart.o 
    insert snd-s3-86c617.o
    insert snd-opl3.o
    insert snd-sonicvibes.o snd_reverb=1
    restore sonicvibes.conf
    ;;
  audiopci)
    basic
    insert snd-ac97-codec.o
    insert snd-es1370.o
    insert snd-audiopci.o
    restore es1370.conf
    ;;
  cs4232)
    basic
    insert snd-mpu401-uart.o 
    insert snd-cs4231.o
    insert snd-opl3.o
    insert snd-card-cs4232.o snd_port=0x534 \
		snd_fm_port=0x388 snd_mpu_port=0x330 snd_jport=0x208 \
		snd_dma1=1 snd_dma2=0 \
		snd_irq=5 snd_mpu_irq=7
    restore cs4232.conf
    ;;
  cs4236)
    basic
    insert snd-mpu401-uart.o 
    insert snd-cs4231.o
    insert snd-cs4236.o
    insert snd-opl3.o
#    insert snd-card-cs4236.o snd_port=0x534 snd_cport=0x120 \
#		snd_fm_port=0x388 snd_mpu_port=0x330 snd_jport=0x208 \
#		snd_dma1=1 snd_dma2=0 \
#		snd_irq=5 snd_mpu_irq=7
    insert isapnp.o
    insert snd-card-cs4236.o
    restore cs4236.conf
    ;;
  detect)
    if ! $INSMOD -m $MODDIR/snd.o > $MAP; then exit 1; fi
    if ! $INSMOD -m $MODDIR/snd-detect.o >> $MAP; then exit 1; fi
    cat /proc/asound/detect
    ;;
  *)
    echo "Unknown soundcard $1..."
    ;;
esac
echo "Insert done..."
