#!/bin/sh

is_duplex()
{
    [ -d /proc/asound/card$1/pcm0c -a -d /proc/asound/card$1/pcm0p ]
}

has_midi()
{
    [ -f /proc/asound/card$1/midi0 ]
}

guess_category()
{
    case $1 in

    *modem|intel8x0m)
	echo 7/modem
	;;

    usb*audio|*usx2y)
	echo 4/usb
	;;

    ac97*|ad1*|ali5*|als*|atiixp*|azt*|bt87*|cmi*|cs*|dt0*|fm801|hda*|i2c|\
	intel8x0|interwave|nm256|opl*|opti*|sb8*|sb16*|trident*|via*) 
	echo 5/integrated
	;;

    sbawe|ens*|es*|emi10*|ca0*|gus*|maestro*|wavefront|ymfpci)
	echo 3/consumer
	;;

    darla*|echo*|gina*|hdsp*|ice*|indigo*|mia*|mixart*|mona*|pcxhr|\
	rme*|vx*)
	echo 1/pro
	;;

    *)
	echo 6/unknown
	;;
    esac;
}

enumerate_modules()
{
    find /lib/modules/`uname -r` -name snd-\* -print | while read module; do
	module=`basename $module .ko`
	echo -n "$module: "
	module=${module#snd-}
        guess_category $module | sed 's,^[0-9]/,,'
    done
}

if [ "$1" = "-l" ]; then
    enumerate_modules
    exit 0
fi

get_name()
{
#    tail -n +$(($1*2+2)) /proc/asound/cards | head -1 | \
#    	sed 's/ *\(.*\) ([^)]*)$/\1/' | sed -e 's/ *\(.*\) at.*/\1/' -e 's/ with .*$//' -e 's/\[[^]]*\]$//'
    tail -n +$(($1*2+2)) /proc/asound/cards | head -1 | \
    	sed 's/ *\(.*\) ([^)]*)$/\1/' | sed -e 's/ *\(.*\) at.*/\1/' -e 's/\[[^]]*\]$//'
}

fw_get_bebob_name()
{
    if [ ! -x /usr/sbin/test-freebob ]; then
	return
    fi
    if [ ! -f /tmp/fb_$$ ]; then ###!!!! need proper tmpdir
	/usr/sbin/test-freebob xmldump > /tmp/fb_$$ 2>&1
    fi
    if grep -q "Error" /tmp/fb_$$; then
	:
    else
	cat /tmp/fb_$$ | sed -ne ':a' -e '/<NodeId>'"$1"'</b b' -e 'd' -e ':b' -e 'p' -e n -e 'b b' > /tmp/fb_"$$"_"$1"
	vendor=`grep "<Vendor>" /tmp/fb_"$$"_"$1" | head -1 | sed -e 's/^.*<Vendor>[ \t]*//' -e 's/[ \t]*<\/Vendor>.*$//'`
	model=`grep "<Model>" /tmp/fb_"$$"_"$1" | head -1 | sed -e 's/^.*<Model>[ \t]*//' -e 's/[ \t]*<\/Model>.*$//'`
	if [ -n "$vendor" -o -n "$model" ]; then
	    echo "$vendor $model"
        fi
    fi
}

fw_get_bebob_name_alt()
{
    freebob_downloader "$1" display > /tmp/fb_$$ 2>&1
    if grep -q "Error" /tmp/fb_$$; then
	echo ""
    else
	vendor=`grep "Vendor Name:" /tmp/fb_$$ | sed 's/^.*Name:[ \t]*//' | sed 's/[ \t]*$//'`
	model=`grep "Model Name:" /tmp/fb_$$ | sed 's/^.*Name:[ \t]*//' | sed 's/[ \t]*$//'`
	echo "$vendor $model"
    fi
}

{

node=0
number=0
nodecount=`cat /sys/bus/ieee1394/devices/fw-host0/node_count 2>/dev/null`
[ -z "$nodecount" ] && nodecount=0
while [ "$node" -lt "$nodecount" ]; do
    name=`fw_get_bebob_name "$node"`
    if [ -n "$name" ]; then
	echo "freebob:$number:0/firewire:audio:::$name"
	number=$(($number + 1))
    fi
    node=$(($node + 1))
done

for card in /proc/asound/card[0-9]*; do
	card=${card##*/}
	number=${card#card}
	module=`sed 's/^/ /' /proc/asound/modules | grep " $number " | sed 's/^.*snd[_-]//'`
	category=`guess_category $module`
	audio=""
	midi=""
	if is_duplex $number; then
	    audio=audio
	fi
	if has_midi $number; then
	    midi=midi
	fi
	name=`get_name $number`
	echo "alsa:$number:$category:$audio:$midi:$module:$name"
done 
} | sort -t ':' -k 3 -n | sed 's/:[0-9]\//:/' 

