1 /* grip.h
2  *
3  * Copyright (c) 1998-2002  Mike Oliphant <oliphant@gtk.org>
4  *
5  *   http://www.nostatic.org/grip
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
20  * USA
21  *
22  */
23 
24 #ifndef GRIP_H
25 #define GRIP_H
26 
27 #include "config.h"
28 #include <gtk/gtk.h>
29 #include "cddev.h"
30 #include "discdb.h"
31 #include "pthread.h"
32 #include "launch.h"
33 
34 #if defined(HAVE_CDDA_INTERFACE_H) || defined(HAVE_CDDA_CDDA_INTERFACE_H)
35 #define CDPAR
36 #endif
37 
38 #define WINWIDTH 600
39 #define WINHEIGHT 450
40 
41 #define WINHEIGHTEDIT 600
42 
43 #define MIN_WINWIDTH 200
44 #define MIN_WINHEIGHT 80
45 
46 #define MAX_NUM_CPU 16
47 
48 #define RRand(range) (random()%(range))
49 
50 #if defined(__linux__) || defined(__FreeBSD__) || defined(__GLIBC__) || defined(__NetBSD__) || defined(__osf__)  /* __osf__ ?? */
51 
52 #define MAILER "/usr/sbin/sendmail -i -t"
53 
54 #elif defined(__sparc__)
55 
56 #define MAILER "/usr/lib/sendmail -i -t"
57 
58 #endif
59 
60 typedef struct _grip_gui {
61   GtkWidget *app;
62   GtkWidget *winbox;
63   GtkWidget *notebook;
64   gboolean minimized;
65   int win_width;
66   int win_height;
67   int win_height_edit;
68   int win_width_min;
69   int win_height_min;
70   int x;
71   int y;
72   GtkStyle *style_wb;
73   GtkStyle *style_LCD;
74   GtkStyle *style_dark_grey;
75 
76   GtkWidget *disc_name_label;
77   GtkWidget *disc_artist_label;
78 
79   GtkWidget *dbinfo_hbox;
80   GtkWidget *dbinfo_back_button;
81   GtkWidget *dbinfo_forward_button;
82 
83   GtkListStore *track_list_store;
84   GtkWidget *track_list;
85 
86   GtkWidget *current_track_label;
87   int time_display_mode;
88   GtkWidget *play_time_label;
89   GtkWidget *rip_indicator;
90   GtkWidget *lcd_smile_indicator;
91   GtkWidget *mp3_indicator[MAX_NUM_CPU];
92   GtkWidget *discdb_indicator;
93   GtkWidget *control_button_box;
94   GtkWidget *controls;
95   gboolean control_buttons_visible;
96   GdkCursor *wait_cursor;
97 
98   gboolean track_edit_visible;
99   GtkWidget *track_edit_box;
100   GtkWidget *artist_edit_entry;
101   GtkWidget *title_edit_entry;
102   GtkWidget *id3_genre_combo;
103   GList *id3_genre_item_list;
104   GtkWidget *year_spin_button;
105   GtkWidget *track_edit_entry;
106   GtkWidget *multi_artist_box;
107   GtkWidget *track_artist_edit_entry;
108   GtkWidget *split_chars_entry;
109   GtkWidget *multi_artist_button;
110   GtkWidget *playopts;
111   GtkWidget *playlist_entry;
112   GtkWidget *play_indicator;
113   GtkWidget *loop_indicator;
114   gboolean track_prog_visible;
115 
116   GtkWidget *volume_control;
117   gboolean volvis;
118 
119   GtkWidget *play_sector_label;
120 
121   GtkWidget *partial_rip_box;
122   GtkWidget *rip_prog_label;
123   GtkWidget *ripprogbar;
124   GtkWidget *smile_indicator;
125   GtkWidget *mp3_prog_label[MAX_NUM_CPU];
126   GtkWidget *mp3progbar[MAX_NUM_CPU];
127 
128   GtkWidget *start_sector_entry;
129   GtkWidget *end_sector_entry;
130 
131   GtkWidget *rip_exe_box;
132   GtkWidget *rip_builtin_box;
133   GtkWidget *ripexename_entry;
134   GtkWidget *ripcmdline_entry;
135   GtkWidget *mp3exename_entry;
136   GtkWidget *mp3cmdline_entry;
137   GtkWidget *mp3extension_entry;
138 
139   /* Overall prgress */
140   GtkWidget *all_label;
141   GtkWidget *all_rip_label;
142   GtkWidget *all_enc_label;
143   GtkWidget *all_ripprogbar;
144   GtkWidget *all_encprogbar;
145 
146   /* Images */
147   GtkWidget *check_image;
148   GtkWidget *eject_image;
149   GtkWidget *cdscan_image;
150   GtkWidget *ff_image;
151   GtkWidget *lowleft_image;
152   GtkWidget *lowright_image;
153   GtkWidget *minmax_image;
154   GtkWidget *nexttrk_image;
155   GtkWidget *playpaus_image;
156   GtkWidget *prevtrk_image;
157   GtkWidget *loop_image;
158   GtkWidget *noloop_image;
159   GtkWidget *random_image;
160   GtkWidget *playlist_image;
161   GtkWidget *playnorm_image;
162   GtkWidget *quit_image;
163   GtkWidget *rew_image;
164   GtkWidget *stop_image;
165   GtkWidget *upleft_image;
166   GtkWidget *upright_image;
167   GtkWidget *vol_image;
168   GtkWidget *discdbwht_image;
169   GtkWidget *rotate_image;
170   GtkWidget *edit_image;
171   GtkWidget *progtrack_image;
172   GtkWidget *mail_image;
173   GtkWidget *save_image;
174   GtkWidget *empty_image;
175 
176   GtkWidget *discdb_pix[2];
177   GtkWidget *rip_pix[4];
178   GtkWidget *mp3_pix[4];
179   GtkWidget *smile_pix[8];
180 
181   GtkWidget *play_pix[3];
182 
183   /* notification area widgets */
184   GtkStatusIcon *tray_icon;
185   GtkWidget *tray_menu;
186   GtkWidget *tray_menu_play;
187   GtkWidget *tray_menu_pause;
188 } GripGUI;
189 
190 struct _encode_track;
191 
192 typedef struct _grip_info {
193   char version[256];
194   DiscInfo disc;
195   DiscData ddata;
196   gboolean use_proxy;
197   gboolean use_proxy_env;
198   ProxyServer proxy_server;
199   DiscDBServer dbserver;
200   DiscDBServer dbserver2;
201   char config_filename[256];
202   char cd_device[256];
203   char force_scsi[256];
204   char discdb_submit_email[256];
205   char discdb_encoding[16];
206   char id3_encoding[16];
207   char id3v2_encoding[16];
208   gboolean db_use_freedb;
209   char user_email[256];
210   gboolean local_mode;
211   gboolean update_required;
212   gboolean have_disc;
213   gboolean tray_open;
214   gboolean faulty_eject;
215   gboolean looking_up;
216   gboolean ask_submit;
217   gboolean is_new_disc;
218   gboolean first_time;
219   gboolean play_first;
220   gboolean play_on_insert;
221   gboolean stop_first;
222   gboolean no_interrupt;
223   gboolean automatic_discdb;
224   gboolean poll_drive;
225   int poll_interval;
226   int auto_eject_countdown;
227   int current_discid;
228   pthread_t discdb_thread;
229   int volume;
230 
231   int current_disc;
232   int changer_slots;
233 
234   gboolean playing;
235   gboolean stopped;
236   gboolean ffwding;
237   gboolean rewinding;
238   int play_mode;
239   gboolean playloop;
240   int current_track_index;
241   int tracks_prog[MAX_TRACKS];
242   int prog_totaltracks;
243   gboolean automatic_reshuffle;
244 
245   char title_split_chars[6];
246 
247   GripGUI gui_info;
248 
249   int curr_pipe_fd;
250 
251   int num_cpu;
252   gboolean ripping;
253   gboolean encoding;
254   gboolean stop_rip;
255   gboolean stop_encode;
256   gboolean ripping_a_disc;
257   time_t rip_finished;
258   int rippid;
259   int num_wavs;
260   int rip_track;
261   time_t rip_started;
262   int ripsize;
263   char ripfile[PATH_MAX];
264   int start_sector;
265   int end_sector;
266   gboolean doencode;
267   int mp3pid[MAX_NUM_CPU];
268   char mp3file[MAX_NUM_CPU][PATH_MAX];
269   int mp3size[MAX_NUM_CPU];
270   int mp3_started[MAX_NUM_CPU];
271   int mp3_enc_track[MAX_NUM_CPU];
272   char rip_delete_file[MAX_NUM_CPU][PATH_MAX];
273   double track_gain_adjustment;
274   double disc_gain_adjustment;
275   struct _encode_track *encoded_track[MAX_NUM_CPU];
276   GList *encode_list;
277   GList *pending_list;
278   gboolean delayed_encoding;
279   int selected_ripper;
280   gboolean using_builtin_cdp;
281   gboolean in_rip_thread;
282   gboolean do_redirect;
283 #ifdef CDPAR
284   pthread_t cdp_thread;
285   gboolean stop_thread_rip_now;
286   gboolean disable_paranoia;
287   gboolean disable_extra_paranoia;
288   gboolean disable_scratch_detect;
289   gboolean disable_scratch_repair;
290   gboolean calc_gain;
291   int rip_smile_level;
292   gfloat rip_percent_done;
293 #endif
294   char ripexename[256];
295   char ripfileformat[256];
296   char ripfileformat_multi[256];
297   char ripcmdline[256];
298   int ripnice;
299   int max_wavs;
300   gboolean auto_rip;
301   gboolean beep_after_rip;
302   gboolean eject_after_rip;
303   gboolean rip_partial;
304   int eject_delay;
305   gboolean delay_before_rip;
306   gboolean stop_between_tracks;
307   char wav_filter_cmd[256];
308   char disc_filter_cmd[256];
309   int selected_encoder;
310   char mp3cmdline[256];
311   char mp3extension[10];
312   char mp3fileformat[256];
313   char mp3fileformat_multi[256];
314   char mp3exename[256];
315   gboolean delete_wavs;
316   gboolean add_to_db;
317   gboolean add_m3u;
318   gboolean rel_m3u;
319   char m3ufileformat[256];
320   int kbits_per_sec;
321   int edit_num_cpu;
322   int mp3nice;
323   char mp3_filter_cmd[256];
324   char execute_after_encode_cmd[256];
325   gboolean doid3;
326   gboolean doid3v2;
327   gboolean tag_mp3_only;
328   char id3_comment[30];
329   char cdupdate[256];
330   StrTransPrefs sprefs;
331   gboolean keep_min_size;
332 
333   /* some vars for use in TrayIconUpdate */
334   gfloat rip_percent;
335   gfloat enc_percent;
336 
337   gfloat rip_tot_percent;
338   gfloat enc_tot_percent;
339 
340   gboolean app_visible;
341 
342   gboolean show_tray_icon;
343   gboolean tray_icon_made;
344   gboolean tray_menu_sensitive;
345 
346   /* these are for calculating ripping progress */
347   size_t all_ripsize;
348   size_t all_ripdone;
349   size_t all_riplast;
350   size_t all_encsize;
351   size_t all_encdone;
352   size_t all_enclast[MAX_NUM_CPU];
353 } GripInfo;
354 
355 GtkWidget *GripNew(char *device,char *scsi_device,
356 		   char *config_filename, gboolean force_small,
357 		   gboolean local_mode,gboolean no_redirect);
358 void GripDie(GtkWidget *widget,gpointer data);
359 void GripUpdate(GtkWidget *app);
360 GtkWidget *MakeNewPage(GtkWidget *notebook,char *name);
361 void Busy(GripGUI *uinfo);
362 void UnBusy(GripGUI *uinfo);
363 void CloseStuff(void *user_data);
364 
365 #endif /* ifndef GRIP_H */
366 
367