view sidlib.h @ 264:5afa6052f796

Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for fields, in order to allow multiple values for the same field, for example same (sub)tune might have multiple ARTIST fields designating different artists.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 05 Jan 2020 23:51:04 +0200
parents ef1d6d16718e
children 254828e9213b
line wrap: on
line source

/*
 * SIDInfoLib - Way too simplistic PSID/RSID file library
 * Programmed and designed by Matti 'ccr' Hämäläinen <ccr@tnsp.org>
 * (C) Copyright 2014-2020 Tecnic Software productions (TNSP)
 */
#ifndef SIDLIB_H
#define SIDLIB_H 1

#include "th_util.h"
#include "th_ioctx.h"
#include "th_crypto.h"
#include "th_datastruct.h"


#ifdef __cplusplus
extern "C" {
#endif


//
// Some constants
//
#define SIDLIB_PSID_MAGIC_LEN    (4)
#define SIDLIB_PSID_STR_LEN      (32)
#define SIDLIB_BUFFER_SIZE       (1024 * 16)


enum
{
    // Player flags
    PSF_PLAYER_TYPE   = 0x01, // 0 = built-in, 1 = Compute! SIDPlayer MUS
    PSF_PLAYSID_TUNE  = 0x02, // 0 = Real C64-compatible, 1 = PlaySID specific (v2NG)

    // Video standard used (v2NG+)
    PSF_CLOCK_UNKNOWN = 0x00,
    PSF_CLOCK_PAL     = 0x01,
    PSF_CLOCK_NTSC    = 0x02,
    PSF_CLOCK_ANY     = 0x03,
    PSF_CLOCK_MASK    = 0x03,

    // SID model (v2NG+)
    PSF_MODEL_UNKNOWN = 0x00,
    PSF_MODEL_MOS6581 = 0x01,
    PSF_MODEL_MOS8580 = 0x02,
    PSF_MODEL_ANY     = 0x03,
    PSF_MODEL_MASK    = 0x03,
};


// STIL database subtune fields, see SIDLibSTILSubTune
enum
{
    STF_NAME,
    STF_AUTHOR,
    STF_TITLE,
    STF_INFO,
    STF_ARTIST,
    STF_COMMENT,

    STF_LAST
};


//
// Structures
//
typedef struct
{
    th_llist_t node;

    th_md5hash_t    hash;       // MD5 hash-digest
    int             nlengths;   // Number of lengths
    int             *lengths;   // Lengths in seconds
} SIDLibSLDBNode;


typedef struct
{
    SIDLibSLDBNode  *nodes, **pindex;
    size_t nnodes;
} SIDLibSLDB;


typedef struct
{
    int ndata;
    char **data;
} SIDLibSTILField;


typedef struct
{
    SIDLibSTILField fields[STF_LAST];
} SIDLibSTILSubTune;


typedef struct
{
    th_llist_t node;

    char *filename;
    int nsubtunes;
    SIDLibSTILSubTune **subtunes;
} SIDLibSTILNode;


typedef struct
{
    SIDLibSTILNode *nodes, **pindex;
    size_t nnodes;
} SIDLibSTILDB;


typedef struct
{
    char magic[SIDLIB_PSID_MAGIC_LEN + 1]; // "PSID" / "RSID" magic identifier
    uint16_t
        version,         // Version number
        dataOffset,      // Start of actual c64 data in file
        loadAddress,     // Loading address
        initAddress,     // Initialization address
        playAddress,     // Play one frame
        nSongs,          // Number of subsongs
        startSong;       // Default starting song
    uint32_t speed;      // Speed
    char *sidName;       // Descriptive text-fields, ASCIIZ
    char *sidAuthor;
    char *sidCopyright;

    // PSIDv2+ data
    uint16_t flags;      // Flags
    uint8_t  startPage, pageLength;
    uint8_t  sid2Addr, sid3Addr;

    // Extra data
    BOOL isRSID;
    size_t dataSize;     // Total size of data - header
    th_md5hash_t hash;   // Songlength database hash

    SIDLibSLDBNode *lengths; // Songlength information node pointer
    BOOL allocated; // TRUE if structure has been allocated

} SIDLibPSIDHeader;


//
// Functions
//
int              sidlib_read_sid_file(th_ioctx *ctx, SIDLibPSIDHeader *psid, const BOOL newSLDB);
int              sidlib_read_sid_file_alloc(th_ioctx *ctx, SIDLibPSIDHeader **ppsid, const BOOL newSLDB);
void             sidlib_free_sid_file(SIDLibPSIDHeader *psid);

const char *     sidlib_get_sid_clock_str(const int flags);
const char *     sidlib_get_sid_model_str(const int flags);

int              sidlib_sldb_new(SIDLibSLDB **pdbh);
int              sidlib_sldb_read(th_ioctx *ctx, SIDLibSLDB *dbh);
int              sidlib_sldb_build_index(SIDLibSLDB *dbh);
void             sidlib_sldb_free(SIDLibSLDB *dbh);
SIDLibSLDBNode * sidlib_sldb_get_by_hash(SIDLibSLDB *dbh, th_md5hash_t hash);

int              sidlib_stildb_new(SIDLibSTILDB **pdbh);
int              sidlib_stildb_read(th_ioctx *ctx, SIDLibSTILDB *dbh);
int              sidlib_stildb_build_index(SIDLibSTILDB *dbh);
void             sidlib_stildb_free(SIDLibSTILDB *dbh);
SIDLibSTILNode * sidlib_stildb_get_node(SIDLibSTILDB *dbh, const char *filename);


#ifdef __cplusplus
}
#endif
#endif // SIDLIB_H