#!/bin/bash

# musica 1.2 converts from and to different audio formats
# Copyright (C) 2006-2015 Cezary M. Kruk <c.kruk@bigfoot.com>

lame_bitrate="--r3mix -m s"
ogg_bitrate="-q 6"
flac_compression="-5"

function testpath()
{
    if [ "`which $1 2> /dev/null`" == "" ]
    then
        echo "There is no $1 program in the path."
        if [ "$1" == "oggenc" ]
        then
            echo "Install vorbis-tools package."
        elif [ "$1" == "mac" ]
        then
            echo "Install mac package..."
            echo "See: http://etree.org/shnutils/shntool/support/formats/ape/unix/3.99-u4-b5/."
        elif [ "$1" == "faad" ]
        then
            echo "Install faad2 or faad package."
        elif [ "$1" == "sox" ]
        then
            echo "Install sox package and libsox-fmt-mp3 library if required."
        elif [ "$1" == "mpcdec" ]
        then
            echo "Install musepack-tools package."
        elif [ "$1" == "ogg123" ]
        then
            echo "Install vorbis-tools package."
        else
            echo "Install $1 package."
        fi
        exit
    fi
}

testpath flac
testpath lame
testpath oggenc

ape2flac()
{
    testpath mac
    for file in *.ape
    do
        mac "$file" - -d | flac $flac_compression - -o "${file%ape}flac"
    done
}

ape2mp3()
{
    testpath mac
    for file in *.ape
    do
        mac "$file" - -d | lame $lame_bitrate - "${file%ape}mp3"
    done
}

ape2ogg()
{
    testpath mac
    for file in *.ape
    do
        mac "$file" - -d | oggenc $ogg_bitrate -o "${file%ape}ogg" -
    done
}

ape2wav()
{
    testpath mac
    for file in *.ape
    do
        mac "$file" "${file%ape}wav" -d
    done
}

flac2flac()
{
    for file in *.flac
    do
        flac -d -c "$file" | flac $flac_compression - -o "$file.flac"
    done
}

flac2mp3()
{
    for file in *.flac
    do
        flac -d -c "$file" | lame $lame_bitrate - "${file%flac}mp3"
    done
}

flac2ogg()
{
    for file in *.flac
    do
        flac -d -c "$file" | oggenc $ogg_bitrate -o "${file%flac}ogg" -
    done
}

flac2wav()
{
    testpath sox
    for file in *.flac
    do
        flac -d -c "$file" | sox -t wav - "${file%flac}wav"
    done
}

m4a2flac()
{
    testpath ffmpeg
    for file in *.m4a
    do
        ffmpeg -y -i "$file" -acodec flac "${file%m4a}flac"
    done
}

m4a2mp3()
{
    testpath faad
    for file in *.m4a
    do
        faad -o - "$file" | lame $lame_bitrate - "${file%m4a}mp3"
    done
}

m4a2ogg()
{
    testpath faad
    for file in *.m4a
    do
        faad -o - "$file" | oggenc $ogg_bitrate -o "${file%m4a}ogg" -
    done
}

m4a2wav()
{
    testpath faad
    for file in *.m4a
    do
        faad -o "${file%m4a}wav" "$file"
    done
}

mp32flac()
{
    testpath sox
    for file in *.mp3
    do
        sox "$file" -t wav - | flac $flac_compression - -o "${file%mp3}flac"
    done
}

mp32mp3()
{
    testpath sox
    for file in *.mp3
    do
        sox "$file" -t wav - | lame $lame_bitrate - "$file.mp3"
    done
}

mp32ogg()
{
    testpath sox
    for file in *.mp3
    do
        sox "$file" -t wav - | oggenc $ogg_bitrate -o "${file%mp3}ogg" -
    done
}

mp32wav()
{
    testpath mpg321
    testpath sox
    for file in *.mp3
    do
        sox "$file" -t wav "${file%mp3}wav"
    done
}

mpc2flac()
{
    testpath mpcdec
    for file in *.mpc
    do
        mpcdec "$file" - | flac $flac_compression - -o "${file%mpc}flac"
    done
}

mpc2mp3()
{
    testpath mpcdec
    for file in *.mpc
    do
        mpcdec "$file" - | lame $lame_bitrate - "${file%mpc}mp3"
    done
}

mpc2ogg()
{
    testpath mpcdec
    for file in *.mpc
    do
        mpcdec "$file" - | oggenc $ogg_bitrate -o "${file%mpc}ogg" -
    done
}

mpc2wav()
{
    testpath mpcdec
    testpath sox
    for file in *.mpc
    do
        mpcdec "$file" - | sox -t wav - "${file%mpc}wav"
    done
}

ogg2flac()
{
    testpath sox
    for file in *.ogg
    do
        sox "$file" -t wav - | flac $flac_compression - -o "${file%ogg}flac"
    done
}

ogg2mp3()
{
    testpath sox
    for file in *.ogg
    do
        sox "$file" -t wav - | lame $lame_bitrate - "${file%ogg}mp3"
    done
}

ogg2ogg()
{
    testpath sox
    for file in *.ogg
    do
        sox "$file" -t wav - | oggenc $ogg_bitrate -o "$file.ogg" -
    done
}

ogg2wav()
{
    testpath sox
    for file in *.ogg
    do
        sox "$file" -t wav "${file%ogg}wav"
    done
}

wav2flac()
{
    for file in *.wav
    do
        flac $flac_compression "$file" -o "${file%wav}flac"
    done
}

wav2mp3()
{
    for file in *.wav
    do
        lame $lame_bitrate "$file" "${file%wav}mp3"
    done
}

wav2ogg()
{
    for file in *.wav
    do
        oggenc $ogg_bitrate -o "${file%wav}ogg" "$file"
    done
}

wma2flac_old()
{
    testpath mplayer
    for file in *.wma
    do
        mplayer -ao pcm:file="${file%wma}wav" "$file"
    done
    for file in *.wav
    do
        flac $flac_compression "$file" -o "${file%wav}flac"
    done
}

wma2mp3_old()
{
    testpath mplayer
    for file in *.wma
    do
        mplayer -ao pcm:file="${file%wma}wav" "$file"
    done
    for file in *.wav
    do
        lame $lame_bitrate "$file" "${file%wav}mp3"
    done
}

wma2ogg_old()
{
    testpath mplayer
    for file in *.wma
    do
        mplayer -ao pcm:file="${file%wma}wav" "$file"
    done
    for file in *.wav
    do
        oggenc $ogg_bitrate -o "${file%wav}ogg" "$file"
    done
}

wma2wav()
{
    testpath mplayer
    for file in *.wma
    do
        mplayer -ao pcm:file="${file%wma}wav" "$file"
    done
}

wma2flac()
{
    testpath mplayer
    mkfifo fifo
    for file in *.wma
    do
        mplayer -ao pcm:file=fifo "$file" | flac $flac_compression fifo -o "${file%wma}flac"
    done
    rm fifo
}

wma2mp3()
{
    testpath mplayer
    mkfifo fifo
    for file in *.wma
    do
        mplayer -ao pcm:file=fifo "$file" | lame $lame_bitrate fifo "${file%wma}mp3"
    done
    rm fifo
}

wma2ogg()
{
    testpath mplayer
    mkfifo fifo
    for file in *.wma
    do
        mplayer -ao pcm:file=fifo "$file" | oggenc $ogg_bitrate -o "${file%wma}ogg" fifo
    done
    rm fifo
}

wma2wav_new()
{
    testpath mplayer
    testpath sox
    mkfifo fifo
    for file in *.wma
    do
        mplayer -ao pcm:file=fifo "$file" | sox -t wav fifo "${file%wma}wav"
    done
    rm fifo
}

help="yes"
for converter in  ape2flac     ape2mp3     ape2ogg     ape2wav     \
                 flac2flac    flac2mp3    flac2ogg    flac2wav     \
                  m4a2flac     m4a2mp3     m4a2ogg     m4a2wav     \
                  mp32flac     mp32mp3     mp32ogg     mp32wav     \
                  mpc2flac     mpc2mp3     mpc2ogg     mpc2wav     \
                  ogg2flac     ogg2mp3     ogg2ogg     ogg2wav     \
                  wav2flac     wav2mp3     wav2ogg                 \
                  wma2flac     wma2mp3     wma2ogg     wma2wav     \
                  wma2flac_old wma2mp3_old wma2ogg_old wma2wav_new
do
    if [ "$1" == "$converter" ]
    then
        help="no"
    fi
done

if [ "$help" == "no" ]
then
    $1
    exit
elif [ "$1" == "wav2wav" ]
then
    echo "musica: conversion from WAV to WAV is not allowed."
else
    echo "musica: converts from and to different audio formats"
    echo
    echo "musica [ ape2flac  ape2mp3  ape2ogg  ape2wav  "
    echo "        flac2flac flac2mp3 flac2ogg flac2wav  "
    echo "         m4a2flac  m4a2mp3  m4a2ogg  m4a2wav  "
    echo "         mp32flac  mp32mp3  mp32ogg  mp32wav  "
    echo "         mpc2flac  mpc2mp3  mpc2ogg  mpc2wav  "
    echo "         ogg2flac  ogg2mp3  ogg2ogg  ogg2wav  "
    echo "         wav2flac  wav2mp3  wav2ogg           "
    echo "         wma2flac  wma2mp3  wma2ogg  wma2wav ]"
    echo
fi

