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