#!/bin/sh
#             __________               __   ___.
#   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
#   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
#   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
#   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
#                     \/            \/     \/    \/            \/
# $Id$
#
# Copyright 2006 Jonas Häggqvist, some parts Copyright 2004 Daniel Gudlat
#
# All files in this archive are subject to the GNU General Public License.
# See the file COPYING in the source tree root for full license agreement.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.

# Include voicecommon.sh from the same dir as this script
# Any settings from voicecommon can be overridden if added below the following
# line.
source `dirname $0`'/voicecommon.sh'

####################
# General settings #
####################

# These settings can be overridden by passing a file with definitions as
# the fourth parameter to this script

# which TTS engine to use. Available: festival, flite, espeak
TTS_ENGINE=festival
# which encoder to use, available: lame, speex, vorbis (only lame will produce
# functional voice clips at this point)
ENCODER=lame
# Where to save temporary files
TEMPDIR=/tmp
# List of IDs to send to voicefont
VOICEFONTIDS=voicefontids

###################
# End of settings #
###################

TARGET_ID="$4"
createvoicefile() {
    RLANG="$1"
    $GENLANG -e=$ENGLISH -o -t=$TARGET $LANG_FILE > $VOICEFONTIDS
    $VOICEFONT "$VOICEFONTIDS" "$TARGET_ID" "$TEMPDIR/" "./$RLANG.voice"
    rm -f $VIOCEFONTIDS
}

deletefiles() {
    # XXX: might be unsafe depending on the value of TEMPDIR
    rm -f "${TEMPDIR}"/LANG_*
    rm -f "${TEMPDIR}"/VOICE_*
    rm -f "${TEMPDIR}"/NOT_USED_*
}

generateclips() {
    ROCKBOX_DIR="$1"
    RLANG="$2"
    TARGET="$3"
    GENLANG="$ROCKBOX_DIR"/tools/genlang
    ENGLISH="$ROCKBOX_DIR"/apps/lang/english.lang
    LANG_FILE="$ROCKBOX_DIR"/apps/lang/$RLANG.lang

    $GENLANG -e=$ENGLISH -o -t=$TARGET $LANG_FILE |(
    i=0
    while read line; do
        case `expr $i % 3` in
            0)
                # String ID no.
                NUMBER=`echo $line |cut -b 2-`
                ;;
            1)
                # String ID
                ID=`echo $line |cut -b 5-`
                ;;
            2)
                # String
                STRING=`echo $line |cut -b 8-`
                # xxx: Should the hash include encoder/tts options?
                POOL_FILE=${POOL}/`echo "$STRING" |md5sum|cut -b-32`-${RLANG}.mp3

                if [ -n "$POOL" ]; then
                    # we have a common pool of snippets, check that first
                    # for available mp3 sounds, and if it is available copy
                    # (symlink!) it over
                    if [ -f "$POOL_FILE" ]; then
                        echo "Re-using $ID from pool (${POOL_FILE})"
                        if [ ! -e "$TEMPDIR/$ID".mp3 ]; then
                            # only do this if not present
                            cp -f "$POOL_FILE" "$TEMPDIR/$ID".mp3
                        fi
                    fi
                fi

                # only make an mp3 if not already present
                if [ ! -e "$TEMPDIR/$ID".mp3 ]; then
                    # Now generate the file
                    voice "$STRING" "$TEMPDIR/$ID".wav
                    if [ -n "$POOL" ]; then
                        # create it in the pool, symlink it back
                        encode "$TEMPDIR/$ID".wav "$POOL_FILE"
                        cp -f "$POOL_FILE" "$TEMPDIR/$ID".mp3
                    else
                        encode "$TEMPDIR/$ID".wav "$TEMPDIR/$ID".mp3
                    fi
                fi
                ;;
        esac
        i=`expr $i + 1`
    done
    )
}

if [ -z "$4" ]; then
    echo "Usage: $0 rockboxdirectory language target targetid [settingsfile]";
    exit 32
else
    if [ ! -d "$1" ] || [ ! -f "$1/tools/genlang" ]; then
        echo "Error: $1 is not a Rockbox directory"
        exit 33
    fi
    # Check for valid language
    if [ ! -f "$1/apps/lang/$2.lang" ]; then
        echo "Error: $2 is not a valid language"
        exit 34
    fi
    if [ ! -z "$5" ]; then
        if [ -f "$5" ]; then
            # Read settings from file
            . "$5"
        else
            echo "Error: $5 does not exist"
            exit 36
        fi
    fi
    # XXX: check for valid $TARGET?
fi

VOICEFONT=`dirname $0`/voicefont
if [ ! -x $VOICEFONT ]; then
    echo "Error: $VOICEFONT does not exist or is not executable"
    exit 35
fi

init_tts
init_encoder
generateclips "$1" "$2" "$3"
stop_tts
createvoicefile "$2"
deletefiles
