Mercurial > hg > xmms-sid
view src/xmms-sid.h @ 673:537240c47d18
It was the dawn of the third age of SID-kind, several years after the
XMMS-BMP War. The Unified Audacious+XMMS-SID Project was a dream given form.
Its goal: to prevent another war by creating a SID-plugin which would be
functional for both worlds, where Audacious and XMMS -related code could
work out their differences peacefully. It's a port of call, home away from
home for coders, users, entrepreneurs, and wanderers. Humans and aliens
wrapped in two million, five hundred thousand tons of spinning code, all
alone in the night. It can be a dangerous place, but it's our last, best
hope for peace. This is the story of the last of the XMMS-SID releases.
The year is 2008. The name of the place is XMMS-SID 0.8.0rc2.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 21 Apr 2008 18:53:55 +0300 |
parents | 94186706beed |
children | 9321ffa2ea7e |
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-2007 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 /* * Some constants and defines */ /* #define to enable spurious debugging messages for development * purposes. Output goes to stderr. See also DEBUG_NP below. */ #define DEBUG /* 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 /* HardSID-support is not working and is untested, thus we disable it here. */ #undef HAVE_HARDSID_BUILDER /* Size for some small buffers (always static variables) */ #define XS_BUF_SIZE (1024) /* 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 (2*1024) /* Size of data buffer used for SID-tune 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 (80*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) /* Limits for oversampling */ #define XS_MIN_OVERSAMPLE (2) #define XS_MAX_OVERSAMPLE (8) /* 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) /* Shorthands for linked lists */ #define LPREV (node->prev) #define LTHIS (node) #define LNEXT (node->next) /* Plugin-wide typedefs */ typedef struct { gint tuneSpeed, tuneLength; gboolean tunePlayed; } xs_subtuneinfo_t; typedef struct { gchar *sidFilename, *sidName, *sidComposer, *sidCopyright, *sidFormat; gint loadAddr, initAddr, playAddr, dataFileLen, sidModel; gint nsubTunes, startTune; xs_subtuneinfo_t *subTunes; } xs_tuneinfo_t; /* 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); void xs_error(const char *, ...); /* Debugging */ #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 */