view src/xs_sidplay.h @ 849:2663b1ac9ce6

Improve debugging.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 08 Nov 2012 23:02:05 +0200
parents ae1f6418d093
children
line wrap: on
line source

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

   libSIDPlay skeleton functions used both by v1 and 2 of the backends

   Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org>
   (C) Copyright 2005-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.
*/


/* This function gets most of the information, though we do miss some
 * (those variables that are only set by libSIDPlay when tune is initialized).
 * Rest of the information is acquired in TFUNCTION2()
 */
XSTuneInfo *TFUNCTION(const gchar *filename)
{
    XSTuneInfo *res;
    TTUNEINFO info;
    TTUNE *tune;

    /* Check if the tune exists and is readable */
    if ((tune = new TTUNE(filename)) == NULL)
    {
        XSDEBUG("could not initialize tune from '%s'.\n", filename);
        return NULL;
    }

    if (!tune->getStatus())
    {
        XSDEBUG("tune->getStatus() returned false for '%s'.\n", filename);
        delete tune;
        return NULL;
    }

    /* Get general tune information */
#if defined(XS_SIDPLAY1_H)
    tune->getInfo(info);
#elif defined(XS_SIDPLAY2_H)
    info = tune->getInfo();
#elif defined(XS_SIDPLAYFP_H)
    info = tune->getInfo();
#endif

    /* Allocate tuneinfo structure and set information */
    res = xs_tuneinfo_new(filename,
        info.songs, info.startSong,
        info.infoString[0], info.infoString[1], info.infoString[2],
        info.loadAddr, info.initAddr, info.playAddr,
        info.dataFileLen, info.formatString,
#if defined(XS_SIDPLAYFP_H) && defined(HAVE_SIDPLAYFP)
        info.sidModel1
#else
        info.sidModel
#endif
        );
    
    /* NOTICE! libSIDPlay[12] headers specifically state that sidModel,
     * songSpeed and clockSpeed are "undefined" before song initialization,
     * but in practice sidModel is known after getInfo() invocation...
     * This of course does not take the sub-tune specific changes into account,
     * but at least we have a reasonable guesstimate.
     */

    delete tune;

    return res;
}


/* Updates the information of currently playing tune
 */
gboolean TFUNCTION2(XSEngineState *state)
{
    TTUNEINFO info;
    TENGINE *engine;
    
    /* Check if we have required structures initialized */
    if (!state || !state->tuneInfo || !state->internal)
        return FALSE;

    engine = (TENGINE *) state->internal;
    if (!(engine->tune))
        return FALSE;

    /* Get currently playing tune information */
#if defined(XS_SIDPLAY1_H)
    engine->tune->getInfo(info);
#elif defined(XS_SIDPLAY2_H)
    info = engine->tune.getInfo();
#elif defined(XS_SIDPLAYFP_H)
    info = engine->tune.getInfo();
#endif

    /* NOTICE! Here we assume that libSIDPlay[12] headers define
     * SIDTUNE_SIDMODEL_* similarly to our enums in xs_config.h ...
     */
#if defined(XS_SIDPLAYFP_H) && defined(HAVE_SIDPLAYFP)
    state->tuneInfo->sidModel = info.sidModel1;
#else
    state->tuneInfo->sidModel = info.sidModel;
#endif

    if (state->currSong > 0 && state->currSong <= state->tuneInfo->nsubTunes)
    {
        gint tmpSpeed = -1;
        
        switch (info.clockSpeed)
        {
            case SIDTUNE_CLOCK_PAL:
                tmpSpeed = XS_CLOCK_PAL;
                break;
            case SIDTUNE_CLOCK_NTSC:
                tmpSpeed = XS_CLOCK_NTSC;
                break;
            case SIDTUNE_CLOCK_ANY:
                tmpSpeed = XS_CLOCK_ANY;
                break;
            case SIDTUNE_CLOCK_UNKNOWN:
                switch (info.songSpeed)
                {
                    case SIDTUNE_SPEED_VBI:
                        tmpSpeed = XS_CLOCK_VBI;
                        break;
                    case SIDTUNE_SPEED_CIA_1A:
                        tmpSpeed = XS_CLOCK_CIA;
                        break;
                    default:
                        tmpSpeed = info.songSpeed;
                        break;
                }
            default:
                tmpSpeed = info.clockSpeed;
                break;
        }
            
        state->tuneInfo->subTunes[state->currSong - 1].tuneSpeed = tmpSpeed;
    }

    return TRUE;
}

/* Undefine these */
#undef TFUNCTION
#undef TFUNCTION2
#undef TTUNEINFO
#undef TTUNE