view src/xs_title.c @ 984:2b6184fa7e4a

Updated.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 31 Mar 2013 11:43:27 +0300
parents be2a8436461a
children
line wrap: on
line source

/*  
   XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS)

   Titlestring handling
   
   Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org>
   (C) Copyright 1999-2009 Tecnic Software productions (TNSP)

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation, Inc.,
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "xs_title.h"
#include "xs_support.h"
#include "xs_config.h"


static void xs_path_split(gchar *path, gchar **tmpFilename, gchar **tmpFilePath, gchar **tmpFileExt)
{
    gchar *tmpStr;
    
    /* Split the filename into path */
    *tmpFilePath = g_strdup(path);
    tmpStr = strrchr(*tmpFilePath, '/');
    if (tmpStr) tmpStr[1] = 0;

    /* Filename */
    *tmpFilename = strrchr(path, '/');
    if (*tmpFilename)
        *tmpFilename = g_strdup(*tmpFilename + 1);
    else
        *tmpFilename = g_strdup(path);

    tmpStr = strrchr(*tmpFilename, '.');
    tmpStr[0] = 0;

    /* Extension */
    *tmpFileExt = strrchr(path, '.');
}


/* Create a title string based on given information and settings.
 */
#define VPUTCH(MCH) \
    if (index < XS_BUF_SIZE) tmpBuf[index++] = MCH;

#define VPUTSTR(MSTR) {                                 \
    if (MSTR != NULL) {                                 \
        if ((index + strlen(MSTR) + 1) < XS_BUF_SIZE) { \
            strcpy(&tmpBuf[index], MSTR);               \
            index += strlen(MSTR);                      \
        } else                                          \
            index = XS_BUF_SIZE;                        \
    }                                                   \
}


const gchar *xs_get_sidmodel(gint model)
{
    switch (model)
    {
        case XS_SIDMODEL_6581: return "6581";
        case XS_SIDMODEL_8580: return "8580";
        case XS_SIDMODEL_ANY: return "ANY";
        case XS_SIDMODEL_UNKNOWN: return "???";
        default: return "";
    }
}

gchar *xs_make_titlestring(XSTuneInfo *p, gint subTune)
{
    gchar *tmpFilename, *tmpFilePath, *tmpFileExt,
        *str, *result, tmpStr[XS_BUF_SIZE], tmpBuf[XS_BUF_SIZE];
    XSSubTuneInfo *subInfo;
    gint index;

    /* Get filename parts */
    xs_path_split(p->sidFilename, &tmpFilename,
        &tmpFilePath, &tmpFileExt);
    
    /* Get sub-tune information */
    if ((subTune > 0) && (subTune <= p->nsubTunes)) {
        subInfo = &(p->subTunes[subTune - 1]);
    } else
        subInfo = NULL;


    /* Check if the titles are overridden or not */
#if !defined(AUDACIOUS_PLUGIN)
    if (!xs_cfg.titleOverride) {
        TitleInput *pTuple;
        
        pTuple = (TitleInput *) g_malloc0(sizeof(TitleInput));
        pTuple->__size = XMMS_TITLEINPUT_SIZE;
        pTuple->__version = XMMS_TITLEINPUT_VERSION;
        
        /* Create the input fields */
        pTuple->file_name = tmpFilename;
        pTuple->file_ext = tmpFileExt;
        pTuple->file_path = tmpFilePath;

        pTuple->track_name = g_strdup(p->sidName);
        pTuple->track_number = subTune;
        pTuple->album_name = NULL;
        pTuple->performer = g_strdup(p->sidComposer);
        pTuple->date = g_strdup_printf("%s%s%s",
            xs_get_sidmodel(p->sidModel1),
            (p->sidModel2 > XS_SIDMODEL_UNKNOWN) ? " + " : "",
            (p->sidModel2 > XS_SIDMODEL_UNKNOWN) ? xs_get_sidmodel(p->sidModel2) : "");

        pTuple->year = 0;
        pTuple->genre = g_strdup("SID-tune");
        pTuple->comment = g_strdup(p->sidCopyright);

        result = xmms_get_titlestring(xmms_get_gentitle_format(), pTuple);

        g_free(pTuple->track_name);
        g_free(pTuple->album_name);
        g_free(pTuple->performer);
        g_free(pTuple->date);
        g_free(pTuple->genre);
        g_free(pTuple->comment);
        g_free(pTuple);
    } else
#endif
    {
        /* Create the string */
        str = xs_cfg.titleFormat;
        index = 0;
        while (*str && (index < XS_BUF_SIZE)) {
            if (*str == '%') {
                str++;
                switch (*str) {
                case '%':
                    VPUTCH('%');
                    break;
                case 'f':
                    VPUTSTR(tmpFilename);
                    break;
                case 'F':
                    VPUTSTR(tmpFilePath);
                    break;
                case 'e':
                    VPUTSTR(tmpFileExt);
                    break;
                case 'p':
                    VPUTSTR(p->sidComposer);
                    break;
                case 't':
                    VPUTSTR(p->sidName);
                    break;
                case 'c':
                    VPUTSTR(p->sidCopyright);
                    break;
                case 's':
                    VPUTSTR(p->sidFormat);
                    break;
                case '1':
                    VPUTSTR(xs_get_sidmodel(p->sidModel1));
                    break;
                case '2':
                    VPUTSTR(xs_get_sidmodel(p->sidModel2));
                    break;
                case 'm':
                    VPUTSTR(xs_get_sidmodel(p->sidModel1));
                    if (p->sidModel2 > XS_SIDMODEL_UNKNOWN)
                    {
                        VPUTSTR(" + ");
                        VPUTSTR(xs_get_sidmodel(p->sidModel2));
                    }
                    break;
                case 'C':
                    if (subInfo && (subInfo->tuneSpeed > 0)) {
                        switch (subInfo->tuneSpeed) {
                        case XS_CLOCK_PAL:
                            VPUTSTR("PAL");
                            break;
                        case XS_CLOCK_NTSC:
                            VPUTSTR("NTSC");
                            break;
                        case XS_CLOCK_ANY:
                            VPUTSTR("ANY");
                            break;
                        case XS_CLOCK_VBI:
                            VPUTSTR("VBI");
                            break;
                        case XS_CLOCK_CIA:
                            VPUTSTR("CIA");
                            break;
                        default:
                            g_snprintf(tmpStr, XS_BUF_SIZE,
                            "%iHz", subInfo->tuneSpeed);
                            VPUTSTR(tmpStr);
                        }
                    } else
                        VPUTSTR("?");
                    break;
                case 'n':
                    g_snprintf(tmpStr, XS_BUF_SIZE, "%i", subTune);
                    VPUTSTR(tmpStr);
                    break;
                case 'N':
                    g_snprintf(tmpStr, XS_BUF_SIZE, "%i", p->nsubTunes);
                    VPUTSTR(tmpStr);
                    break;
                }
            } else
                VPUTCH(*str);

            str++;
        }

        tmpBuf[index] = 0;

        /* Make resulting string */
        result = g_strdup(tmpBuf);
    }

    /* Free temporary strings */
    g_free(tmpFilename);
    g_free(tmpFilePath);

    return result;
}