diff jssplr.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children e0e470c3fc8e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jssplr.h	Fri Sep 28 01:54:23 2012 +0300
@@ -0,0 +1,166 @@
+/*
+ * miniJSS - Module playing routines
+ * Programmed and designed by Matti 'ccr' Hamalainen
+ * (C) Copyright 2006-2007 Tecnic Software productions (TNSP)
+ */
+#ifndef JSSPLR_H
+#define JSSPLR_H
+
+#include "jss.h"
+#include "jssmod.h"
+#include "jssmix.h"
+
+
+// Player general constants
+#define mpMinVol            (0)
+#define mpMaxVol            (64)
+#define mpPanCenter         (0)
+#define mpMaxFadeoutVol     (65535)
+
+
+// Channel New-Data flags
+#define cdfNONE             (0x00)    // Set nothing
+#define cdfNewInstr         (0x01)    // Set a new instrument
+#define cdfNewPitch         (0x02)    // Set a new pitch
+#define cdfNewPos           (0x04)    // Set a new position
+#define cdfNewVolume        (0x08)    // Set a new volume
+#define cdfNewPanPos        (0x10)    // Set a new panning position
+#define cdfNewGlobalVol     (0x20)    // Set a new global volume
+#define cdfStop             (0x80)    // Stop channel playing
+
+
+// Typedefs for channel structures
+typedef int                  JDInt[jsetNChannels];
+typedef BOOL                 JDBool[jsetNChannels];
+typedef JSSInstrument *      JDInst[jsetNChannels];
+typedef JSSExtInstrument *   JDEInst[jsetNChannels];
+
+
+// Struct holding all player related information
+typedef struct
+{
+    // General variables
+    int     iTempo,                 // Current values
+            iSpeed,
+            iTick,
+            iOrder,
+            iPattern,
+            iRow,
+            iGlobalVol,
+            iOptions;               // Playing option flags
+    BOOL    isPlaying;              // Are we playing?
+
+    int     iNewOrder,              // NEW order number
+            iNewRow;                // NEW row number
+    BOOL    newOrderSet,            // TRUE if new order has been set
+            newRowSet;              // TRUE if new row has been set
+
+    // Parameters for effects, etc
+    BOOL    jumpFlag,               // Pattern jump flag
+            breakFlag;              // Pattern break flag
+    int     iPatternDelay,          // Pattern delay tick-counter
+            iLastPatLoopRow;        // Latest set pattern loop row (any channel)
+
+    JDInt   iPatLoopRow,            // Pattern loop start row for each channel
+            iPatLoopCount,          // Pattern loop count for each channel
+        
+            iLastPortaParam,        // Last portamento effect parameter
+            iLastPortaToNoteParam,  // Last porta-to-note parameter
+            iLastPortaToNotePitch,  // Last porta-to-note pitch
+
+            iVibratoPos,            // Vibrato waveform position
+            iVibratoSpeed,          // Vibrato speed
+            iVibratoDepth,          // Vibrato depth
+            iVibratoWC,             // Vibrato wave control
+
+            iTremoloPos,            // Tremolo waveform position
+            iTremoloSpeed,          // Tremolo speed
+            iTremoloDepth,          // Tremolo depth
+
+            iTremoloWC,             // Tremolo wave control
+
+            iLastTremorParam,
+            iTremorCount,
+            iLastSampleOffset,
+            iLastRetrigParam,
+            iLastVolSlideParam,
+        
+            iRetrigNDFlags,         // For retrig-effect
+            iSaveNDFlags;           // For notedelay-effect
+
+    // Current channel data
+    JDInst  iCInstrument;           // Instruments
+    JDEInst iCExtInstrument;       // ExtInstruments
+    JDInt   iCInstrumentN,
+            iCExtInstrumentN,
+            iCNewDataFlags,         // New data flags
+            iCNote,                 // Current notes
+            iCPitch,                // Pitches (NOT actual frequencies!)
+            iCOldPitch,
+            iCPosition,             // Sample positions
+            iCVolume,               // Volumes
+            iCPanning,              // Panning positions
+
+            iCFadeOutVol,
+
+            iCPanEnv,
+            iCVolEnv,
+
+            iCAutoVib_Frames,
+            iCPanEnv_Frames,
+            iCVolEnv_Frames,
+
+            iCLastFineVolumeslideUpParam,
+            iCLastFineVolumeslideDownParam,
+            iCLastExtraFinePortamentoUpParam,
+            iCLastExtraFinePortamentoDownParam,
+            iCLastFinePortamentoUpParam,
+            iCLastFinePortamentoDownParam;
+    
+    JDBool  iCPanEnv_Exec,
+            iCVolEnv_Exec,
+            iCKeyOff;
+
+    // Module and sounddevice specific
+    JSSModule *pModule;          // Current module in this player
+    JSSPattern *pPattern;        // Current pattern
+    JSSMixer *pDevice;           // Pointer to mixing device structure
+
+#ifdef JSS_SUP_THREADS
+    DMMutex *mutex;
+#endif
+
+} JSSPlayer;
+
+
+/* External functions for end users
+ */
+int             jmpPlayOrder(JSSPlayer *, int);
+int             jmpPlayPattern(JSSPlayer *, int);
+void            jmpStop(JSSPlayer *);
+void            jmpResume(JSSPlayer *);
+void            jmpSetModule(JSSPlayer *, JSSModule *);
+JSSPlayer *     jmpInit(JSSMixer *);
+int             jmpClose(JSSPlayer *);
+void            jmpExec(void *, void *);
+
+
+/* Helper macros
+ */
+#define JMPMAKEPARAM(AIVAL, AVALX, AVALY) { AVALX = (((AIVAL) >> 4) & 0x0f); AVALY = ((AIVAL) & 0x0f); }
+#define JMPSETNDFLAGS(IVAL) mp->iCNewDataFlags[channel] |= IVAL
+#define JMPUNSETNDFLAGS(IVAL) mp->iCNewDataFlags[channel] &= (~(IVAL))
+#define JMPGETNOTE(MNOTE, MROW, MCHAN) assert(mp); assert(mp->pPattern); assert((MROW) >= 0); assert((MROW) < mp->pPattern->nrows); MNOTE = &mp->pPattern->data[(mp->pPattern->nchannels * MROW) + (MCHAN)]
+#define JMPGETEFFECT(MEFF, MIEFF) if ((MIEFF >= 0) && (MIEFF < jmpNMODEffectTable)) MEFF = jmpMODEffectTable[MIEFF]; else MEFF = 0
+#define JMPGETMODFLAGS(Q, Z) ((Q->pModule->defFlags & (Z)) == (Z))
+
+
+/* Debugging macros
+ */
+#if !defined(JSS_LIGHT) && defined(JSS_DEBUG)
+#  define JMPDEBUG(QQ) { fprintf(stderr, "[o=%03d:p=%03d:r=%03d] (%c/%x:%x) %s\n", mp->iOrder, mp->iPattern, mp->iRow, effect, currNote->effect, currNote->param, QQ ); }
+#else
+#  define JMPDEBUG(QQ) // stub
+#endif
+
+#endif // JSSPLR_H