view src/xs_title.c @ 957:0e60e5d56fdd

Change how the backend emulator library is initialized for libSIDPlay2 and FP, as it seems the engine configuration has some persistence despite reconfiguration between loaded files if same engine object is retained. This caused, for example, 2SID stereo tunes being played "mono" if played after a normal 1-SID tune. Duh.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 20 Nov 2012 22:13:48 +0200
parents 61a527ac3baa
children be2a8436461a
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;                        \
    }                                                   \
}


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((p->sidModel == XS_SIDMODEL_6581) ? "SID6581" : "SID8580");

        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 'm':
                    switch (p->sidModel) {
                    case XS_SIDMODEL_6581:
                        VPUTSTR("6581");
                        break;
                    case XS_SIDMODEL_8580:
                        VPUTSTR("8580");
                        break;
                    case XS_SIDMODEL_ANY:
                        VPUTSTR("ANY");
                        break;
                    default:
                        VPUTSTR("?");
                        break;
                    }
                    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;
}