1 /***************************************************************************
2 DIA_prefs.cpp
3 (C) 2007/2016 Mean Fixounet@free.fr
4 ***************************************************************************/
5
6 /***************************************************************************
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 ***************************************************************************/
14
15 #include "config.h"
16 #include "ADM_default.h"
17 # include "prefs.h"
18
19 #include "audio_out.h"
20 #include "ADM_assert.h"
21 #include "ADM_render/GUI_render.h"
22
23 #include "DIA_factory.h"
24 #ifdef USE_VDPAU
25 #include "ADM_coreVdpau/ADM_coreVdpau.h"
26 #endif
27 #ifdef USE_SDL
28 #include "ADM_render/GUI_sdlRender.h"
29 #endif
30
31 extern void AVDM_audioPref( void );
32 extern const char* getNativeRendererDesc(int type);
33
34 #if defined(USE_DXVA2) || defined(USE_VDPAU) || defined(USE_LIBVA) || defined(USE_VIDEOTOOLBOX)
35 #define HW_ACCELERATED_DECODING
36 #endif
37
38 uint8_t DIA_Preferences(void);
39
40 /**
41 \fn DIA_Preferences
42 \brief Handle preference dialog
43 */
DIA_Preferences(void)44 uint8_t DIA_Preferences(void)
45 {
46 uint32_t olddevice,newdevice;
47
48 uint32_t render;
49
50 bool useSwap=0;
51
52 uint32_t lavcThreads=0;
53 uint32_t encodePriority=2;
54 uint32_t indexPriority=2;
55 uint32_t playbackPriority=0;
56 uint32_t downmix;
57 bool mpeg_no_limit=0;
58 uint32_t msglevel=2;
59
60 uint32_t mixer=0;
61 bool doAutoUpdate=false;
62 bool loadDefault=false;
63 char *alsaDevice=NULL;
64
65 bool lastReadDirAsTarget=false;
66 bool altKeyboardShortcuts=false;
67 bool swapUpDown=false;
68
69 uint32_t pp_type=3;
70 uint32_t pp_value=5;
71
72 bool useCustomFragmentSize=false;
73 uint32_t customFragmentSize=4000;
74
75 uint32_t editor_cache_size=16;
76
77 #ifdef USE_DXVA2
78 bool bdxva2=false;
79 bool bdxva2_override_version=false;
80 bool bdxva2_override_profile=false;
81 #endif
82 bool bvdpau=false;
83 bool blibva=false;
84 #ifdef USE_VIDEOTOOLBOX
85 bool bvideotoolbox=false;
86 #endif
87 bool hzd,vzd,dring;
88 bool capsMMX,capsMMXEXT,caps3DNOW,caps3DNOWEXT,capsSSE,capsSSE2,capsSSE3,capsSSSE3,capsAll;
89 bool hasOpenGl=false;
90
91 bool refreshCapEnabled=false;
92 uint32_t refreshCapValue=100;
93
94 bool askPortAvisynth=false;
95 uint32_t defaultPortAvisynth = 9999;
96
97 #ifdef USE_SDL
98 std::string currentSdlDriver=getSdlDriverName();
99 #endif
100
101 #ifdef USE_OPENGL
102 prefs->get(FEATURES_ENABLE_OPENGL,&hasOpenGl);
103 #endif
104
105 olddevice=newdevice=AVDM_getCurrentDevice();
106
107 prefs->get(FEATURES_CAP_REFRESH_ENABLED,&refreshCapEnabled);
108 prefs->get(FEATURES_CAP_REFRESH_VALUE,&refreshCapValue);
109
110
111 // Default pp
112 if(!prefs->get(DEFAULT_POSTPROC_TYPE,&pp_type)) pp_type=0;
113 if(!prefs->get(DEFAULT_POSTPROC_VALUE,&pp_value)) pp_value=0;
114 #define DOME(x,y) y=!!(pp_type & x)
115
116 DOME(1,hzd);
117 DOME(2,vzd);
118 DOME(4,dring);
119
120 // Cpu caps
121 #define CPU_CAPS(x) if(cpuMask & ADM_CPUCAP_##x) caps##x=1; else caps##x=0;
122
123 uint32_t cpuMask=CpuCaps::getMask();
124 if(cpuMask==ADM_CPUCAP_ALL) capsAll=1; else capsAll=0;
125 CPU_CAPS(MMX);
126 CPU_CAPS(MMXEXT);
127 CPU_CAPS(3DNOW);
128 CPU_CAPS(3DNOWEXT);
129 CPU_CAPS(SSE);
130 CPU_CAPS(SSE2);
131 CPU_CAPS(SSE3);
132 CPU_CAPS(SSSE3);
133
134 //Avisynth
135 if(!prefs->get(AVISYNTH_AVISYNTH_ALWAYS_ASK, &askPortAvisynth))
136 {
137 ADM_info("Always ask not set\n");
138 askPortAvisynth=0;
139 }
140
141 if(!prefs->get(AVISYNTH_AVISYNTH_DEFAULTPORT, &defaultPortAvisynth))
142 {
143 printf("Port not set\n");
144 defaultPortAvisynth=9999;
145 }
146 ADM_info("Avisynth port: %d\n",defaultPortAvisynth);
147
148 // Alsa
149 #ifdef ALSA_SUPPORT
150 if( prefs->get(DEVICE_AUDIO_ALSA_DEVICE, &alsaDevice) != RC_OK )
151 alsaDevice = ADM_strdup("plughw:0,0");
152 #endif
153 // Auto-append
154 if(!prefs->get(DEFAULT_MULTILOAD_USE_CUSTOM_SIZE,&useCustomFragmentSize))
155 useCustomFragmentSize=false;
156 if(!prefs->get(DEFAULT_MULTILOAD_CUSTOM_SIZE_M,&customFragmentSize))
157 customFragmentSize=4000;
158 // Video cache
159 prefs->get(FEATURES_CACHE_SIZE,&editor_cache_size);
160 #ifdef USE_DXVA2
161 // dxva2
162 prefs->get(FEATURES_DXVA2,&bdxva2);
163 prefs->get(FEATURES_DXVA2_OVERRIDE_BLACKLIST_VERSION,&bdxva2_override_version);
164 prefs->get(FEATURES_DXVA2_OVERRIDE_BLACKLIST_PROFILE,&bdxva2_override_profile);
165 #endif
166 #ifdef USE_VDPAU
167 // vdpau
168 prefs->get(FEATURES_VDPAU,&bvdpau);
169 #endif
170 #ifdef USE_LIBVA
171 // libva
172 prefs->get(FEATURES_LIBVA,&blibva);
173 #endif
174 #ifdef USE_VIDEOTOOLBOX
175 // VideoToolbox
176 prefs->get(FEATURES_VIDEOTOOLBOX,&bvideotoolbox);
177 #endif
178 // Video renderer
179 if(prefs->get(VIDEODEVICE,&render)!=RC_OK)
180 {
181 render=(uint32_t)RENDER_GTK;
182 }
183 // Accept mpeg for DVD when fq!=48 kHz
184 if(!prefs->get(FEATURES_MPEG_NO_LIMIT,&mpeg_no_limit)) mpeg_no_limit=0;
185
186 prefs->get(UPDATE_ENABLED,&doAutoUpdate);
187
188 prefs->get(RESET_ENCODER_ON_VIDEO_LOAD,&loadDefault);
189
190 // Make users happy who prefer the output dir to be the same as the input dir
191 prefs->get(FEATURES_USE_LAST_READ_DIR_AS_TARGET,&lastReadDirAsTarget);
192
193 // PgUp and PgDown are cumbersome to reach on some laptops, offer alternative kbd shortcuts
194 prefs->get(KEYBOARD_SHORTCUTS_USE_ALTERNATE_KBD_SHORTCUTS,&altKeyboardShortcuts);
195
196 // Optionally reverse UP and DOWN keys for navigation
197 prefs->get(KEYBOARD_SHORTCUTS_SWAP_UP_DOWN_KEYS,&swapUpDown);
198
199 // Multithreads
200 prefs->get(FEATURES_THREADING_LAVC, &lavcThreads);
201
202
203 // Encoding priority
204 if(!prefs->get(PRIORITY_ENCODING, &encodePriority))
205 encodePriority=2;
206 // Indexing / unpacking priority
207 if(!prefs->get(PRIORITY_INDEXING, &indexPriority))
208 indexPriority=2;
209 // Playback priority
210 if(!prefs->get(PRIORITY_PLAYBACK, &playbackPriority))
211 playbackPriority=0;
212
213 #if defined(ALSA_SUPPORT) || defined (OSS_SUPPORT)
214 // Master or PCM for audio
215 if(!prefs->get(FEATURES_AUDIOBAR_USES_MASTER, &useMaster))
216 useMaster=0;
217 #endif
218
219 // SWAP A&B if A>B
220 if(!prefs->get(FEATURES_SWAP_IF_A_GREATER_THAN_B, &useSwap))
221 useSwap=0;
222 // Get level of message verbosity
223 prefs->get(MESSAGE_LEVEL,&msglevel);
224 // Downmix default
225 if(prefs->get(DEFAULT_DOWNMIXING,&downmix)!=RC_OK)
226 {
227 downmix=0;
228 }
229 olddevice=newdevice=AVDM_getCurrentDevice();
230 // Audio device
231 /************************ Build diaelems ****************************************/
232 #ifdef HW_ACCELERATED_DECODING
233 #if defined(USE_DXVA2)
234 diaElemToggle useDxva2(&bdxva2,QT_TRANSLATE_NOOP("adm","Decode video using DXVA2 (windows)"));
235 diaElemToggle dxva2OverrideVersion(&bdxva2_override_version,QT_TRANSLATE_NOOP("adm","Ignore driver blacklist (Intel)"));
236 diaElemToggle dxva2OverrideProfile(&bdxva2_override_profile,QT_TRANSLATE_NOOP("adm","Ignore codec blacklist (Intel, HEVC 10bit)"));
237 #elif defined(USE_VIDEOTOOLBOX)
238 diaElemToggle useVideoToolbox(&bvideotoolbox,QT_TRANSLATE_NOOP("adm","Decode video using VideoToolbox (macOS)"));
239 #else
240 diaElemToggle useVdpau(&bvdpau,QT_TRANSLATE_NOOP("adm","Decode video using VDPAU (NVIDIA)"));
241 diaElemToggle useLibVA(&blibva,QT_TRANSLATE_NOOP("adm","Decode video using LIBVA (INTEL)"));
242 #endif
243 #ifndef USE_VIDEOTOOLBOX
244 diaElemReadOnlyText hwAccelText(NULL,QT_TRANSLATE_NOOP("adm","If you use Hw decoding, it is better to use the matching display driver"),NULL);
245 #endif
246 #endif
247 diaElemToggle useOpenGl(&hasOpenGl,QT_TRANSLATE_NOOP("adm","Enable openGl support"));
248 diaElemToggle allowAnyMpeg(&mpeg_no_limit,QT_TRANSLATE_NOOP("adm","_Accept non-standard audio frequency for DVD"));
249 diaElemToggle resetEncoder(&loadDefault,QT_TRANSLATE_NOOP("adm","_Revert to saved default output settings on video load"));
250 diaElemToggle enableAltShortcuts(&altKeyboardShortcuts,QT_TRANSLATE_NOOP("adm","_Enable alternative keyboard shortcuts"));
251 diaElemToggle swapUpDownKeys(&swapUpDown,QT_TRANSLATE_NOOP("adm","Re_verse UP and DOWN arrow keys for navigation"));
252 diaElemToggle checkForUpdate(&doAutoUpdate,QT_TRANSLATE_NOOP("adm","_Check for new release"));
253
254
255 diaElemFrame frameSimd(QT_TRANSLATE_NOOP("adm","SIMD"));
256
257 diaElemToggle capsToggleAll(&capsAll,QT_TRANSLATE_NOOP("adm","Enable all SIMD"));
258 diaElemToggle capsToggleMMX(&capsMMX, QT_TRANSLATE_NOOP("adm","Enable MMX"));
259 diaElemToggle capsToggleMMXEXT(&capsMMXEXT, QT_TRANSLATE_NOOP("adm","Enable MMXEXT"));
260 diaElemToggle capsToggle3DNOW(&caps3DNOW, QT_TRANSLATE_NOOP("adm","Enable 3DNOW"));
261 diaElemToggle capsToggle3DNOWEXT(&caps3DNOWEXT, QT_TRANSLATE_NOOP("adm","Enable 3DNOWEXT"));
262 diaElemToggle capsToggleSSE(&capsSSE, QT_TRANSLATE_NOOP("adm","Enable SSE"));
263 diaElemToggle capsToggleSSE2(&capsSSE2, QT_TRANSLATE_NOOP("adm","Enable SSE2"));
264 diaElemToggle capsToggleSSE3(&capsSSE3, QT_TRANSLATE_NOOP("adm","Enable SSE3"));
265 diaElemToggle capsToggleSSSE3(&capsSSSE3, QT_TRANSLATE_NOOP("adm","Enable SSSE3"));
266
267 capsToggleAll.link(0, &capsToggleMMX);
268 capsToggleAll.link(0, &capsToggleMMXEXT);
269 capsToggleAll.link(0, &capsToggle3DNOW);
270 capsToggleAll.link(0, &capsToggle3DNOWEXT);
271 capsToggleAll.link(0, &capsToggleSSE);
272 capsToggleAll.link(0, &capsToggleSSE2);
273 capsToggleAll.link(0, &capsToggleSSE3);
274 capsToggleAll.link(0, &capsToggleSSSE3);
275
276 frameSimd.swallow(&capsToggleAll);
277 frameSimd.swallow(&capsToggleMMX);
278 frameSimd.swallow(&capsToggleMMXEXT);
279 frameSimd.swallow(&capsToggle3DNOW);
280 frameSimd.swallow(&capsToggle3DNOWEXT);
281 frameSimd.swallow(&capsToggleSSE);
282 frameSimd.swallow(&capsToggleSSE2);
283 frameSimd.swallow(&capsToggleSSE3);
284 frameSimd.swallow(&capsToggleSSSE3);
285
286 diaElemThreadCount lavcThreadCount(&lavcThreads, QT_TRANSLATE_NOOP("adm","_lavc threads:"));
287
288 diaElemFrame frameThread(QT_TRANSLATE_NOOP("adm","Multi-threading"));
289 frameThread.swallow(&lavcThreadCount);
290
291 diaMenuEntry priorityEntries[] = {
292 {0, QT_TRANSLATE_NOOP("adm","High"),NULL}
293 ,{1, QT_TRANSLATE_NOOP("adm","Above normal"),NULL}
294 ,{2, QT_TRANSLATE_NOOP("adm","Normal"),NULL}
295 ,{3, QT_TRANSLATE_NOOP("adm","Below normal"),NULL}
296 ,{4, QT_TRANSLATE_NOOP("adm","Low"),NULL}
297 };
298 diaElemMenu menuEncodePriority(&encodePriority,QT_TRANSLATE_NOOP("adm","_Encoding priority:"), sizeof(priorityEntries)/sizeof(diaMenuEntry), priorityEntries,"");
299 diaElemMenu menuIndexPriority(&indexPriority,QT_TRANSLATE_NOOP("adm","_Indexing/unpacking priority:"), sizeof(priorityEntries)/sizeof(diaMenuEntry), priorityEntries,"");
300 diaElemMenu menuPlaybackPriority(&playbackPriority,QT_TRANSLATE_NOOP("adm","_Playback priority:"), sizeof(priorityEntries)/sizeof(diaMenuEntry), priorityEntries,"");
301
302 diaElemFrame framePriority(QT_TRANSLATE_NOOP("adm","Prioritisation"));
303 framePriority.swallow(&menuEncodePriority);
304 framePriority.swallow(&menuIndexPriority);
305 framePriority.swallow(&menuPlaybackPriority);
306
307 diaElemToggle useLastReadAsTarget(&lastReadDirAsTarget,QT_TRANSLATE_NOOP("adm","_Default to the directory of the last read file for saving"));
308
309 diaElemFrame frameMultiLoad(QT_TRANSLATE_NOOP("adm","Auto-Append Settings"));
310 diaElemToggle multiLoadUseCustomFragmentSize(&useCustomFragmentSize,QT_TRANSLATE_NOOP("adm","_Use custom fragment size for auto-append of MPEG-TS files"));
311 diaElemUInteger multiLoadCustomFragmentSize(&customFragmentSize,QT_TRANSLATE_NOOP("adm","_Fragment size:"),250,8196);
312 frameMultiLoad.swallow(&multiLoadUseCustomFragmentSize);
313 frameMultiLoad.swallow(&multiLoadCustomFragmentSize);
314 multiLoadUseCustomFragmentSize.link(1,&multiLoadCustomFragmentSize);
315
316 diaElemFrame frameCache(QT_TRANSLATE_NOOP("adm","Caching of decoded pictures"));
317 diaElemUInteger cacheSize(&editor_cache_size,QT_TRANSLATE_NOOP("adm","_Cache size:"),8,16);
318 frameCache.swallow(&cacheSize);
319
320 diaMenuEntry videoMode[]={
321 {RENDER_GTK, getNativeRendererDesc(0), NULL}
322 #ifdef USE_XV
323 ,{RENDER_XV, QT_TRANSLATE_NOOP("adm","XVideo (best)"),NULL}
324 #endif
325 #ifdef USE_VDPAU
326 ,{RENDER_VDPAU, QT_TRANSLATE_NOOP("adm","VDPAU (best)"),NULL}
327 #endif
328 #ifdef USE_DXVA2
329 ,{RENDER_DXVA2, QT_TRANSLATE_NOOP("adm","DXVA2 (best)"),NULL}
330 #endif
331 #ifdef USE_OPENGL
332 ,{RENDER_QTOPENGL, QT_TRANSLATE_NOOP("adm","OpenGL (best)"),NULL}
333 #endif
334 #ifdef USE_LIBVA
335 ,{RENDER_LIBVA, QT_TRANSLATE_NOOP("adm","LIBVA (best)"),NULL}
336 #endif
337
338
339 #ifdef USE_SDL
340 ,{RENDER_SDL, QT_TRANSLATE_NOOP("adm","SDL (good)"),NULL}
341 #endif
342 };
343 diaElemMenu menuVideoMode(&render,QT_TRANSLATE_NOOP("adm","Video _display:"), sizeof(videoMode)/sizeof(diaMenuEntry),videoMode,"");
344 #ifdef USE_SDL
345 const std::vector<sdlDriverInfo> &listOfSdl=getListOfSdlDrivers();
346 int nbSDL=listOfSdl.size();
347 diaElemMenuDynamic *sdlMenu=NULL;
348 diaMenuEntryDynamic **sdlMenuEntries=NULL;
349 uint32_t sdlMenuIndex=0;
350 int current=0;
351 if(nbSDL)
352 {
353 sdlMenuEntries=new diaMenuEntryDynamic*[nbSDL];
354 for(int i=0;i<nbSDL;i++)
355 {
356 if(!currentSdlDriver.compare(listOfSdl[i].driverName))
357 {
358 current=i;
359 }
360 sdlMenuEntries[i]=new diaMenuEntryDynamic(i,listOfSdl[i].driverName.c_str(),"");
361 }
362 sdlMenuIndex=current;
363 sdlMenu=new diaElemMenuDynamic(&sdlMenuIndex, QT_TRANSLATE_NOOP("adm","Sdl driver"),nbSDL, sdlMenuEntries);
364 }else
365 {
366 sdlMenu=new diaElemMenuDynamic(&sdlMenuIndex, QT_TRANSLATE_NOOP("adm","Sdl driver"),0, NULL);
367 }
368 #endif
369
370
371 diaMenuEntry msgEntries[]={
372 {0, QT_TRANSLATE_NOOP("adm","No alerts"),NULL}
373 ,{1, QT_TRANSLATE_NOOP("adm","Display only error alerts"),NULL}
374 ,{2, QT_TRANSLATE_NOOP("adm","Display all alerts"),NULL}
375 };
376 diaElemMenu menuMessage(&msglevel,QT_TRANSLATE_NOOP("adm","_Message level:"), sizeof(msgEntries)/sizeof(diaMenuEntry),msgEntries,"");
377
378
379 #if defined(ALSA_SUPPORT) || defined (OSS_SUPPORT)
380 diaMenuEntry volumeEntries[]={
381 {0, QT_TRANSLATE_NOOP("adm","PCM"),NULL}
382 ,{1, QT_TRANSLATE_NOOP("adm","Master"),NULL}};
383 diaElemMenu menuVolume(&useMaster,QT_TRANSLATE_NOOP("adm","_Volume control:"), sizeof(volumeEntries)/sizeof(diaMenuEntry),volumeEntries,"");
384 #endif
385
386
387 diaMenuEntry mixerEntries[]={
388 {0, QT_TRANSLATE_NOOP("adm","No downmixing"),NULL}
389 ,{1, QT_TRANSLATE_NOOP("adm","Stereo"),NULL}
390 ,{2, QT_TRANSLATE_NOOP("adm","Pro Logic"),NULL}
391 ,{3, QT_TRANSLATE_NOOP("adm","Pro Logic II"),NULL}
392 };
393 diaElemMenu menuMixer(&downmix,QT_TRANSLATE_NOOP("adm","_Local playback downmixing:"), sizeof(mixerEntries)/sizeof(diaMenuEntry),mixerEntries,"");
394 //*********** AV_
395
396 //***AV
397 uint32_t nbAudioDevice=ADM_av_getNbDevices();
398 diaMenuEntryDynamic **audioDeviceItems=new diaMenuEntryDynamic *[nbAudioDevice+1];
399 audioDeviceItems[0]=new diaMenuEntryDynamic(0,"Dummy","Dummy");
400 for(int i=0;i<nbAudioDevice;i++)
401 {
402 std::string name;
403 uint32_t major,minor,patch;
404 ADM_av_getDeviceInfo(i, name, &major,&minor,&patch);
405 audioDeviceItems[i+1]=new diaMenuEntryDynamic(i+1,name.c_str(),name.c_str());
406 }
407 diaElemMenuDynamic menuAudio(&newdevice,QT_TRANSLATE_NOOP("adm","_AudioDevice"), nbAudioDevice+1,
408 audioDeviceItems,NULL);
409 // default Post proc
410 diaElemToggle fhzd(&hzd,QT_TRANSLATE_NOOP("adm","_Horizontal deblocking"));
411 diaElemToggle fvzd(&vzd,QT_TRANSLATE_NOOP("adm","_Vertical deblocking"));
412 diaElemToggle fdring(&dring,QT_TRANSLATE_NOOP("adm","De_ringing"));
413 diaElemUInteger postProcStrength(&pp_value,QT_TRANSLATE_NOOP("adm","_Strength:"),0,5);
414 diaElemFrame framePP(QT_TRANSLATE_NOOP("adm","Default Postprocessing"));
415
416 framePP.swallow(&fhzd);
417 framePP.swallow(&fvzd);
418 framePP.swallow(&fdring);
419 framePP.swallow(&postProcStrength);
420
421
422 // -- select language
423 typedef struct { const char *lang;const char *desc;}languageDescriptor;
424 uint32_t languageIndex=0;
425 languageDescriptor myLanguages[]={
426 {"auto",QT_TRANSLATE_NOOP("adm","System language")},
427 {"da","Dansk"},
428 {"de","Deutsch"},
429 {"en","English"},
430 {"es","Español"},
431 {"fr","Français"},
432 {"it","Italiano"},
433 {"hu","Magyar"},
434 {"pl","Polski"},
435 {"ru","Русский"},
436 };
437 uint32_t nbLanguages=sizeof(myLanguages)/sizeof(languageDescriptor);
438 std::string currentLanguage;
439 int currentIndex=0;
440 if(!prefs->get(DEFAULT_LANGUAGE,currentLanguage)) currentLanguage=std::string("auto");
441
442 diaMenuEntryDynamic **languagesMenuItems=new diaMenuEntryDynamic *[nbLanguages+1];
443 for(int i=0;i<nbLanguages;i++)
444 {
445 languageDescriptor *lg=myLanguages+i;
446 if(!strcmp(lg->lang,currentLanguage.c_str()))
447 currentIndex=i;
448 languagesMenuItems[i]=new diaMenuEntryDynamic(i,lg->desc,lg->lang);
449 }
450 languageIndex=currentIndex;
451 diaElemMenuDynamic menuLanguage(&languageIndex,QT_TRANSLATE_NOOP("adm","_Language"), nbLanguages,
452 languagesMenuItems,NULL);
453 //--
454
455
456
457 /* User Interface */
458 diaElem *diaUser[]={&menuMessage,&menuLanguage,&resetEncoder,&enableAltShortcuts,&swapUpDownKeys,&checkForUpdate};
459 diaElemTabs tabUser(QT_TRANSLATE_NOOP("adm","User Interface"),6,diaUser);
460
461 /* Automation */
462
463
464 /* Output */
465 diaElem *diaOutput[]={&allowAnyMpeg,&useLastReadAsTarget,&frameMultiLoad,&frameCache};
466 diaElemTabs tabOutput(QT_TRANSLATE_NOOP("adm","Output"),4,(diaElem **)diaOutput);
467
468 /* Audio */
469
470 #if 0 //defined(ALSA_SUPPORT)
471 diaElem *diaAudio[]={&menuMixer,&menuVolume,&menuAudio,&entryAlsaDevice};
472 diaElemTabs tabAudio(QT_TRANSLATE_NOOP("adm","Audio"),4,(diaElem **)diaAudio);
473 //#elif defined(OSS_SUPPORT)
474 diaElem *diaAudio[]={&menuMixer,&menuVolume,&menuAudio};
475 diaElemTabs tabAudio(QT_TRANSLATE_NOOP("adm","Audio"),3,(diaElem **)diaAudio);
476 #endif
477
478 #if 1
479 diaElem *diaAudio[]={&menuMixer,&menuAudio};
480 diaElemTabs tabAudio(QT_TRANSLATE_NOOP("adm","Audio"),2,(diaElem **)diaAudio);
481 #endif
482
483
484 /* Display */
485 diaElemToggle togDisplayRefreshCap(&refreshCapEnabled,QT_TRANSLATE_NOOP("adm","_Limit Refresh Rate"));
486 diaElemUInteger displayRefreshCap(&refreshCapValue,QT_TRANSLATE_NOOP("adm","Refresh Rate Cap (ms)"),10,1000);
487 diaElemFrame frameRC(QT_TRANSLATE_NOOP("adm","GUI Rendering Options")); // a hack to fix tabbing order
488
489 // Packing the following elements into frameRC rectifies otherwise wrong tabbing order:
490 // framePP got constructed before the refresh rate spinbox, but after the display refresh
491 // toggle resulting in a tabbing order 1-6-7-2-3-4-5-8, counting elements from top to bottom.
492 // With this extra frame we get 1-2-3-4-5-6-7-8 (video mode, hor. deblocking, vert. delocking,
493 // deringing, deringing strength, OpenGL toggle, refr. rate cap toggle, refr. rate spinbox).
494 frameRC.swallow(&useOpenGl);
495 frameRC.swallow(&togDisplayRefreshCap);
496 frameRC.swallow(&displayRefreshCap);
497
498 #ifdef USE_SDL
499 diaElem *diaVideo[]={&menuVideoMode,sdlMenu,&framePP,&frameRC};
500 #else
501 diaElem *diaVideo[]={&menuVideoMode,&framePP,&frameRC};
502 #endif
503 diaElemTabs tabVideo(QT_TRANSLATE_NOOP("adm","Display"),sizeof(diaVideo)/sizeof(diaElem *),(diaElem **)diaVideo);
504 /* HW accel */
505 #ifdef USE_DXVA2
506 diaElem *diaHwDecoding[]={&useDxva2,&dxva2OverrideVersion,&dxva2OverrideProfile,&hwAccelText};
507 diaElemTabs tabHwDecoding(QT_TRANSLATE_NOOP("adm","HW Accel"),4,(diaElem **)diaHwDecoding);
508 #elif defined(USE_VIDEOTOOLBOX)
509 diaElem *diaHwDecoding[]={&useVideoToolbox};
510 diaElemTabs tabHwDecoding(QT_TRANSLATE_NOOP("adm","HW Accel"),1,(diaElem **)diaHwDecoding);
511 #elif defined(HW_ACCELERATED_DECODING)
512 diaElem *diaHwDecoding[]={&useVdpau,&useLibVA,&hwAccelText};
513 diaElemTabs tabHwDecoding(QT_TRANSLATE_NOOP("adm","HW Accel"),3,(diaElem **)diaHwDecoding);
514 #endif
515
516 /* CPU tab */
517 diaElem *diaCpu[]={&frameSimd};
518 diaElemTabs tabCpu(QT_TRANSLATE_NOOP("adm","CPU"),1,(diaElem **)diaCpu);
519
520 /* Threading tab */
521 diaElem *diaThreading[]={&frameThread, &framePriority};
522 diaElemTabs tabThreading(QT_TRANSLATE_NOOP("adm","Threading"),2,(diaElem **)diaThreading);
523
524 /* Avisynth tab */
525 diaElemToggle togAskAvisynthPort(&askPortAvisynth,QT_TRANSLATE_NOOP("adm","_Always ask which port to use"));
526 diaElemUInteger uintDefaultPortAvisynth(&defaultPortAvisynth,QT_TRANSLATE_NOOP("adm","Default port to use"),1024,65535);
527 diaElem *diaAvisynth[]={&togAskAvisynthPort, &uintDefaultPortAvisynth};
528 diaElemTabs tabAvisynth("Avisynth",2,(diaElem **)diaAvisynth);
529
530 /* Global Glyph tab */
531 #ifdef HW_ACCELERATED_DECODING
532 diaElemTabs *tabs[]={&tabUser, &tabOutput, &tabAudio, &tabVideo, &tabHwDecoding, &tabCpu, &tabThreading, &tabAvisynth};
533 void *factoryCookiez=diaFactoryRunTabsPrepare(QT_TRANSLATE_NOOP("adm","Preferences"),8,tabs);
534 #else
535 diaElemTabs *tabs[]={&tabUser, &tabOutput, &tabAudio, &tabVideo, &tabCpu, &tabThreading, &tabAvisynth};
536 void *factoryCookiez=diaFactoryRunTabsPrepare(QT_TRANSLATE_NOOP("adm","Preferences"),7,tabs);
537 #endif
538 // Now we can disable stuff if needed
539 #if defined(HW_ACCELERATED_DECODING) && !defined(USE_VIDEOTOOLBOX) && !defined(USE_DXVA2)
540 #ifndef USE_VDPAU
541 useVdpau.enable(false);
542 #endif
543 #ifndef USE_LIBVA
544 useLibVA.enable(false);
545 #endif
546 #endif
547
548 #ifndef USE_OPENGL
549 useOpenGl.enable(false);
550 #endif
551
552 if( diaFactoryRunTabsFinish(factoryCookiez))
553 {
554 //
555 #ifdef USE_OPENGL
556 prefs->set(FEATURES_ENABLE_OPENGL,hasOpenGl);
557 #endif
558 // cpu caps
559 uint32_t cpuMaskOut;
560 if(capsAll)
561 {
562 cpuMaskOut=ADM_CPUCAP_ALL;
563 }else
564 {
565 cpuMaskOut=0;
566 #undef CPU_CAPS
567 #define CPU_CAPS(x) if(caps##x) cpuMaskOut|= ADM_CPUCAP_##x;
568 CPU_CAPS(MMX);
569 CPU_CAPS(MMXEXT);
570 CPU_CAPS(3DNOW);
571 CPU_CAPS(3DNOWEXT);
572 CPU_CAPS(SSE);
573 CPU_CAPS(SSE2);
574 CPU_CAPS(SSE3);
575 CPU_CAPS(SSSE3);
576 }
577 prefs->set(FEATURES_CPU_CAPS,cpuMaskOut);
578 CpuCaps::setMask(cpuMaskOut);
579 //
580 prefs->set(FEATURES_CAP_REFRESH_ENABLED,refreshCapEnabled);
581 prefs->set(FEATURES_CAP_REFRESH_VALUE,refreshCapValue);
582
583 // Postproc
584 #undef DOME
585 #define DOME(x,y) if(y) pp_type |=x;
586 pp_type=0;
587 DOME(1,hzd);
588 DOME(2,vzd);
589 DOME(4,dring);
590 prefs->set(DEFAULT_POSTPROC_TYPE,pp_type);
591 prefs->set(DEFAULT_POSTPROC_VALUE,pp_value);
592
593 // Alsa
594 #ifdef ALSA_SUPPORT
595 if(alsaDevice)
596 {
597 prefs->set(DEVICE_AUDIO_ALSA_DEVICE, alsaDevice);
598 ADM_dealloc(alsaDevice);
599 alsaDevice=NULL;
600 }
601 #endif
602 // Device
603 //printf("[AudioDevice] Old : %d, new :%d\n",olddevice,newdevice);
604 if(olddevice!=newdevice)
605 {
606 AVDM_switch((AUDIO_DEVICE)newdevice); // Change current device
607 AVDM_audioSave(); // Save it in prefs
608 AVDM_audioInit(); // Respawn
609 }
610 // Downmixing (default)
611 prefs->set(DEFAULT_DOWNMIXING,downmix);
612 #if defined(ALSA_SUPPORT) || defined (OSS_SUPPORT)
613 // Master or PCM
614 prefs->set(FEATURES_AUDIOBAR_USES_MASTER, useMaster);
615 #endif
616 // allow non std audio fq for dvd
617 prefs->set(FEATURES_MPEG_NO_LIMIT, mpeg_no_limit);
618 //
619
620 prefs->set(UPDATE_ENABLED,doAutoUpdate);
621 // Video render
622 prefs->set(VIDEODEVICE,render);
623 // Auto-append
624 prefs->set(DEFAULT_MULTILOAD_USE_CUSTOM_SIZE, useCustomFragmentSize);
625 prefs->set(DEFAULT_MULTILOAD_CUSTOM_SIZE_M, customFragmentSize);
626 // Video cache
627 prefs->set(FEATURES_CACHE_SIZE, editor_cache_size);
628 // number of threads
629 prefs->set(FEATURES_THREADING_LAVC, lavcThreads);
630 // Encoding priority
631 prefs->set(PRIORITY_ENCODING, encodePriority);
632 // Indexing / unpacking priority
633 prefs->set(PRIORITY_INDEXING, indexPriority);
634 // Playback priority
635 prefs->set(PRIORITY_PLAYBACK, playbackPriority);
636
637 // Auto swap A/B
638 prefs->set(FEATURES_SWAP_IF_A_GREATER_THAN_B, useSwap);
639 //
640 prefs->set(MESSAGE_LEVEL,msglevel);
641 // Discard changes to output config on video load
642 prefs->set(RESET_ENCODER_ON_VIDEO_LOAD, loadDefault);
643 #ifdef USE_VDPAU
644 // VDPAU
645 prefs->set(FEATURES_VDPAU,bvdpau);
646 #endif
647 #ifdef USE_DXVA2
648 // DXVA2
649 prefs->set(FEATURES_DXVA2,bdxva2);
650 prefs->set(FEATURES_DXVA2_OVERRIDE_BLACKLIST_VERSION,bdxva2_override_version);
651 prefs->set(FEATURES_DXVA2_OVERRIDE_BLACKLIST_PROFILE,bdxva2_override_profile);
652 #endif
653 #ifdef USE_LIBVA
654 // LIBVA
655 prefs->set(FEATURES_LIBVA,blibva);
656 #endif
657 #ifdef USE_VIDEOTOOLBOX
658 // VideoToolbox
659 prefs->set(FEATURES_VIDEOTOOLBOX,bvideotoolbox);
660 #endif
661 // Make users happy who prefer the output dir to be the same as the input dir
662 prefs->set(FEATURES_USE_LAST_READ_DIR_AS_TARGET,lastReadDirAsTarget);
663 // Enable alternate keyboard shortcuts
664 prefs->set(KEYBOARD_SHORTCUTS_USE_ALTERNATE_KBD_SHORTCUTS,altKeyboardShortcuts);
665 // Allow to use the UP key to navigate back, DOWN to navigate forward
666 prefs->set(KEYBOARD_SHORTCUTS_SWAP_UP_DOWN_KEYS,swapUpDown);
667
668 prefs->set(DEFAULT_LANGUAGE,std::string(myLanguages[languageIndex].lang));
669
670 // Avisynth
671 prefs->set(AVISYNTH_AVISYNTH_DEFAULTPORT,defaultPortAvisynth);
672 prefs->set(AVISYNTH_AVISYNTH_ALWAYS_ASK, askPortAvisynth);
673
674 // Initialise SDL again as driver may have changed
675 #ifdef USE_SDL
676 std::string driverName=listOfSdl[sdlMenuIndex].driverName;
677 setSdlDriverByName(driverName);
678 prefs->set(FEATURES_SDLDRIVER,driverName.c_str());
679 #endif
680 }
681 #ifdef USE_SDL
682 if(sdlMenu)
683 {
684 if(nbSDL&&sdlMenuEntries)
685 {
686 for(int i=0;i<nbSDL;i++)
687 {
688 delete sdlMenuEntries[i];
689 }
690 delete [] sdlMenuEntries;
691 sdlMenuEntries=NULL;
692 }
693 delete sdlMenu;
694 sdlMenu=NULL;
695 }
696 #endif
697 for(int i=0;i<nbAudioDevice+1;i++)
698 {
699
700 delete audioDeviceItems[i];
701 }
702 delete [] audioDeviceItems;
703
704
705
706 return 1;
707 }
708 //EOF
709