232
|
1 #ifndef XMMS_MUSEPACK
|
|
2 #define XMMS_MUSEPACK
|
|
3
|
|
4 //xmms headers
|
|
5 extern "C"
|
|
6 {
|
|
7 #include "audacious/plugin.h"
|
|
8 #include "audacious/output.h"
|
|
9 #include "audacious/util.h"
|
|
10 #include "audacious/configdb.h"
|
|
11 #include "audacious/titlestring.h"
|
|
12 #include "audacious/vfs.h"
|
|
13 }
|
|
14
|
|
15 //stdlib headers
|
|
16 #include <string.h>
|
|
17 #include <stdio.h>
|
|
18 #include <stdlib.h>
|
|
19 #include <unistd.h>
|
|
20 #include <math.h>
|
|
21
|
|
22 //libmpcdec headers
|
|
23 #undef TRUE
|
|
24 #undef FALSE
|
|
25 #include <mpcdec/mpcdec.h>
|
|
26
|
|
27 //GTK+ headers
|
|
28 #include <glib.h>
|
|
29 #include <gtk/gtk.h>
|
|
30
|
|
31 //taglib headers
|
|
32 #include <taglib/tag.h>
|
|
33 #include <taglib/apetag.h>
|
|
34 #include <taglib/mpcfile.h>
|
|
35
|
|
36 #ifndef M_LN10
|
|
37 #define M_LN10 2.3025850929940456840179914546843642
|
|
38 #endif
|
|
39
|
|
40 typedef struct PluginConfig
|
|
41 {
|
|
42 gboolean clipPrevention;
|
|
43 gboolean dynamicBitrate;
|
|
44 gboolean replaygain;
|
|
45 gboolean albumGain;
|
|
46 gboolean isEq;
|
|
47 };
|
|
48
|
|
49 typedef struct Widgets
|
|
50 {
|
|
51 GtkWidget* aboutBox;
|
|
52 GtkWidget* configBox;
|
|
53 GtkWidget* bitrateCheck;
|
|
54 GtkWidget* clippingCheck;
|
|
55 GtkWidget* replaygainCheck;
|
|
56 GtkWidget* albumCheck;
|
|
57 GtkWidget* infoBox;
|
|
58 GtkWidget* albumEntry;
|
|
59 GtkWidget* artistEntry;
|
|
60 GtkWidget* titleEntry;
|
|
61 GtkWidget* genreEntry;
|
|
62 GtkWidget* yearEntry;
|
|
63 GtkWidget* trackEntry;
|
|
64 GtkWidget* commentEntry;
|
|
65 GtkWidget* fileEntry;
|
|
66 };
|
|
67
|
|
68 typedef struct MpcDecoder
|
|
69 {
|
|
70 char* isError;
|
|
71 double offset;
|
|
72 bool isOutput;
|
|
73 bool isAlive;
|
|
74 bool isPause;
|
|
75 };
|
|
76
|
|
77 typedef struct TrackInfo
|
|
78 {
|
|
79 int bitrate;
|
|
80 char* display;
|
|
81 int length;
|
|
82 int sampleFreq;
|
|
83 int channels;
|
|
84 };
|
|
85
|
|
86 typedef struct MpcInfo
|
|
87 {
|
|
88 char* title;
|
|
89 char* artist;
|
|
90 char* album;
|
|
91 char* comment;
|
|
92 char* genre;
|
|
93 char* date;
|
|
94 unsigned track;
|
|
95 unsigned year;
|
|
96 };
|
|
97
|
|
98 extern "C" InputPlugin * get_iplugin_info(void);
|
|
99
|
|
100 static void mpcOpenPlugin();
|
|
101 static void mpcAboutBox();
|
|
102 static void mpcConfigBox();
|
|
103 static void toggleSwitch(GtkWidget*, gpointer);
|
|
104 static void saveConfigBox(GtkWidget*, gpointer);
|
254
|
105 static int mpcIsOurFD(char*,VFSFile* file);
|
232
|
106 static void mpcPlay(char*);
|
|
107 static void mpcStop();
|
|
108 static void mpcPause(short);
|
|
109 static void mpcSeek(int);
|
|
110 static void mpcSetEq(int, float, float*);
|
|
111 static int mpcGetTime();
|
|
112 static void mpcGetSongInfo(char*, char**, int*);
|
|
113 static void freeTags(MpcInfo&);
|
|
114 static MpcInfo getTags(const char*);
|
|
115 static void mpcFileInfoBox(char*);
|
|
116 static void mpcGtkPrintLabel(GtkWidget*, char*, ...);
|
|
117 static GtkWidget* mpcGtkTagLabel(char*, int, int, int, int, GtkWidget*);
|
|
118 static GtkWidget* mpcGtkTagEntry(int, int, int, int, int, GtkWidget*);
|
|
119 static GtkWidget* mpcGtkLabel(GtkWidget*);
|
|
120 static GtkWidget* mpcGtkButton(char*, GtkWidget*);
|
|
121 static void removeTags(GtkWidget*, gpointer);
|
|
122 static void saveTags(GtkWidget*, gpointer);
|
|
123 static void closeInfoBox(GtkWidget*, gpointer);
|
|
124 static char* mpcGenerateTitle(const MpcInfo&, char*);
|
|
125 static void lockAcquire();
|
|
126 static void lockRelease();
|
|
127 static void* decodeStream(void*);
|
|
128 static int processBuffer(MPC_SAMPLE_FORMAT*, char*, mpc_decoder&);
|
|
129 static void* endThread(char*, FILE*, bool);
|
|
130 static bool isAlive();
|
|
131 static void setAlive(bool);
|
|
132 static double getOffset();
|
|
133 static void setOffset(double);
|
|
134 static bool isPause();
|
|
135 static void setReplaygain(mpc_streaminfo&, mpc_decoder&);
|
|
136 static TitleInput* mpcGetSongTuple(char *);
|
|
137
|
|
138 #ifdef MPC_FIXED_POINT
|
|
139 inline static int shiftSigned(MPC_SAMPLE_FORMAT val, int shift)
|
|
140 {
|
|
141 if (shift > 0)
|
|
142 val <<= shift;
|
|
143 else if (shift < 0)
|
|
144 val >>= -shift;
|
|
145 return (int) val;
|
|
146 }
|
|
147 #endif
|
|
148
|
|
149 inline static void copyBuffer(MPC_SAMPLE_FORMAT* pInBuf, char* pOutBuf, unsigned pLength)
|
|
150 {
|
|
151 unsigned pSize = 16;
|
|
152 int clipMin = -1 << (pSize - 1);
|
|
153 int clipMax = (1 << (pSize - 1)) - 1;
|
|
154 int floatScale = 1 << (pSize - 1);
|
|
155 for (unsigned n = 0; n < 2 * pLength; n++)
|
|
156 {
|
|
157 int val;
|
|
158 #ifdef MPC_FIXED_POINT
|
|
159 val = shiftSigned(pInBuf[n], pSize - MPC_FIXED_POINT_SCALE_SHIFT);
|
|
160 #else
|
|
161 val = (int) (pInBuf[n] * floatScale);
|
|
162 #endif
|
|
163 if (val < clipMin)
|
|
164 val = clipMin;
|
|
165 else if (val > clipMax)
|
|
166 val = clipMax;
|
|
167 unsigned shift = 0;
|
|
168 do
|
|
169 {
|
|
170 pOutBuf[n * 2 + (shift / 8)] = (unsigned char) ((val >> shift) & 0xFF);
|
|
171 shift += 8;
|
|
172 }
|
|
173 while (shift < pSize);
|
|
174 }
|
|
175 }
|
|
176
|
|
177 #endif
|