Update to MPlayer SVN rev 34578.
[vaapi:mplayer.git] / gui / cfg.c
1 /*
2  * This file is part of MPlayer.
3  *
4  * MPlayer is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * MPlayer is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22
23 #include "cfg.h"
24 #include "interface.h"
25 #include "util/list.h"
26 #include "util/string.h"
27
28 #include "config.h"
29 #include "help_mp.h"
30 #include "libmpcodecs/vd.h"
31 #include "libvo/video_out.h"
32 #include "libvo/x11_common.h"
33 #include "mixer.h"
34 #include "mp_core.h"
35 #include "mp_msg.h"
36 #include "mpcommon.h"
37 #include "mplayer.h"
38 #include "parser-cfg.h"
39 #include "path.h"
40 #include "sub/font_load.h"
41 #include "sub/sub.h"
42
43 m_config_t *gui_conf;
44
45 int gtkCacheOn;
46 int gtkCacheSize = 2048;
47
48 int gtkVfPP;
49
50 int gtkVfLAVC;
51 char *gtkDXR3Device;
52
53 int gtkAutoSyncOn;
54 int gtkAutoSync;
55
56 int gtkAONorm;
57 int gtkAOSurround;
58 int gtkAOExtraStereo;
59 float gtkAOExtraStereoMul = 1.0f;
60
61 char *gtkAOALSAMixer;
62 char *gtkAOALSAMixerChannel;
63 char *gtkAOALSADevice;
64
65 char *gtkAOOSSMixer;
66 char *gtkAOOSSMixerChannel;
67 char *gtkAOOSSDevice;
68
69 char *gtkAOESDDevice;
70
71 char *gtkAOSDLDriver;
72
73 int gtkEnableAudioEqualizer;
74 float gtkEquChannels[6][10];
75
76 int gtkSubDumpMPSub;
77 int gtkSubDumpSrt;
78
79 gtkASS_t gtkASS;
80
81 int gtkEnablePlayBar = 1;
82 int gtkLoadFullscreen;
83 int gtkShowVideoWindow = 1;
84
85 int gui_save_pos   = 1;
86 int gui_main_pos_x = -3;
87 int gui_main_pos_y = -3;
88 int gui_sub_pos_x  = -3;
89 int gui_sub_pos_y  = -3;
90
91 int guiWinID = -1;
92
93 char *skinName;
94
95 char *fsHistory[5];
96
97 static const m_option_t gui_opts[] = {
98     { "cache",                       &gtkCacheOn,              CONF_TYPE_FLAG,        0,           0,     1,       NULL },
99     { "cache_size",                  &gtkCacheSize,            CONF_TYPE_INT,         CONF_RANGE,  32,    1048576, NULL },
100
101     { "vf_pp",                       &gtkVfPP,                 CONF_TYPE_FLAG,        0,           0,     1,       NULL },
102
103 #ifdef CONFIG_DXR3
104     { "vf_lavc",                     &gtkVfLAVC,               CONF_TYPE_FLAG,        0,           0,     1,       NULL },
105     { "vo_dxr3_device",              &gtkDXR3Device,           CONF_TYPE_STRING,      0,           0,     0,       NULL },
106 #endif
107
108     { "autosync",                    &gtkAutoSyncOn,           CONF_TYPE_FLAG,        0,           0,     1,       NULL },
109     { "autosync_size",               &gtkAutoSync,             CONF_TYPE_INT,         CONF_RANGE,  0,     10000,   NULL },
110
111     { "ao_volnorm",                  &gtkAONorm,               CONF_TYPE_FLAG,        0,           0,     1,       NULL },
112     { "ao_surround",                 &gtkAOSurround,           CONF_TYPE_FLAG,        0,           0,     1,       NULL },
113     { "ao_extra_stereo",             &gtkAOExtraStereo,        CONF_TYPE_FLAG,        0,           0,     1,       NULL },
114     { "ao_extra_stereo_coefficient", &gtkAOExtraStereoMul,     CONF_TYPE_FLOAT,       CONF_RANGE,  -10.0, 10.0,    NULL },
115
116 #ifdef CONFIG_ALSA
117     { "ao_alsa_mixer",               &gtkAOALSAMixer,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
118     { "ao_alsa_mixer_channel",       &gtkAOALSAMixerChannel,   CONF_TYPE_STRING,      0,           0,     0,       NULL },
119     { "ao_alsa_device",              &gtkAOALSADevice,         CONF_TYPE_STRING,      0,           0,     0,       NULL },
120 #endif
121
122 #ifdef CONFIG_OSS_AUDIO
123     { "ao_oss_mixer",                &gtkAOOSSMixer,           CONF_TYPE_STRING,      0,           0,     0,       NULL },
124     { "ao_oss_mixer_channel",        &gtkAOOSSMixerChannel,    CONF_TYPE_STRING,      0,           0,     0,       NULL },
125     { "ao_oss_device",               &gtkAOOSSDevice,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
126 #endif
127
128 #ifdef CONFIG_ESD
129     { "ao_esd_device",               &gtkAOESDDevice,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
130 #endif
131
132 #ifdef CONFIG_SDL
133     { "ao_sdl_subdriver",            &gtkAOSDLDriver,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
134 #endif
135
136     { "enable_audio_equ",            &gtkEnableAudioEqualizer, CONF_TYPE_FLAG,        0,           0,     1,       NULL },
137
138     { "equ_channel_1",               &gtkEquChannel1,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
139     { "equ_channel_2",               &gtkEquChannel2,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
140     { "equ_channel_3",               &gtkEquChannel3,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
141     { "equ_channel_4",               &gtkEquChannel4,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
142     { "equ_channel_5",               &gtkEquChannel5,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
143     { "equ_channel_6",               &gtkEquChannel6,          CONF_TYPE_STRING,      0,           0,     0,       NULL },
144
145 #define audio_equ_row(i, j) \
146     { "equ_band_" # i # j,           &gtkEquChannels[i][j],    CONF_TYPE_FLOAT,       CONF_RANGE,  -15.0, 15.0,    NULL }
147     audio_equ_row(0, 0), audio_equ_row(0, 1), audio_equ_row(0, 2), audio_equ_row(0, 3), audio_equ_row(0, 4), audio_equ_row(0, 5), audio_equ_row(0, 6), audio_equ_row(0, 7), audio_equ_row(0, 8), audio_equ_row(0, 9),
148     audio_equ_row(1, 0), audio_equ_row(1, 1), audio_equ_row(1, 2), audio_equ_row(1, 3), audio_equ_row(1, 4), audio_equ_row(1, 5), audio_equ_row(1, 6), audio_equ_row(1, 7), audio_equ_row(1, 8), audio_equ_row(1, 9),
149     audio_equ_row(2, 0), audio_equ_row(2, 1), audio_equ_row(2, 2), audio_equ_row(2, 3), audio_equ_row(2, 4), audio_equ_row(2, 5), audio_equ_row(2, 6), audio_equ_row(2, 7), audio_equ_row(2, 8), audio_equ_row(2, 9),
150     audio_equ_row(3, 0), audio_equ_row(3, 1), audio_equ_row(3, 2), audio_equ_row(3, 3), audio_equ_row(3, 4), audio_equ_row(3, 5), audio_equ_row(3, 6), audio_equ_row(3, 7), audio_equ_row(3, 8), audio_equ_row(3, 9),
151     audio_equ_row(4, 0), audio_equ_row(4, 1), audio_equ_row(4, 2), audio_equ_row(4, 3), audio_equ_row(4, 4), audio_equ_row(4, 5), audio_equ_row(4, 6), audio_equ_row(4, 7), audio_equ_row(4, 8), audio_equ_row(4, 9),
152     audio_equ_row(5, 0), audio_equ_row(5, 1), audio_equ_row(5, 2), audio_equ_row(5, 3), audio_equ_row(5, 4), audio_equ_row(5, 5), audio_equ_row(5, 6), audio_equ_row(5, 7), audio_equ_row(5, 8), audio_equ_row(5, 9),
153 #undef audio_equ_row
154
155     { "playbar",                     &gtkEnablePlayBar,        CONF_TYPE_FLAG,        0,           0,     1,       NULL },
156     { "load_fullscreen",             &gtkLoadFullscreen,       CONF_TYPE_FLAG,        0,           0,     1,       NULL },
157     { "show_videowin",               &gtkShowVideoWindow,      CONF_TYPE_FLAG,        0,           0,     1,       NULL },
158
159     { "gui_save_pos",                &gui_save_pos,            CONF_TYPE_FLAG,        0,           0,     1,       NULL },
160     { "gui_main_pos_x",              &gui_main_pos_x,          CONF_TYPE_INT,         0,           0,     0,       NULL },
161     { "gui_main_pos_y",              &gui_main_pos_y,          CONF_TYPE_INT,         0,           0,     0,       NULL },
162     { "gui_video_out_pos_x",         &gui_sub_pos_x,           CONF_TYPE_INT,         0,           0,     0,       NULL },
163     { "gui_video_out_pos_y",         &gui_sub_pos_y,           CONF_TYPE_INT,         0,           0,     0,       NULL },
164
165     { "idle",                        &player_idle_mode,        CONF_TYPE_FLAG,        CONF_GLOBAL, 0,     1,       NULL },
166
167     // NOTE TO MYSELF: Do we really need all/any non-gtkOptions, i.e. override mplayer options?
168
169     { "gui_skin",                    &skinName,                CONF_TYPE_STRING,      0,           0,     0,       NULL },
170
171     { "stopxscreensaver",            &stop_xscreensaver,       CONF_TYPE_FLAG,        0,           0,     1,       NULL },
172
173     { "cdrom_device",                &cdrom_device,            CONF_TYPE_STRING,      0,           0,     0,       NULL },
174     { "dvd_device",                  &dvd_device,              CONF_TYPE_STRING,      0,           0,     0,       NULL },
175
176     { "osd_level",                   &osd_level,               CONF_TYPE_INT,         CONF_RANGE,  0,     3,       NULL },
177
178     { "vo_driver",                   &video_driver_list,       CONF_TYPE_STRING_LIST, 0,           0,     0,       NULL },
179     { "v_vfm",                       &video_fm_list,           CONF_TYPE_STRING_LIST, 0,           0,     0,       NULL },
180
181     { "vf_autoq",                    &auto_quality,            CONF_TYPE_INT,         CONF_RANGE,  0,     100,     NULL },
182     { "vo_direct_render",            &vo_directrendering,      CONF_TYPE_FLAG,        0,           0,     1,       NULL },
183     { "vo_doublebuffering",          &vo_doublebuffering,      CONF_TYPE_FLAG,        0,           0,     1,       NULL },
184     { "vo_panscan",                  &vo_panscan,              CONF_TYPE_FLOAT,       CONF_RANGE,  0.0,   1.0,     NULL },
185
186     { "v_flip",                      &flip,                    CONF_TYPE_INT,         CONF_RANGE,  -1,    1,       NULL },
187     { "v_framedrop",                 &frame_dropping,          CONF_TYPE_INT,         CONF_RANGE,  0,     2,       NULL },
188     { "v_idx",                       &index_mode,              CONF_TYPE_INT,         CONF_RANGE,  -1,    2,       NULL },
189     { "v_ni",                        &force_ni,                CONF_TYPE_FLAG,        0,           0,     1,       NULL },
190
191     { "ao_driver",                   &audio_driver_list,       CONF_TYPE_STRING_LIST, 0,           0,     0,       NULL },
192     { "a_afm",                       &audio_fm_list,           CONF_TYPE_STRING_LIST, 0,           0,     0,       NULL },
193
194     { "softvol",                     &soft_vol,                CONF_TYPE_FLAG,        0,           0,     1,       NULL },
195
196     { "sub_auto_load",               &sub_auto,                CONF_TYPE_FLAG,        0,           0,     1,       NULL },
197 #ifdef CONFIG_ICONV
198     { "sub_cp",                      &sub_cp,                  CONF_TYPE_STRING,      0,           0,     0,       NULL },
199 #endif
200     { "sub_overlap",                 &suboverlap_enabled,      CONF_TYPE_FLAG,        0,           0,     0,       NULL },
201     { "sub_pos",                     &sub_pos,                 CONF_TYPE_INT,         CONF_RANGE,  0,     200,     NULL },
202     { "sub_unicode",                 &sub_unicode,             CONF_TYPE_FLAG,        0,           0,     1,       NULL },
203
204     { "font_factor",                 &font_factor,             CONF_TYPE_FLOAT,       CONF_RANGE,  0.0,   10.0,    NULL },
205     { "font_name",                   &font_name,               CONF_TYPE_STRING,      0,           0,     0,       NULL },
206
207 #ifdef CONFIG_FREETYPE
208     { "font_encoding",               &subtitle_font_encoding,  CONF_TYPE_STRING,      0,           0,     0,       NULL },
209     { "font_text_scale",             &text_font_scale_factor,  CONF_TYPE_FLOAT,       CONF_RANGE,  0.0,   100.0,   NULL },
210     { "font_osd_scale",              &osd_font_scale_factor,   CONF_TYPE_FLOAT,       CONF_RANGE,  0.0,   100.0,   NULL },
211     { "font_blur",                   &subtitle_font_radius,    CONF_TYPE_FLOAT,       CONF_RANGE,  0.0,   8.0,     NULL },
212     { "font_outline",                &subtitle_font_thickness, CONF_TYPE_FLOAT,       CONF_RANGE,  0.0,   8.0,     NULL },
213     { "font_autoscale",              &subtitle_autoscale,      CONF_TYPE_INT,         CONF_RANGE,  0,     3,       NULL },
214 #endif
215
216 #ifdef CONFIG_ASS
217     { "ass_enabled",                 &ass_enabled,             CONF_TYPE_FLAG,        0,           0,     1,       NULL },
218     { "ass_use_margins",             &ass_use_margins,         CONF_TYPE_FLAG,        0,           0,     1,       NULL },
219     { "ass_top_margin",              &ass_top_margin,          CONF_TYPE_INT,         CONF_RANGE,  0,     512,     NULL },
220     { "ass_bottom_margin",           &ass_bottom_margin,       CONF_TYPE_INT,         CONF_RANGE,  0,     512,     NULL },
221 #endif
222
223     { NULL,                          NULL,                     0,                     0,           0,     0,       NULL }
224 };
225
226 static char *gfgets(char *str, int size, FILE *f)
227 {
228     char *s, c;
229
230     s = fgets(str, size, f);
231
232     if (s) {
233         c = s[strlen(s) - 1];
234
235         if (c == '\n' || c == '\r')
236             s[strlen(s) - 1] = 0;
237
238         c = s[strlen(s) - 1];
239
240         if (c == '\n' || c == '\r')
241             s[strlen(s) - 1] = 0;
242     }
243
244     return s;
245 }
246
247 int cfg_gui_include(m_option_t *conf, const char *filename)
248 {
249     (void)conf;
250
251     return m_config_parse_config_file(gui_conf, filename, 0);
252 }
253
254 int cfg_read(void)
255 {
256     char *cfg;
257     FILE *f;
258
259     player_idle_mode = 1;   // GUI is in idle mode by default
260
261     // configuration
262
263     cfg = get_path("gui.conf");
264
265     mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[cfg] file: %s\n", cfg);
266
267     gui_conf = m_config_new();
268
269     if (!gui_conf) {
270         gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_MemAllocFailed);
271         mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0);
272     }
273
274     m_config_register_options(gui_conf, gui_opts);
275
276     if (!disable_gui_conf && (m_config_parse_config_file(gui_conf, cfg, 1) < 0)) {
277         gmp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_ConfigFileError);
278 // mplayer(MPLAYER_EXIT_GUI, 1, 0);
279     }
280
281     free(cfg);
282
283     // playlist
284
285     cfg = get_path("gui.pl");
286     f   = fopen(cfg, "rt");
287
288     if (f) {
289         while (!feof(f)) {
290             char tmp[512];
291             plItem *item;
292
293             if (gfgets(tmp, 512, f) == NULL)
294                 continue;
295
296             item       = calloc(1, sizeof(plItem));
297             item->path = strdup(tmp);
298             gfgets(tmp, 512, f);
299             item->name = strdup(tmp);
300             listSet(gtkAddPlItem, item);
301         }
302
303         fclose(f);
304     }
305
306     free(cfg);
307
308     // URL list
309
310     cfg = get_path("gui.url");
311     f   = fopen(cfg, "rt");
312
313     if (f) {
314         while (!feof(f)) {
315             char tmp[512];
316             urlItem *item;
317
318             if (gfgets(tmp, 512, f) == NULL)
319                 continue;
320
321             item      = calloc(1, sizeof(urlItem));
322             item->url = strdup(tmp);
323             listSet(gtkAddURLItem, item);
324         }
325
326         fclose(f);
327     }
328
329     free(cfg);
330
331     // directory history
332
333     cfg = get_path("gui.history");
334     f   = fopen(cfg, "rt+");
335
336     if (f) {
337         int i = 0;
338
339         while (!feof(f)) {
340             char tmp[512];
341
342             if (gfgets(tmp, 512, f) == NULL)
343                 continue;
344
345             fsHistory[i++] = gstrdup(tmp);
346         }
347
348         fclose(f);
349     }
350
351     free(cfg);
352
353     return 0;
354 }
355
356 int cfg_write(void)
357 {
358     char *cfg;
359     FILE *f;
360     int i;
361
362     // configuration
363
364     cfg = get_path("gui.conf");
365     f   = fopen(cfg, "wt+");
366
367     if (f) {
368         for (i = 0; gui_opts[i].name; i++) {
369             char *v = m_option_print(&gui_opts[i], gui_opts[i].p);
370
371             if (v == (char *)-1) {
372                 mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_UnableToSaveOption, gui_opts[i].name);
373                 v = NULL;
374             }
375
376             if (v) {
377                 fprintf(f, "%s = \"%s\"\n", gui_opts[i].name, v);
378                 free(v);
379             }
380         }
381
382         fclose(f);
383     }
384
385     free(cfg);
386
387     // playlist
388
389     cfg = get_path("gui.pl");
390     f   = fopen(cfg, "wt+");
391
392     if (f) {
393         plCurrent = plList;
394
395         while (plCurrent) {
396             if (plCurrent->path && plCurrent->name) {
397                 fprintf(f, "%s\n", plCurrent->path);
398                 fprintf(f, "%s\n", plCurrent->name);
399             }
400
401             plCurrent = plCurrent->next;
402         }
403
404         fclose(f);
405     }
406
407     free(cfg);
408
409     // URL list
410
411     cfg = get_path("gui.url");
412     f   = fopen(cfg, "wt+");
413
414     if (f) {
415         while (urlList) {
416             if (urlList->url)
417                 fprintf(f, "%s\n", urlList->url);
418
419             urlList = urlList->next;
420         }
421
422         fclose(f);
423     }
424
425     free(cfg);
426
427     // directory history
428
429     cfg = get_path("gui.history");
430     f   = fopen(cfg, "wt+");
431
432     if (f) {
433         int i = 0;
434
435 // while (fsHistory[i] != NULL)
436         for (i = 0; i < 5; i++)
437             if (fsHistory[i])
438                 fprintf(f, "%s\n", fsHistory[i]);
439
440         fclose(f);
441     }
442
443     free(cfg);
444
445     return 0;
446 }