diff src/musepack/libmpc.h @ 12:3da1b8942b8b trunk

[svn] - remove src/Input src/Output src/Effect src/General src/Visualization src/Container
author nenolod
date Mon, 18 Sep 2006 03:14:20 -0700
parents src/Input/musepack/libmpc.h@088092a52fea
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/musepack/libmpc.h	Mon Sep 18 03:14:20 2006 -0700
@@ -0,0 +1,179 @@
+#ifndef XMMS_MUSEPACK
+#define XMMS_MUSEPACK
+
+//xmms headers
+extern "C"
+{
+#include "audacious/plugin.h"
+#include "audacious/output.h"
+#include "audacious/util.h"
+#include "audacious/configdb.h"
+#include "audacious/titlestring.h"
+#include "audacious/vfs.h"
+}
+
+//stdlib headers
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <math.h>
+
+//libmpcdec headers
+#undef TRUE
+#undef FALSE
+#include <mpcdec/mpcdec.h>
+
+//GTK+ headers
+#include <glib.h>
+#include <gtk/gtk.h>
+
+//taglib headers
+#include <taglib/tag.h>
+#include <taglib/apetag.h>
+#include <taglib/mpcfile.h>
+
+#include "equalizer.h"
+
+#ifndef M_LN10
+#define M_LN10    2.3025850929940456840179914546843642
+#endif
+
+typedef struct PluginConfig
+{
+    gboolean clipPrevention;
+    gboolean dynamicBitrate;
+    gboolean replaygain;
+    gboolean albumGain;
+    gboolean isEq;
+};
+
+typedef struct Widgets
+{
+    GtkWidget* aboutBox;
+    GtkWidget* configBox;
+    GtkWidget* bitrateCheck;
+    GtkWidget* clippingCheck;
+    GtkWidget* replaygainCheck;
+    GtkWidget* albumCheck;
+    GtkWidget* infoBox;
+    GtkWidget* albumEntry;
+    GtkWidget* artistEntry;
+    GtkWidget* titleEntry;
+    GtkWidget* genreEntry;
+    GtkWidget* yearEntry;
+    GtkWidget* trackEntry;
+    GtkWidget* commentEntry;
+    GtkWidget* fileEntry;
+};
+
+typedef struct MpcDecoder
+{
+    char*      isError;
+    double     offset;
+    bool       isOutput;
+    bool       isAlive;
+    bool       isPause;
+};
+
+typedef struct TrackInfo
+{
+    int   bitrate;
+    char* display;
+    int   length;
+    int   sampleFreq;
+    int   channels;
+};
+
+typedef struct MpcInfo
+{
+    char*    title;
+    char*    artist;
+    char*    album;
+    char*    comment;
+    char*    genre;
+    char*    date;
+    unsigned track;
+    unsigned year;
+};
+
+extern "C" InputPlugin * get_iplugin_info(void);
+
+static void       mpcOpenPlugin();
+static void       mpcAboutBox();
+static void       mpcConfigBox();
+static void       toggleSwitch(GtkWidget*, gpointer);
+static void       saveConfigBox(GtkWidget*, gpointer);
+static int        mpcIsOurFile(char*);
+static void       mpcPlay(char*);
+static void       mpcStop();
+static void       mpcPause(short);
+static void       mpcSeek(int);
+static void       mpcSetEq(int, float, float*);
+static int        mpcGetTime();
+static void       mpcGetSongInfo(char*, char**, int*);
+static void       freeTags(MpcInfo&);
+static MpcInfo    getTags(const char*);
+static void       mpcFileInfoBox(char*);
+static void       mpcGtkPrintLabel(GtkWidget*, char*, ...);
+static GtkWidget* mpcGtkTagLabel(char*, int, int, int, int, GtkWidget*);
+static GtkWidget* mpcGtkTagEntry(int, int, int, int, int, GtkWidget*);
+static GtkWidget* mpcGtkLabel(GtkWidget*);
+static GtkWidget* mpcGtkButton(char*, GtkWidget*);
+static void       removeTags(GtkWidget*, gpointer);
+static void       saveTags(GtkWidget*, gpointer);
+static void       closeInfoBox(GtkWidget*, gpointer);
+static char*      mpcGenerateTitle(const MpcInfo&, char*);
+static void       lockAcquire();
+static void       lockRelease();
+static void*      decodeStream(void*);
+static int        processBuffer(MPC_SAMPLE_FORMAT*, char*, mpc_decoder&);
+static void*      endThread(char*, FILE*, bool);
+static bool       isAlive();
+static void       setAlive(bool);
+static double     getOffset();
+static void       setOffset(double);
+static bool       isPause();
+static void       setReplaygain(mpc_streaminfo&, mpc_decoder&);
+static TitleInput* mpcGetSongTuple(char *);
+
+#ifdef MPC_FIXED_POINT
+inline static int shiftSigned(MPC_SAMPLE_FORMAT val, int shift)
+{
+    if (shift > 0)
+        val <<= shift;
+    else if (shift < 0)
+        val >>= -shift;
+    return (int) val;
+}
+#endif
+
+inline static void copyBuffer(MPC_SAMPLE_FORMAT* pInBuf, char* pOutBuf, unsigned pLength)
+{
+    unsigned pSize = 16;
+    int clipMin    = -1 << (pSize - 1);
+    int clipMax    = (1 << (pSize - 1)) - 1;
+    int floatScale =  1 << (pSize - 1);
+    for (unsigned n = 0; n < 2 * pLength; n++)
+    {
+        int val;
+#ifdef MPC_FIXED_POINT
+        val = shiftSigned(pInBuf[n], pSize - MPC_FIXED_POINT_SCALE_SHIFT);
+#else
+        val = (int) (pInBuf[n] * floatScale);
+#endif
+        if (val < clipMin)
+            val = clipMin;
+        else if (val > clipMax)
+            val = clipMax;
+        unsigned shift = 0;
+        do
+        {
+            pOutBuf[n * 2 + (shift / 8)] = (unsigned char) ((val >> shift) & 0xFF);
+            shift += 8;
+        }
+        while (shift < pSize);
+    }
+}
+
+#endif