view src/xmms-sid.h @ 970:d90bca05521e

Cosmetics.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 21 Nov 2012 00:16:03 +0200
parents be2a8436461a
children
line wrap: on
line source

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

   Main header file

   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.
*/
#ifndef XMMS_SID_H
#define XMMS_SID_H

#include "xs_support.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Define to ISO C99 macro for debugging instead of varargs function.
 * This provides more useful information, but is incompatible with
 * older standards. If #undef'd, a varargs function is used instead.
 */
#define DEBUG_NP

/* Define to enable non-portable thread and mutex debugging code.
 * You need to #define DEBUG also to make this useful.
 * (Works probably with GNU/Linux pthreads implementation only)
 */
#undef XS_MUTEX_DEBUG

/* Size for some small buffers (always static variables) */
#define XS_BUF_SIZE            (512)

#define XS_BUF2_SIZE           (4096)

/* If defined, some dynamically allocated temp. buffers are used.
 * Static (#undef) might give slight performance gain,
 * but fails on systems with limited stack space. */
#define XS_BUF_DYNAMIC

/* Configuration section identifier
 */
#define XS_PACKAGE_STRING      PACKAGE_STRING
#define XS_CONFIG_IDENT        "XMMS-SID"

/* Default audio rendering frequency in Hz
 */
#define XS_AUDIO_FREQ          (44100)

/* Size of audio buffer. If you are experiencing lots of audio
 * "underruns" or clicks/gaps in output, try increasing this value.
 * Do notice, however, that it also affects the update frequency of
 * XMMS's visualization plugins... 
 */
#define XS_AUDIOBUF_SIZE       (4*1024)

/* Size of data buffer used for SID-file loading and MD5 hash calculation.
 * If this is too small, the computed hash will be incorrect.
 * Largest SID files I've seen are ~70kB.
 */
#define XS_SIDBUF_SIZE         (256*1024)

/* libSIDPlay1/2 constants (copied from internal headers/source)
 * For some stupid reason these are not available in public
 * headers, so we have to duplicate them here...
 */
#define XS_SIDPLAY1_FS         (400.0f)
#define XS_SIDPLAY1_FM         (60.0f)
#define XS_SIDPLAY1_FT         (0.05f)

#define XS_SIDPLAY2_NFPOINTS   (0x800)
#define XS_SIDPLAY2_FMAX       (24000)


/* Macros for mutexes and threads. These exist to be able to
 * easily change from pthreads to glib threads, etc, if necessary.
 */
#define XS_THREAD_T            pthread_t
#define XS_THREAD_EXIT(M)      pthread_exit(M)
#define XS_THREAD_JOIN(M)      pthread_join(M, NULL)
#define XS_MPP(M)              M ## _mutex
#ifdef XS_MUTEX_DEBUG
#  ifndef __USE_GNU
#    define __USE_GNU
#  endif
#  define XS_MUTEX(M)          pthread_mutex_t    XS_MPP(M) = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; gint M ## _qq
#  define XS_MUTEX_H(M)        extern pthread_mutex_t XS_MPP(M); extern gint M ## _qq
#  define XS_MUTEX_LOCK(M)     { M ## _qq = pthread_mutex_lock(&XS_MPP(M)); if (M ## _qq) XSDEBUG("XS_MUTEX_LOCK(" #M ") == %i\n", M ## _qq); }
#  define XS_MUTEX_UNLOCK(M)   { M ## _qq = pthread_mutex_unlock(&XS_MPP(M)); if (M ## _qq) XSDEBUG("XS_MUTEX_UNLOCK(" #M ") == %i\n", M ## _qq); }
#else
#  define XS_MUTEX(M)          pthread_mutex_t    XS_MPP(M) = PTHREAD_MUTEX_INITIALIZER
#  define XS_MUTEX_H(M)        extern pthread_mutex_t XS_MPP(M)
#  define XS_MUTEX_LOCK(M)     pthread_mutex_lock(&XS_MPP(M))
#  define XS_MUTEX_UNLOCK(M)   pthread_mutex_unlock(&XS_MPP(M))
#endif
#include <pthread.h>

/* Character set conversion helper macros
 */
#define XS_CS_FILENAME(M)      g_strdup(M)
#define XS_CS_SID(M)           g_strdup(M)
#define XS_CS_STIL(M)          M
#define XS_CS_FREE(M)


/* Plugin-wide typedefs
 */
typedef struct {
    gint         tuneSpeed,
                 tuneLength;
    gboolean     tunePlayed;
} XSSubTuneInfo;


typedef struct {
    gchar        *sidFilename,
                 *sidName,
                 *sidComposer,
                 *sidCopyright,
                 *sidFormat;
    gint         loadAddr,
                 initAddr,
                 playAddr,
                 dataFileLen,
                 sidModel1,
                 sidModel2;
    gint         nsubTunes, startTune;
    XSSubTuneInfo    *subTunes;
} XSTuneInfo;


/* Global variables
 */
extern InputPlugin    xs_plugin_ip;


/* Plugin function prototypes
 */
void    xs_init(void);
void    xs_reinit(void);
void    xs_close(void);
gint    xs_is_our_file(gchar *);
void    xs_play_file(gchar *);
void    xs_stop(void);
void    xs_pause(short);
void    xs_seek(gint);
gint    xs_get_time(void);
void    xs_get_song_info(gchar *, gchar **, gint *);
void    xs_about(void);


#ifndef DEBUG_NP
void    XSDEBUG(const char *, ...);
#else
#  ifdef DEBUG
#    define XSDEBUG(...) { fprintf(stderr, "XS[%s:%s:%d]: ", __FILE__, __FUNCTION__, (int) __LINE__); fprintf(stderr, __VA_ARGS__); }
#  else
#    define XSDEBUG(...) /* stub */
#  endif
#endif


/* And even some Gtk+ macro crap here, yay.
 */
#define XS_DEF_WINDOW_DELETE(ME, MV)			\
gboolean xs_ ## ME ## _delete(GtkWidget *w, GdkEvent *e, gpointer d) {	\
    (void) w; (void) e; (void) d;			\
    if (xs_ ## MV ) {					\
        gtk_widget_destroy(xs_ ## MV );			\
        xs_ ## MV = NULL;				\
    }							\
    return FALSE;					\
}

#define XS_DEF_WINDOW_CLOSE(ME, MV)			\
void xs_ ## ME (GtkButton *b, gpointer d) {		\
    (void) b; (void) d;					\
    gtk_widget_destroy(xs_ ## MV );			\
    xs_ ## MV = NULL;					\
}

#define XS_SIGNAL_CONNECT(SOBJ, SNAME, SFUNC, SDATA)			\
    gtk_signal_connect(GTK_OBJECT(SOBJ), SNAME, GTK_SIGNAL_FUNC(SFUNC), SDATA)

#define XS_WINDOW_PRESENT(SWIN) gdk_window_raise(SWIN ->window)

#ifdef __cplusplus
}
#endif
#endif /* XMMS_SID_H */