annotate src/musepack/libmpc.cxx @ 254:cdf9756d1528 trunk

[svn] Port to NewVFS file probe.
author chainsaw
date Sat, 18 Nov 2006 11:00:22 -0800
parents 6c78d6d3cdb7
children 4f7b72c88319
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
232
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
1 #include "libmpc.h"
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
2
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
3 #define FORCED_THREAD_STACKSIZE 1024 * 1000
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
4 #define REMOVE_NONEXISTANT_TAG(x) if (!*x) { x = NULL; }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
5
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
6 using TagLib::MPC::File;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
7 using TagLib::Tag;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
8 using TagLib::String;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
9 using TagLib::APE::ItemListMap;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
10
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
11 InputPlugin MpcPlugin = {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
12 NULL, //File Handle FILE* handle
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
13 NULL, //Filename char* filename
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
14 NULL, //Name of Plugin char* filename
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
15 mpcOpenPlugin, //Open Plugin [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
16 mpcAboutBox, //Show About box [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
17 mpcConfigBox, //Show Configure box [CALLBACK]
254
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
18 NULL, //Check if it's our file [DEPRECATED]
232
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
19 NULL, //Scan the directory [UNUSED]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
20 mpcPlay, //Play [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
21 mpcStop, //Stop [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
22 mpcPause, //Pause [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
23 mpcSeek, //Seek [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
24 NULL, //Set EQ [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
25 mpcGetTime, //Get Time [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
26 NULL, //Get Volume [UNUSED]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
27 NULL, //Set Volume [UNUSED]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
28 NULL, //Close Plugin [UNUSED]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
29 NULL, //Obsolete [UNUSED]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
30 NULL, //Visual plugins add_vis_pcm(int time, AFormat fmt, int nch, int length, void *ptr)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
31 NULL, //Set Info Settings set_info(char *title, int length, int rate, int freq, int nch)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
32 NULL, //set Info Text set_info_text(char* text)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
33 mpcGetSongInfo, //Get Title String callback [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
34 mpcFileInfoBox, //Show File Info Box [CALLBACK]
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
35 NULL, //Output Plugin Handle OutputPlugin output
254
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
36 mpcGetSongTuple,//Acquire tuple for song [CALLBACK]
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
37 NULL,
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
38 NULL,
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
39 mpcIsOurFD,
232
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
40 };
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
41
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
42 extern "C"
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
43 InputPlugin* get_iplugin_info()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
44 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
45 MpcPlugin.description = g_strdup_printf("Musepack Audio Plugin");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
46 return &MpcPlugin;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
47 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
48
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
49 static PluginConfig pluginConfig = {0};
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
50 static Widgets widgets = {0};
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
51 static MpcDecoder mpcDecoder = {0};
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
52 static TrackInfo track = {0};
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
53
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
54 static GThread *threadHandle;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
55 GStaticMutex threadMutex = G_STATIC_MUTEX_INIT;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
56
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
57 /*
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
58 * VFS callback implementation, adapted from mpc_reader.c.
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
59 * This _IS_ very sick, but it works. -nenolod
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
60 */
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
61 static mpc_int32_t
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
62 vfs_fread_impl(void *data, void *ptr, mpc_int32_t size)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
63 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
64 mpc_reader_file *d = (mpc_reader_file *) data;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
65 VFSFile *file = (VFSFile *) d->file;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
66
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
67 return (mpc_int32_t) vfs_fread(ptr, 1, size, file);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
68 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
69
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
70 static mpc_bool_t
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
71 vfs_fseek_impl(void *data, mpc_int32_t offset)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
72 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
73 mpc_reader_file *d = (mpc_reader_file *) data;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
74 VFSFile *file = (VFSFile *) d->file;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
75
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
76 return d->is_seekable ? vfs_fseek(file, offset, SEEK_SET) == 0 : FALSE;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
77 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
78
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
79 static mpc_int32_t
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
80 vfs_ftell_impl(void *data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
81 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
82 mpc_reader_file *d = (mpc_reader_file *) data;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
83 VFSFile *file = (VFSFile *) d->file;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
84
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
85 return vfs_ftell(file);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
86 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
87
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
88 static mpc_int32_t
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
89 vfs_getsize_impl(void *data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
90 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
91 mpc_reader_file *d = (mpc_reader_file *) data;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
92
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
93 return d->file_size;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
94 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
95
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
96 static mpc_bool_t
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
97 vfs_canseek_impl(void *data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
98 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
99 mpc_reader_file *d = (mpc_reader_file *) data;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
100
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
101 return d->is_seekable;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
102 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
103
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
104 /*
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
105 * This sets up an mpc_reader_file object to read from VFS instead of libc.
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
106 * Essentially, we use this instead of the normal constructor.
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
107 * - nenolod
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
108 */
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
109 void
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
110 mpc_reader_setup_file_vfs(mpc_reader_file *p_reader, VFSFile *input)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
111 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
112 p_reader->reader.seek = vfs_fseek_impl;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
113 p_reader->reader.read = vfs_fread_impl;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
114 p_reader->reader.tell = vfs_ftell_impl;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
115 p_reader->reader.get_size = vfs_getsize_impl;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
116 p_reader->reader.canseek = vfs_canseek_impl;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
117 p_reader->reader.data = p_reader;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
118
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
119 p_reader->file = (FILE *) input; // no worries, it gets cast back -nenolod
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
120 p_reader->is_seekable = TRUE; // XXX streams
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
121
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
122 vfs_fseek(input, 0, SEEK_END);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
123 p_reader->file_size = vfs_ftell(input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
124 vfs_fseek(input, 0, SEEK_SET);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
125 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
126
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
127 static void mpcOpenPlugin()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
128 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
129 ConfigDb *cfg;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
130 cfg = bmp_cfg_db_open();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
131 bmp_cfg_db_get_bool(cfg, "musepack", "clipPrevention", &pluginConfig.clipPrevention);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
132 bmp_cfg_db_get_bool(cfg, "musepack", "albumGain", &pluginConfig.albumGain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
133 bmp_cfg_db_get_bool(cfg, "musepack", "dynamicBitrate", &pluginConfig.dynamicBitrate);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
134 bmp_cfg_db_get_bool(cfg, "musepack", "replaygain", &pluginConfig.replaygain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
135 bmp_cfg_db_close(cfg);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
136 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
137
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
138 static void mpcAboutBox()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
139 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
140 GtkWidget* aboutBox = widgets.aboutBox;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
141 if (aboutBox)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
142 gdk_window_raise(aboutBox->window);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
143 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
144 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
145 char* titleText = g_strdup_printf("Musepack Decoder Plugin 1.2");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
146 char* contentText = "Plugin code by\nBenoit Amiaux\nMartin Spuler\nKuniklo\n\nGet latest version at http://musepack.net\n";
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
147 char* buttonText = "Nevermind";
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
148 aboutBox = xmms_show_message(titleText, contentText, buttonText, FALSE, NULL, NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
149 widgets.aboutBox = aboutBox;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
150 g_signal_connect(G_OBJECT(aboutBox), "destroy", G_CALLBACK(gtk_widget_destroyed), &widgets.aboutBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
151 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
152 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
153
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
154 static void mpcConfigBox()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
155 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
156 GtkWidget* configBox = widgets.configBox;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
157 if(configBox)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
158 gdk_window_raise(configBox->window);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
159 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
160 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
161 configBox = gtk_window_new(GTK_WINDOW_TOPLEVEL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
162 gtk_window_set_type_hint(GTK_WINDOW(configBox), GDK_WINDOW_TYPE_HINT_DIALOG);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
163 widgets.configBox = configBox;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
164 g_signal_connect(G_OBJECT(configBox), "destroy", G_CALLBACK(gtk_widget_destroyed), &widgets.configBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
165 gtk_window_set_title(GTK_WINDOW(configBox), "Musepack Decoder Configuration");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
166 gtk_window_set_policy(GTK_WINDOW(configBox), FALSE, FALSE, FALSE);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
167 gtk_container_border_width(GTK_CONTAINER(configBox), 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
168
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
169 GtkWidget* notebook = gtk_notebook_new();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
170 GtkWidget* vbox = gtk_vbox_new(FALSE, 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
171 gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
172 gtk_container_add(GTK_CONTAINER(configBox), vbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
173
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
174 //General Settings Tab
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
175 GtkWidget* generalSet = gtk_frame_new("General Settings");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
176 gtk_container_border_width(GTK_CONTAINER(generalSet), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
177
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
178 GtkWidget* gSvbox = gtk_vbox_new(FALSE, 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
179 gtk_container_border_width(GTK_CONTAINER(gSvbox), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
180 gtk_container_add(GTK_CONTAINER(generalSet), gSvbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
181
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
182 GtkWidget* bitrateCheck = gtk_check_button_new_with_label("Enable Dynamic Bitrate Display");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
183 widgets.bitrateCheck = bitrateCheck;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
184 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bitrateCheck), pluginConfig.dynamicBitrate);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
185 gtk_box_pack_start(GTK_BOX(gSvbox), bitrateCheck, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
186 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), generalSet, gtk_label_new("Plugin"));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
187
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
188 //ReplayGain Settings Tab
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
189 GtkWidget* replaygainSet = gtk_frame_new("ReplayGain Settings");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
190 gtk_container_border_width(GTK_CONTAINER(replaygainSet), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
191
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
192 GtkWidget* rSVbox = gtk_vbox_new(FALSE, 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
193 gtk_container_border_width(GTK_CONTAINER(rSVbox), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
194 gtk_container_add(GTK_CONTAINER(replaygainSet), rSVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
195
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
196 GtkWidget* clippingCheck = gtk_check_button_new_with_label("Enable Clipping Prevention");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
197 widgets.clippingCheck = clippingCheck;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
198 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(clippingCheck), pluginConfig.clipPrevention);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
199 gtk_box_pack_start(GTK_BOX(rSVbox), clippingCheck, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
200
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
201 GtkWidget* replaygainCheck = gtk_check_button_new_with_label("Enable ReplayGain");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
202 widgets.replaygainCheck = replaygainCheck;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
203 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(replaygainCheck), pluginConfig.replaygain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
204 gtk_box_pack_start(GTK_BOX(rSVbox), replaygainCheck, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
205
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
206 GtkWidget* replaygainType = gtk_frame_new("ReplayGain Type");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
207 gtk_box_pack_start(GTK_BOX(rSVbox), replaygainType, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
208 g_signal_connect(G_OBJECT(replaygainCheck), "toggled", G_CALLBACK(toggleSwitch), replaygainType);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
209
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
210 GtkWidget* rgVbox = gtk_vbox_new(FALSE, 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
211 gtk_container_set_border_width(GTK_CONTAINER(rgVbox), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
212 gtk_container_add(GTK_CONTAINER(replaygainType), rgVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
213
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
214 GtkWidget* trackCheck = gtk_radio_button_new_with_label(NULL, "Use Track Gain");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
215 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(trackCheck), !pluginConfig.albumGain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
216 gtk_box_pack_start(GTK_BOX(rgVbox), trackCheck, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
217
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
218 GtkWidget* albumCheck = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(trackCheck)), "Use Album Gain");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
219 widgets.albumCheck = albumCheck;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
220 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(albumCheck), pluginConfig.albumGain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
221 gtk_box_pack_start(GTK_BOX(rgVbox), albumCheck, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
222 gtk_widget_set_sensitive(replaygainType, pluginConfig.replaygain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
223 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), replaygainSet, gtk_label_new("ReplayGain"));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
224
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
225 //Buttons
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
226 GtkWidget* buttonBox = gtk_hbutton_box_new();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
227 gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_END);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
228 gtk_button_box_set_spacing(GTK_BUTTON_BOX(buttonBox), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
229 gtk_box_pack_start(GTK_BOX(vbox), buttonBox, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
230
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
231 GtkWidget* okButton = gtk_button_new_with_label("Ok");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
232 g_signal_connect(G_OBJECT(okButton), "clicked", G_CALLBACK(saveConfigBox), NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
233 GTK_WIDGET_SET_FLAGS(okButton, GTK_CAN_DEFAULT);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
234 gtk_box_pack_start(GTK_BOX(buttonBox), okButton, TRUE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
235
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
236 GtkWidget* cancelButton = gtk_button_new_with_label("Cancel");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
237 g_signal_connect_swapped(G_OBJECT(cancelButton), "clicked", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(widgets.configBox));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
238 GTK_WIDGET_SET_FLAGS(cancelButton, GTK_CAN_DEFAULT);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
239 gtk_widget_grab_default(cancelButton);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
240 gtk_box_pack_start(GTK_BOX(buttonBox), cancelButton, TRUE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
241
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
242 gtk_widget_show_all(configBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
243 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
244 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
245
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
246 static void toggleSwitch(GtkWidget* p_Widget, gpointer p_Data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
247 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
248 gtk_widget_set_sensitive(GTK_WIDGET(p_Data), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(p_Widget)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
249 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
250
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
251 static void saveConfigBox(GtkWidget* p_Widget, gpointer p_Data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
252 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
253 ConfigDb* cfg;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
254 GtkToggleButton* tb;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
255
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
256 tb = GTK_TOGGLE_BUTTON(widgets.replaygainCheck);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
257 pluginConfig.replaygain = gtk_toggle_button_get_active(tb);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
258 tb = GTK_TOGGLE_BUTTON(widgets.clippingCheck);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
259 pluginConfig.clipPrevention = gtk_toggle_button_get_active(tb);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
260 tb = GTK_TOGGLE_BUTTON(widgets.bitrateCheck);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
261 pluginConfig.dynamicBitrate = gtk_toggle_button_get_active(tb);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
262 tb = GTK_TOGGLE_BUTTON(widgets.albumCheck);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
263 pluginConfig.albumGain = gtk_toggle_button_get_active(tb);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
264
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
265 cfg = bmp_cfg_db_open();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
266
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
267 bmp_cfg_db_set_bool(cfg, "musepack", "clipPrevention", pluginConfig.clipPrevention);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
268 bmp_cfg_db_set_bool(cfg, "musepack", "albumGain", pluginConfig.albumGain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
269 bmp_cfg_db_set_bool(cfg, "musepack", "dynamicBitrate", pluginConfig.dynamicBitrate);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
270 bmp_cfg_db_set_bool(cfg, "musepack", "replaygain", pluginConfig.replaygain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
271
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
272 bmp_cfg_db_close(cfg);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
273
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
274 gtk_widget_destroy (widgets.configBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
275 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
276
254
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
277 static int mpcIsOurFD(char* p_Filename, VFSFile* file)
232
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
278 {
254
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
279 gchar magic[3];
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
280 vfs_fread(magic, 1, 3, file);
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
281 if (!strncmp(magic, "MP+", 3))
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
282 return 1;
cdf9756d1528 [svn] Port to NewVFS file probe.
chainsaw
parents: 232
diff changeset
283 return 0;
232
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
284 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
285
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
286 static void mpcPlay(char* p_Filename)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
287 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
288 mpcDecoder.offset = -1;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
289 mpcDecoder.isAlive = true;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
290 mpcDecoder.isOutput = false;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
291 mpcDecoder.isPause = false;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
292 threadHandle = g_thread_create(GThreadFunc(decodeStream), (void *) g_strdup(p_Filename), TRUE, NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
293 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
294
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
295 static void mpcStop()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
296 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
297 setAlive(false);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
298 if (threadHandle)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
299 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
300 g_thread_join(threadHandle);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
301 if (mpcDecoder.isOutput)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
302 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
303 MpcPlugin.output->buffer_free();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
304 MpcPlugin.output->close_audio();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
305 mpcDecoder.isOutput = false;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
306 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
307 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
308 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
309
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
310 static void mpcPause(short p_Pause)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
311 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
312 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
313 mpcDecoder.isPause = p_Pause;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
314 MpcPlugin.output->pause(p_Pause);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
315 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
316 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
317
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
318 static void mpcSeek(int p_Offset)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
319 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
320 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
321 mpcDecoder.offset = static_cast<double> (p_Offset);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
322 MpcPlugin.output->flush(1000 * p_Offset);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
323 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
324 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
325
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
326 static int mpcGetTime()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
327 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
328 if(!isAlive())
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
329 return -1;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
330 return MpcPlugin.output->output_time();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
331 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
332
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
333 static TitleInput *mpcGetSongTuple(char* p_Filename)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
334 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
335 VFSFile *input = vfs_fopen(p_Filename, "rb");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
336 TitleInput *tuple = NULL;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
337
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
338 if(input)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
339 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
340 tuple = bmp_title_input_new();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
341 gchar *filename_proxy = g_strdup(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
342
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
343 tuple->file_name = g_path_get_basename(filename_proxy);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
344 tuple->file_path = g_path_get_dirname(filename_proxy);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
345 tuple->file_ext = "mpc"; // XXX: I can't be assed. -nenolod
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
346
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
347 MpcInfo tags = getTags(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
348
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
349 tuple->date = g_strdup(tags.date);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
350 tuple->track_name = g_strdup(tags.title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
351 tuple->performer = g_strdup(tags.artist);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
352 tuple->album_name = g_strdup(tags.album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
353 tuple->track_number = tags.track;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
354 tuple->year = tags.year;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
355 tuple->genre = g_strdup(tags.genre);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
356 tuple->comment = g_strdup(tags.comment);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
357
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
358 freeTags(tags);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
359
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
360 mpc_streaminfo info;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
361 mpc_reader_file reader;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
362 mpc_reader_setup_file_vfs(&reader, input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
363 mpc_streaminfo_read(&info, &reader.reader);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
364
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
365 tuple->length = static_cast<int> (1000 * mpc_streaminfo_get_length(&info));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
366 vfs_fclose(input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
367 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
368 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
369 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
370 char* temp = g_strdup_printf("[xmms-musepack] mpcGetSongInfo is unable to open %s\n", p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
371 perror(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
372 free(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
373 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
374
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
375 return tuple;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
376 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
377
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
378 static void mpcGetSongInfo(char* p_Filename, char** p_Title, int* p_Length)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
379 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
380 VFSFile *input = vfs_fopen(p_Filename, "rb");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
381 if(input)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
382 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
383 MpcInfo tags = getTags(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
384 *p_Title = mpcGenerateTitle(tags, p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
385 freeTags(tags);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
386 mpc_streaminfo info;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
387 mpc_reader_file reader;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
388 mpc_reader_setup_file_vfs(&reader, input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
389 mpc_streaminfo_read(&info, &reader.reader);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
390 *p_Length = static_cast<int> (1000 * mpc_streaminfo_get_length(&info));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
391 vfs_fclose(input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
392 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
393 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
394 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
395 char* temp = g_strdup_printf("[xmms-musepack] mpcGetSongInfo is unable to open %s\n", p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
396 perror(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
397 free(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
398 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
399 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
400
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
401 static void freeTags(MpcInfo& tags)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
402 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
403 free(tags.title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
404 free(tags.artist);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
405 free(tags.album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
406 free(tags.comment);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
407 free(tags.genre);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
408 free(tags.date);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
409 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
410
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
411 static MpcInfo getTags(const char* p_Filename)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
412 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
413 File oFile(p_Filename, false);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
414 Tag* poTag = oFile.tag();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
415 MpcInfo tags = {0};
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
416 tags.title = g_strdup(poTag->title().toCString(true));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
417 REMOVE_NONEXISTANT_TAG(tags.title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
418 tags.artist = g_strdup(poTag->artist().toCString(true));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
419 REMOVE_NONEXISTANT_TAG(tags.artist);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
420 tags.album = g_strdup(poTag->album().toCString(true));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
421 REMOVE_NONEXISTANT_TAG(tags.album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
422 tags.genre = g_strdup(poTag->genre().toCString(true));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
423 REMOVE_NONEXISTANT_TAG(tags.genre);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
424 tags.comment = g_strdup(poTag->comment().toCString(true));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
425 REMOVE_NONEXISTANT_TAG(tags.comment);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
426 tags.year = poTag->year();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
427 tags.track = poTag->track();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
428 TagLib::APE::Tag* ape = oFile.APETag(false);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
429 if(ape)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
430 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
431 ItemListMap map = ape->itemListMap();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
432 if(map.contains("YEAR"))
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
433 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
434 tags.date = g_strdup(map["YEAR"].toString().toCString(true));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
435 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
436 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
437 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
438 tags.date = g_strdup_printf("%d", tags.year);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
439 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
440 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
441 return tags;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
442 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
443
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
444 static void mpcFileInfoBox(char* p_Filename)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
445 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
446 GtkWidget* infoBox = widgets.infoBox;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
447
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
448 if(infoBox)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
449 gdk_window_raise(infoBox->window);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
450 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
451 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
452 infoBox = gtk_window_new(GTK_WINDOW_TOPLEVEL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
453 gtk_window_set_type_hint(GTK_WINDOW(infoBox), GDK_WINDOW_TYPE_HINT_DIALOG);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
454 widgets.infoBox = infoBox;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
455 gtk_window_set_policy(GTK_WINDOW(infoBox), FALSE, FALSE, FALSE);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
456 g_signal_connect(G_OBJECT(infoBox), "destroy", G_CALLBACK(closeInfoBox), NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
457 gtk_container_set_border_width(GTK_CONTAINER(infoBox), 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
458
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
459 GtkWidget* iVbox = gtk_vbox_new(FALSE, 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
460 gtk_container_add(GTK_CONTAINER(infoBox), iVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
461
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
462 GtkWidget* filenameHbox = gtk_hbox_new(FALSE, 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
463 gtk_box_pack_start(GTK_BOX(iVbox), filenameHbox, FALSE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
464
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
465 GtkWidget* fileLabel = gtk_label_new("Filename:");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
466 gtk_box_pack_start(GTK_BOX(filenameHbox), fileLabel, FALSE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
467
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
468 GtkWidget* fileEntry = gtk_entry_new();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
469 widgets.fileEntry = fileEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
470 gtk_editable_set_editable(GTK_EDITABLE(fileEntry), FALSE);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
471 gtk_box_pack_start(GTK_BOX(filenameHbox), fileEntry, TRUE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
472
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
473 GtkWidget* iHbox = gtk_hbox_new(FALSE, 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
474 gtk_box_pack_start(GTK_BOX(iVbox), iHbox, FALSE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
475
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
476 GtkWidget* leftBox = gtk_vbox_new(FALSE, 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
477 gtk_box_pack_start(GTK_BOX(iHbox), leftBox, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
478
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
479 //Tag labels
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
480 GtkWidget* tagFrame = gtk_frame_new("Musepack Tag");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
481 gtk_box_pack_start(GTK_BOX(leftBox), tagFrame, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
482 gtk_widget_set_sensitive(tagFrame, TRUE);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
483
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
484 GtkWidget* iTable = gtk_table_new(5, 5, FALSE);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
485 gtk_container_set_border_width(GTK_CONTAINER(iTable), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
486 gtk_container_add(GTK_CONTAINER(tagFrame), iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
487
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
488 mpcGtkTagLabel("Title:", 0, 1, 0, 1, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
489 GtkWidget* titleEntry = mpcGtkTagEntry(1, 4, 0, 1, 0, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
490 widgets.titleEntry = titleEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
491
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
492 mpcGtkTagLabel("Artist:", 0, 1, 1, 2, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
493 GtkWidget* artistEntry = mpcGtkTagEntry(1, 4, 1, 2, 0, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
494 widgets.artistEntry = artistEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
495
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
496 mpcGtkTagLabel("Album:", 0, 1, 2, 3, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
497 GtkWidget* albumEntry = mpcGtkTagEntry(1, 4, 2, 3, 0, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
498 widgets.albumEntry = albumEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
499
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
500 mpcGtkTagLabel("Comment:", 0, 1, 3, 4, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
501 GtkWidget* commentEntry = mpcGtkTagEntry(1, 4, 3, 4, 0, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
502 widgets.commentEntry = commentEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
503
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
504 mpcGtkTagLabel("Year:", 0, 1, 4, 5, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
505 GtkWidget* yearEntry = mpcGtkTagEntry(1, 2, 4, 5, 4, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
506 widgets.yearEntry = yearEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
507 gtk_widget_set_usize(yearEntry, 4, -1);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
508
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
509 mpcGtkTagLabel("Track:", 2, 3, 4, 5, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
510 GtkWidget* trackEntry = mpcGtkTagEntry(3, 4, 4, 5, 4, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
511 widgets.trackEntry = trackEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
512 gtk_widget_set_usize(trackEntry, 3, -1);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
513
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
514 mpcGtkTagLabel("Genre:", 0, 1, 5, 6, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
515 GtkWidget* genreEntry = mpcGtkTagEntry(1, 4, 5, 6, 0, iTable);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
516 widgets.genreEntry = genreEntry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
517 gtk_widget_set_usize(genreEntry, 20, -1);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
518
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
519 //Buttons
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
520 GtkWidget* buttonBox = gtk_hbutton_box_new();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
521 gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_END);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
522 gtk_button_box_set_spacing(GTK_BUTTON_BOX(buttonBox), 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
523 gtk_box_pack_start(GTK_BOX(leftBox), buttonBox, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
524
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
525 GtkWidget* saveButton = mpcGtkButton("Save", buttonBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
526 g_signal_connect(G_OBJECT(saveButton), "clicked", G_CALLBACK(saveTags), NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
527
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
528 GtkWidget* removeButton = mpcGtkButton("Remove Tag", buttonBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
529 g_signal_connect_swapped(G_OBJECT(removeButton), "clicked", G_CALLBACK(removeTags), NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
530
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
531 GtkWidget* cancelButton = mpcGtkButton("Cancel", buttonBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
532 g_signal_connect_swapped(G_OBJECT(cancelButton), "clicked", G_CALLBACK(closeInfoBox), NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
533 gtk_widget_grab_default(cancelButton);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
534
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
535 //File information
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
536 GtkWidget* infoFrame = gtk_frame_new("Musepack Info");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
537 gtk_box_pack_start(GTK_BOX(iHbox), infoFrame, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
538
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
539 GtkWidget* infoVbox = gtk_vbox_new(FALSE, 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
540 gtk_container_add(GTK_CONTAINER(infoFrame), infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
541 gtk_container_set_border_width(GTK_CONTAINER(infoVbox), 10);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
542 gtk_box_set_spacing(GTK_BOX(infoVbox), 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
543
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
544 GtkWidget* streamLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
545 GtkWidget* encoderLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
546 GtkWidget* profileLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
547 GtkWidget* bitrateLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
548 GtkWidget* rateLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
549 GtkWidget* channelsLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
550 GtkWidget* lengthLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
551 GtkWidget* fileSizeLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
552 GtkWidget* trackPeakLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
553 GtkWidget* trackGainLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
554 GtkWidget* albumPeakLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
555 GtkWidget* albumGainLabel = mpcGtkLabel(infoVbox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
556
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
557 VFSFile *input = vfs_fopen(p_Filename, "rb");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
558 if(input)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
559 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
560 mpc_streaminfo info;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
561 mpc_reader_file reader;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
562 mpc_reader_setup_file_vfs(&reader, input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
563 mpc_streaminfo_read(&info, &reader.reader);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
564
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
565 int time = static_cast<int> (mpc_streaminfo_get_length(&info));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
566 int minutes = time / 60;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
567 int seconds = time % 60;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
568
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
569 mpcGtkPrintLabel(streamLabel, "Streamversion %d", info.stream_version);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
570 mpcGtkPrintLabel(encoderLabel, "Encoder: \%s", info.encoder);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
571 mpcGtkPrintLabel(profileLabel, "Profile: \%s", info.profile_name);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
572 mpcGtkPrintLabel(bitrateLabel, "Average bitrate: \%6.1f kbps", info.average_bitrate * 1.e-3);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
573 mpcGtkPrintLabel(rateLabel, "Samplerate: \%d Hz", info.sample_freq);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
574 mpcGtkPrintLabel(channelsLabel, "Channels: \%d", info.channels);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
575 mpcGtkPrintLabel(lengthLabel, "Length: \%d:\%.2d", minutes, seconds);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
576 mpcGtkPrintLabel(fileSizeLabel, "File size: \%d Bytes", info.total_file_length);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
577 mpcGtkPrintLabel(trackPeakLabel, "Track Peak: \%5u", info.peak_title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
578 mpcGtkPrintLabel(trackGainLabel, "Track Gain: \%-+2.2f dB", 0.01 * info.gain_title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
579 mpcGtkPrintLabel(albumPeakLabel, "Album Peak: \%5u", info.peak_album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
580 mpcGtkPrintLabel(albumGainLabel, "Album Gain: \%-+5.2f dB", 0.01 * info.gain_album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
581
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
582 MpcInfo tags = getTags(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
583 gtk_entry_set_text(GTK_ENTRY(titleEntry), tags.title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
584 gtk_entry_set_text(GTK_ENTRY(artistEntry), tags.artist);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
585 gtk_entry_set_text(GTK_ENTRY(albumEntry), tags.album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
586 gtk_entry_set_text(GTK_ENTRY(commentEntry), tags.comment);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
587 gtk_entry_set_text(GTK_ENTRY(genreEntry), tags.genre);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
588 char* entry = g_strdup_printf ("%d", tags.track);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
589 gtk_entry_set_text(GTK_ENTRY(trackEntry), entry);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
590 free(entry);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
591 entry = g_strdup_printf ("%d", tags.year);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
592 gtk_entry_set_text(GTK_ENTRY(yearEntry), entry);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
593 free(entry);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
594 entry = g_filename_display_name(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
595 gtk_entry_set_text(GTK_ENTRY(fileEntry), entry);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
596 free(entry);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
597 freeTags(tags);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
598 vfs_fclose(input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
599 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
600 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
601 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
602 char* temp = g_strdup_printf("[xmms-musepack] mpcFileInfoBox is unable to read tags from %s", p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
603 perror(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
604 free(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
605 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
606
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
607 char* name = g_filename_display_basename(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
608 char* text = g_strdup_printf("File Info - %s", name);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
609 free(name);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
610 gtk_window_set_title(GTK_WINDOW(infoBox), text);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
611 free(text);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
612
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
613 gtk_widget_show_all(infoBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
614 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
615 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
616
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
617 static void mpcGtkPrintLabel(GtkWidget* widget, char* format,...)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
618 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
619 va_list args;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
620
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
621 va_start(args, format);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
622 char* temp = g_strdup_vprintf(format, args);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
623 va_end(args);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
624
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
625 gtk_label_set_text(GTK_LABEL(widget), temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
626 free(temp);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
627 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
628
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
629 static GtkWidget* mpcGtkTagLabel(char* p_Text, int a, int b, int c, int d, GtkWidget* p_Box)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
630 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
631 GtkWidget* label = gtk_label_new(p_Text);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
632 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
633 gtk_table_attach(GTK_TABLE(p_Box), label, a, b, c, d, GTK_FILL, GTK_FILL, 5, 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
634 return label;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
635 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
636
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
637 static GtkWidget* mpcGtkTagEntry(int a, int b, int c, int d, int p_Size, GtkWidget* p_Box)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
638 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
639 GtkWidget* entry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
640 if(p_Size == 0)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
641 entry = gtk_entry_new();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
642 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
643 entry = gtk_entry_new_with_max_length(p_Size);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
644 gtk_table_attach(GTK_TABLE(p_Box), entry, a, b, c, d,
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
645 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND | GTK_SHRINK),
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
646 (GtkAttachOptions) (GTK_FILL | GTK_EXPAND | GTK_SHRINK), 0, 5);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
647 return entry;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
648 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
649
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
650 static GtkWidget* mpcGtkLabel(GtkWidget* p_Box)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
651 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
652 GtkWidget* label = gtk_label_new("");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
653 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
654 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
655 gtk_box_pack_start(GTK_BOX(p_Box), label, FALSE, FALSE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
656 return label;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
657 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
658
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
659 static GtkWidget* mpcGtkButton(char* p_Text, GtkWidget* p_Box)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
660 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
661 GtkWidget* button = gtk_button_new_with_label(p_Text);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
662 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
663 gtk_box_pack_start(GTK_BOX(p_Box), button, TRUE, TRUE, 0);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
664 return button;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
665 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
666
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
667 static void removeTags(GtkWidget * w, gpointer data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
668 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
669 File oFile(gtk_entry_get_text(GTK_ENTRY(widgets.fileEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
670 oFile.remove();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
671 oFile.save();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
672 closeInfoBox(NULL, NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
673 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
674
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
675 static void saveTags(GtkWidget* w, gpointer data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
676 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
677 File oFile(gtk_entry_get_text(GTK_ENTRY(widgets.fileEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
678 Tag* poTag = oFile.tag();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
679
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
680 char* cAlbum = g_strdup(gtk_entry_get_text(GTK_ENTRY(widgets.albumEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
681 char* cArtist = g_strdup(gtk_entry_get_text(GTK_ENTRY(widgets.artistEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
682 char* cTitle = g_strdup(gtk_entry_get_text(GTK_ENTRY(widgets.titleEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
683 char* cGenre = g_strdup(gtk_entry_get_text(GTK_ENTRY(widgets.genreEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
684 char* cComment = g_strdup(gtk_entry_get_text(GTK_ENTRY(widgets.commentEntry)));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
685
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
686 const String album = String(cAlbum, TagLib::String::UTF8);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
687 const String artist = String(cArtist, TagLib::String::UTF8);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
688 const String title = String(cTitle, TagLib::String::UTF8);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
689 const String genre = String(cGenre, TagLib::String::UTF8);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
690 const String comment = String(cComment, TagLib::String::UTF8);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
691
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
692 poTag->setAlbum(album);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
693 poTag->setArtist(artist);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
694 poTag->setTitle(title);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
695 poTag->setGenre(genre);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
696 poTag->setComment(comment);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
697 poTag->setYear(atoi(gtk_entry_get_text(GTK_ENTRY(widgets.yearEntry))));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
698 poTag->setTrack(atoi(gtk_entry_get_text(GTK_ENTRY(widgets.trackEntry))));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
699
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
700 free(cAlbum);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
701 free(cArtist);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
702 free(cTitle);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
703 free(cGenre);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
704 free(cComment);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
705
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
706 oFile.save();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
707 closeInfoBox(NULL, NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
708 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
709
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
710 static void closeInfoBox(GtkWidget* w, gpointer data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
711 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
712 gtk_widget_destroy(widgets.infoBox);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
713 widgets.infoBox = NULL;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
714 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
715
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
716 static char* mpcGenerateTitle(const MpcInfo& p_Tags, char* p_Filename)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
717 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
718 TitleInput* tuple = mpcGetSongTuple(p_Filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
719
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
720 char* title = xmms_get_titlestring (xmms_get_gentitle_format(), tuple);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
721 if(!title)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
722 title = g_strdup(tuple->file_name);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
723 else if (!*title)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
724 title = g_strdup(tuple->file_name);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
725
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
726 bmp_title_input_free(tuple);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
727 return title;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
728 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
729
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
730 static void* endThread(char* p_FileName, VFSFile * p_FileHandle, bool release)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
731 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
732 free(p_FileName);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
733 if(release)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
734 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
735 if(mpcDecoder.isError)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
736 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
737 perror(mpcDecoder.isError);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
738 free(mpcDecoder.isError);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
739 mpcDecoder.isError = NULL;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
740 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
741 setAlive(false);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
742 if(p_FileHandle)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
743 vfs_fclose(p_FileHandle);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
744 if(track.display)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
745 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
746 free(track.display);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
747 track.display = NULL;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
748 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
749 g_thread_exit(NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
750 return 0;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
751 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
752
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
753 static void* decodeStream(void* data)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
754 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
755 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
756 char* filename = static_cast<char*> (data);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
757 VFSFile *input = vfs_fopen(filename, "rb");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
758 if (!input)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
759 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
760 mpcDecoder.isError = g_strdup_printf("[xmms-musepack] decodeStream is unable to open %s", filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
761 return endThread(filename, input, true);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
762 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
763
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
764 mpc_reader_file reader;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
765 mpc_reader_setup_file_vfs(&reader, input);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
766
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
767 mpc_streaminfo info;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
768 if (mpc_streaminfo_read(&info, &reader.reader) != ERROR_CODE_OK)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
769 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
770 mpcDecoder.isError = g_strdup_printf("[xmms-musepack] decodeStream is unable to read %s", filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
771 return endThread(filename, input, true);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
772 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
773
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
774 MpcInfo tags = getTags(filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
775 track.display = mpcGenerateTitle(tags, filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
776 track.length = static_cast<int> (1000 * mpc_streaminfo_get_length(&info));
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
777 track.bitrate = static_cast<int> (info.average_bitrate);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
778 track.sampleFreq = info.sample_freq;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
779 track.channels = info.channels;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
780 freeTags(tags);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
781
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
782 MpcPlugin.set_info(track.display, track.length, track.bitrate, track.sampleFreq, track.channels);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
783
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
784 mpc_decoder decoder;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
785 mpc_decoder_setup(&decoder, &reader.reader);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
786 if (!mpc_decoder_initialize(&decoder, &info))
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
787 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
788 mpcDecoder.isError = g_strdup_printf("[xmms-musepack] decodeStream is unable to initialize decoder on %s", filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
789 return endThread(filename, input, true);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
790 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
791
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
792 setReplaygain(info, decoder);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
793
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
794 MPC_SAMPLE_FORMAT sampleBuffer[MPC_DECODER_BUFFER_LENGTH];
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
795 char xmmsBuffer[MPC_DECODER_BUFFER_LENGTH * 4];
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
796
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
797 if (!MpcPlugin.output->open_audio(FMT_S16_LE, track.sampleFreq, track.channels))
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
798 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
799 mpcDecoder.isError = g_strdup_printf("[xmms-musepack] decodeStream is unable to open an audio output");
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
800 return endThread(filename, input, true);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
801 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
802 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
803 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
804 mpcDecoder.isOutput = true;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
805 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
806
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
807 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
808
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
809 int counter = 2 * track.sampleFreq / 3;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
810 while (isAlive())
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
811 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
812 if (getOffset() != -1)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
813 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
814 mpc_decoder_seek_seconds(&decoder, mpcDecoder.offset);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
815 setOffset(-1);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
816 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
817
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
818 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
819 short iPlaying = MpcPlugin.output->buffer_playing()? 1 : 0;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
820 int iFree = MpcPlugin.output->buffer_free();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
821 if (!mpcDecoder.isPause && iFree >= ((1152 * 4) << iPlaying))
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
822 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
823 unsigned status = processBuffer(sampleBuffer, xmmsBuffer, decoder);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
824 if (status == (unsigned) (-1))
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
825 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
826 mpcDecoder.isError = g_strdup_printf("[xmms-musepack] error from internal decoder on %s", filename);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
827 return endThread(filename, input, true);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
828 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
829 if (status == 0 && iPlaying == 0)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
830 return endThread(filename, input, true);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
831
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
832 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
833
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
834 if(pluginConfig.dynamicBitrate)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
835 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
836 counter -= status;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
837 if(counter < 0)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
838 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
839 MpcPlugin.set_info(track.display, track.length, track.bitrate, track.sampleFreq, track.channels);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
840 counter = 2 * track.sampleFreq / 3;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
841 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
842 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
843 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
844 else
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
845 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
846 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
847 xmms_usleep(10000);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
848 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
849 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
850 return endThread(filename, input, false);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
851 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
852
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
853 static int processBuffer(MPC_SAMPLE_FORMAT* sampleBuffer, char* xmmsBuffer, mpc_decoder& decoder)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
854 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
855 mpc_uint32_t vbrAcc = 0;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
856 mpc_uint32_t vbrUpd = 0;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
857
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
858 unsigned status = mpc_decoder_decode(&decoder, sampleBuffer, &vbrAcc, &vbrUpd);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
859 copyBuffer(sampleBuffer, xmmsBuffer, status);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
860
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
861 if (pluginConfig.dynamicBitrate)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
862 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
863 track.bitrate = static_cast<int> (vbrUpd * track.sampleFreq / 1152);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
864 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
865
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
866 produce_audio(MpcPlugin.output->written_time(), FMT_S16_LE, track.channels, status * 4, xmmsBuffer, NULL);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
867 return status;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
868 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
869
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
870 static void setReplaygain(mpc_streaminfo& info, mpc_decoder& decoder)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
871 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
872 if(!pluginConfig.replaygain && !pluginConfig.clipPrevention)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
873 return;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
874
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
875 int peak = pluginConfig.albumGain ? info.peak_album : info.peak_title;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
876 double gain = pluginConfig.albumGain ? info.gain_album : info.gain_title;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
877
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
878 if(!peak)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
879 peak = 32767;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
880 if(!gain)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
881 gain = 1.;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
882
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
883 double clip = 32767. / peak;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
884 gain = exp((M_LN10 / 2000.) * gain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
885
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
886 if(pluginConfig.clipPrevention && !pluginConfig.replaygain)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
887 gain = clip;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
888 else if(pluginConfig.replaygain && pluginConfig.clipPrevention)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
889 if(clip < gain)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
890 gain = clip;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
891
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
892 mpc_decoder_scale_output(&decoder, gain);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
893 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
894
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
895 inline static void lockAcquire()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
896 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
897 g_static_mutex_lock(&threadMutex);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
898 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
899
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
900 inline static void lockRelease()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
901 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
902 g_static_mutex_unlock(&threadMutex);
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
903 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
904
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
905 inline static bool isAlive()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
906 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
907 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
908 bool isAlive = mpcDecoder.isAlive;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
909 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
910 return isAlive;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
911 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
912
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
913 inline static bool isPause()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
914 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
915 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
916 bool isPause = mpcDecoder.isPause;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
917 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
918 return isPause;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
919 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
920
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
921 inline static void setAlive(bool isAlive)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
922 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
923 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
924 mpcDecoder.isAlive = isAlive;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
925 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
926 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
927
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
928 inline static double getOffset()
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
929 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
930 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
931 double offset = mpcDecoder.offset;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
932 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
933 return offset;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
934 }
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
935
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
936 inline static void setOffset(double offset)
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
937 {
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
938 lockAcquire();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
939 mpcDecoder.offset = offset;
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
940 lockRelease();
6c78d6d3cdb7 [svn] - put musepack support back
nenolod
parents:
diff changeset
941 }