1 /*
2  * This file is part of bino, a 3D video player.
3  *
4  * Copyright (C) 2010, 2011, 2012, 2013, 2014
5  * Martin Lambers <marlam@marlam.de>
6  * Frédéric Devernay <Frederic.Devernay@inrialpes.fr>
7  * Joe <cuchac@email.cz>
8  * Daniel Schaal <farbing@web.de>
9  * D. Matz <bandregent@yahoo.de>
10  * Binocle <http://binocle.com> (author: Olivier Letz <oletz@binocle.com>)
11  * Frédéric Bour <frederic.bour@lakaban.net>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
25  */
26 
27 #include "config.h"
28 
29 #include <QGridLayout>
30 #include <QLabel>
31 #include <QComboBox>
32 #include <QSettings>
33 #include <QCheckBox>
34 #include <QStandardItemModel>
35 
36 #include "inoutwidget.h"
37 
38 #include "gui_common.h"
39 #include "media_input.h"
40 #include "video_output.h"
41 
in_out_widget(QSettings * settings,QWidget * parent)42 in_out_widget::in_out_widget(QSettings *settings, QWidget *parent) :
43     QWidget(parent), _settings(settings), _lock(false)
44 {
45     QGridLayout *layout0 = new QGridLayout;
46     QLabel *video_label = new QLabel(_("Video:"));
47     video_label->setToolTip(_("<p>Select the video stream.</p>"));
48     layout0->addWidget(video_label, 0, 0);
49     _video_combobox = new QComboBox(this);
50     _video_combobox->setToolTip(video_label->toolTip());
51     connect(_video_combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(video_changed()));
52     layout0->addWidget(_video_combobox, 0, 1);
53     QLabel *audio_label = new QLabel(_("Audio:"));
54     audio_label->setToolTip(_("<p>Select the audio stream.</p>"));
55     layout0->addWidget(audio_label, 0, 2);
56     _audio_combobox = new QComboBox(this);
57     _audio_combobox->setToolTip(audio_label->toolTip());
58     connect(_audio_combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(audio_changed()));
59     layout0->addWidget(_audio_combobox, 0, 3);
60     QLabel *subtitle_label = new QLabel(_("Subtitle:"));
61     subtitle_label->setToolTip(_("<p>Select the subtitle stream.</p>"));
62     layout0->addWidget(subtitle_label, 0, 4);
63     _subtitle_combobox = new QComboBox(this);
64     _subtitle_combobox->setToolTip(subtitle_label->toolTip());
65     connect(_subtitle_combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(subtitle_changed()));
66     layout0->addWidget(_subtitle_combobox, 0, 5);
67     layout0->setColumnStretch(1, 1);
68     layout0->setColumnStretch(3, 1);
69     layout0->setColumnStretch(5, 1);
70 
71     QGridLayout *layout1 = new QGridLayout;
72     QLabel *input_label = new QLabel(_("Input:"));
73     input_label->setToolTip(_("<p>Set the 3D layout of the video stream.</p>"));
74     layout1->addWidget(input_label, 0, 0);
75     _input_combobox = new QComboBox(this);
76     _input_combobox->setToolTip(input_label->toolTip());
77     _input_combobox->addItem(QIcon(":icons-local/input-layout-mono.png"), _("2D"));
78     _input_combobox->addItem(QIcon(":icons-local/input-layout-separate-left-right.png"), _("Separate streams, left first"));
79     _input_combobox->addItem(QIcon(":icons-local/input-layout-separate-right-left.png"), _("Separate streams, right first"));
80     _input_combobox->addItem(QIcon(":icons-local/input-layout-alternating-left-right.png"), _("Alternating, left first"));
81     _input_combobox->addItem(QIcon(":icons-local/input-layout-alternating-right-left.png"), _("Alternating, right first"));
82     _input_combobox->addItem(QIcon(":icons-local/input-layout-top-bottom.png"), _("Top/bottom"));
83     _input_combobox->addItem(QIcon(":icons-local/input-layout-top-bottom-half.png"), _("Top/bottom, half height"));
84     _input_combobox->addItem(QIcon(":icons-local/input-layout-bottom-top.png"), _("Bottom/top"));
85     _input_combobox->addItem(QIcon(":icons-local/input-layout-bottom-top-half.png"), _("Bottom/top, half height"));
86     _input_combobox->addItem(QIcon(":icons-local/input-layout-left-right.png"), _("Left/right"));
87     _input_combobox->addItem(QIcon(":icons-local/input-layout-left-right-half.png"), _("Left/right, half width"));
88     _input_combobox->addItem(QIcon(":icons-local/input-layout-right-left.png"), _("Right/left"));
89     _input_combobox->addItem(QIcon(":icons-local/input-layout-right-left-half.png"), _("Right/left, half width"));
90     _input_combobox->addItem(QIcon(":icons-local/input-layout-even-odd-rows.png"), _("Even/odd rows"));
91     _input_combobox->addItem(QIcon(":icons-local/input-layout-odd-even-rows.png"), _("Odd/even rows"));
92     connect(_input_combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(input_changed()));
93     layout1->addWidget(_input_combobox, 0, 1);
94     layout1->setColumnStretch(1, 1);
95 
96     QGridLayout *layout2 = new QGridLayout;
97     QLabel *output_label = new QLabel(_("Output:"));
98     output_label->setToolTip(_("<p>Set the 3D output type for your display.</p>"));
99     layout2->addWidget(output_label, 0, 0);
100     _output_combobox = new QComboBox(this);
101     _output_combobox->setToolTip(output_label->toolTip());
102     _output_combobox->addItem(QIcon(":icons-local/output-type-mono-left.png"), _("Left view"));
103     _output_combobox->addItem(QIcon(":icons-local/output-type-mono-right.png"), _("Right view"));
104     _output_combobox->addItem(QIcon(":icons-local/output-type-stereo.png"), _("OpenGL stereo"));
105     _output_combobox->addItem(QIcon(":icons-local/output-type-alternating.png"), _("Left/right alternating"));
106     _output_combobox->addItem(QIcon(":icons-local/output-type-top-bottom.png"), _("Top/bottom"));
107     _output_combobox->addItem(QIcon(":icons-local/output-type-top-bottom-half.png"), _("Top/bottom, half height"));
108     _output_combobox->addItem(QIcon(":icons-local/output-type-left-right.png"), _("Left/right"));
109     _output_combobox->addItem(QIcon(":icons-local/output-type-left-right-half.png"), _("Left/right, half width"));
110     _output_combobox->addItem(QIcon(":icons-local/output-type-even-odd-rows.png"), _("Even/odd rows"));
111     _output_combobox->addItem(QIcon(":icons-local/output-type-even-odd-columns.png"), _("Even/odd columns"));
112     _output_combobox->addItem(QIcon(":icons-local/output-type-checkerboard.png"), _("Checkerboard pattern"));
113     _output_combobox->addItem(QIcon(":icons-local/output-type-hdmi-frame-pack.png"), _("HDMI frame packing mode"));
114     _output_combobox->addItem(QIcon(":icons-local/output-type-red-cyan.png"), _("Red/cyan glasses, monochrome"));
115     _output_combobox->addItem(QIcon(":icons-local/output-type-red-cyan.png"), _("Red/cyan glasses, half color"));
116     _output_combobox->addItem(QIcon(":icons-local/output-type-red-cyan.png"), _("Red/cyan glasses, full color"));
117     _output_combobox->addItem(QIcon(":icons-local/output-type-red-cyan.png"), _("Red/cyan glasses, Dubois"));
118     _output_combobox->addItem(QIcon(":icons-local/output-type-green-magenta.png"), _("Green/magenta glasses, monochrome"));
119     _output_combobox->addItem(QIcon(":icons-local/output-type-green-magenta.png"), _("Green/magenta glasses, half color"));
120     _output_combobox->addItem(QIcon(":icons-local/output-type-green-magenta.png"), _("Green/magenta glasses, full color"));
121     _output_combobox->addItem(QIcon(":icons-local/output-type-green-magenta.png"), _("Green/magenta glasses, Dubois"));
122     _output_combobox->addItem(QIcon(":icons-local/output-type-amber-blue.png"), _("Amber/blue glasses, monochrome"));
123     _output_combobox->addItem(QIcon(":icons-local/output-type-amber-blue.png"), _("Amber/blue glasses, half color"));
124     _output_combobox->addItem(QIcon(":icons-local/output-type-amber-blue.png"), _("Amber/blue glasses, full color"));
125     _output_combobox->addItem(QIcon(":icons-local/output-type-amber-blue.png"), _("Amber/blue glasses, Dubois"));
126     _output_combobox->addItem(QIcon(":icons-local/output-type-red-green.png"), _("Red/green glasses, monochrome"));
127     _output_combobox->addItem(QIcon(":icons-local/output-type-red-blue.png"), _("Red/blue glasses, monochrome"));
128     connect(_output_combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(output_changed()));
129     layout2->addWidget(_output_combobox, 0, 1);
130     layout2->setColumnStretch(1, 1);
131     _swap_checkbox = new QCheckBox(_("Swap left/right"));
132     _swap_checkbox->setToolTip(_("<p>Swap the left and right view. "
133                 "Use this if the 3D effect seems wrong.</p>"));
134     connect(_swap_checkbox, SIGNAL(stateChanged(int)), this, SLOT(swap_changed()));
135     layout2->addWidget(_swap_checkbox, 0, 2);
136 
137     QGridLayout *layout = new QGridLayout;
138     layout->addLayout(layout0, 0, 0);
139     layout->addLayout(layout1, 1, 0);
140     layout->addLayout(layout2, 2, 0);
141     setLayout(layout);
142 
143     // Align the labels
144     int minw = input_label->minimumSizeHint().width();
145     if (output_label->minimumSizeHint().width() > minw)
146     {
147         minw = output_label->minimumSizeHint().width();
148     }
149     if (video_label->minimumSizeHint().width() > minw)
150     {
151         minw = video_label->minimumSizeHint().width();
152     }
153     if (audio_label->minimumSizeHint().width() > minw)
154     {
155         minw = audio_label->minimumSizeHint().width();
156     }
157     if (subtitle_label->minimumSizeHint().width() > minw)
158     {
159         minw = subtitle_label->minimumSizeHint().width();
160     }
161     input_label->setMinimumSize(QSize(minw, input_label->minimumSizeHint().height()));
162     output_label->setMinimumSize(QSize(minw, output_label->minimumSizeHint().height()));
163     video_label->setMinimumSize(QSize(minw, video_label->minimumSizeHint().height()));
164     audio_label->setMinimumSize(QSize(minw, audio_label->minimumSizeHint().height()));
165     subtitle_label->setMinimumSize(QSize(minw, subtitle_label->minimumSizeHint().height()));
166 
167     _video_combobox->setEnabled(false);
168     _audio_combobox->setEnabled(false);
169     _subtitle_combobox->setEnabled(false);
170     _input_combobox->setEnabled(false);
171     _output_combobox->setEnabled(false);
172     _swap_checkbox->setEnabled(false);
173 
174     update();
175 }
176 
set_stereo_layout(parameters::stereo_layout_t stereo_layout,bool stereo_layout_swap)177 void in_out_widget::set_stereo_layout(parameters::stereo_layout_t stereo_layout, bool stereo_layout_swap)
178 {
179     switch (stereo_layout)
180     {
181     case parameters::layout_mono:
182         _input_combobox->setCurrentIndex(0);
183         break;
184     case parameters::layout_separate:
185         _input_combobox->setCurrentIndex(stereo_layout_swap ? 2 : 1);
186         break;
187     case parameters::layout_alternating:
188         _input_combobox->setCurrentIndex(stereo_layout_swap ? 4 : 3);
189         break;
190     case parameters::layout_top_bottom:
191         _input_combobox->setCurrentIndex(stereo_layout_swap ? 7 : 5);
192         break;
193     case parameters::layout_top_bottom_half:
194         _input_combobox->setCurrentIndex(stereo_layout_swap ? 8 : 6);
195         break;
196     case parameters::layout_left_right:
197         _input_combobox->setCurrentIndex(stereo_layout_swap ? 11: 9);
198         break;
199     case parameters::layout_left_right_half:
200         _input_combobox->setCurrentIndex(stereo_layout_swap ? 12 : 10);
201         break;
202     case parameters::layout_even_odd_rows:
203         _input_combobox->setCurrentIndex(stereo_layout_swap ? 14 : 13);
204         break;
205     }
206     _video_combobox->setEnabled(stereo_layout != parameters::layout_separate);
207 }
208 
set_stereo_mode(parameters::stereo_mode_t stereo_mode,bool stereo_mode_swap)209 void in_out_widget::set_stereo_mode(parameters::stereo_mode_t stereo_mode, bool stereo_mode_swap)
210 {
211     switch (stereo_mode)
212     {
213     default:
214     case parameters::mode_mono_left:
215         _output_combobox->setCurrentIndex(0);
216         break;
217     case parameters::mode_mono_right:
218         _output_combobox->setCurrentIndex(1);
219         break;
220     case parameters::mode_stereo:
221         _output_combobox->setCurrentIndex(2);
222         break;
223     case parameters::mode_alternating:
224         _output_combobox->setCurrentIndex(3);
225         break;
226     case parameters::mode_top_bottom:
227         _output_combobox->setCurrentIndex(4);
228         break;
229     case parameters::mode_top_bottom_half:
230         _output_combobox->setCurrentIndex(5);
231         break;
232     case parameters::mode_left_right:
233         _output_combobox->setCurrentIndex(6);
234         break;
235     case parameters::mode_left_right_half:
236         _output_combobox->setCurrentIndex(7);
237         break;
238     case parameters::mode_even_odd_rows:
239         _output_combobox->setCurrentIndex(8);
240         break;
241     case parameters::mode_even_odd_columns:
242         _output_combobox->setCurrentIndex(9);
243         break;
244     case parameters::mode_checkerboard:
245         _output_combobox->setCurrentIndex(10);
246         break;
247     case parameters::mode_hdmi_frame_pack:
248         _output_combobox->setCurrentIndex(11);
249         break;
250     case parameters::mode_red_cyan_monochrome:
251         _output_combobox->setCurrentIndex(12);
252         break;
253     case parameters::mode_red_cyan_half_color:
254         _output_combobox->setCurrentIndex(13);
255         break;
256     case parameters::mode_red_cyan_full_color:
257         _output_combobox->setCurrentIndex(14);
258         break;
259     case parameters::mode_red_cyan_dubois:
260         _output_combobox->setCurrentIndex(15);
261         break;
262     case parameters::mode_green_magenta_monochrome:
263         _output_combobox->setCurrentIndex(16);
264         break;
265     case parameters::mode_green_magenta_half_color:
266         _output_combobox->setCurrentIndex(17);
267         break;
268     case parameters::mode_green_magenta_full_color:
269         _output_combobox->setCurrentIndex(18);
270         break;
271     case parameters::mode_green_magenta_dubois:
272         _output_combobox->setCurrentIndex(19);
273         break;
274     case parameters::mode_amber_blue_monochrome:
275         _output_combobox->setCurrentIndex(20);
276         break;
277     case parameters::mode_amber_blue_half_color:
278         _output_combobox->setCurrentIndex(21);
279         break;
280     case parameters::mode_amber_blue_full_color:
281         _output_combobox->setCurrentIndex(22);
282         break;
283     case parameters::mode_amber_blue_dubois:
284         _output_combobox->setCurrentIndex(23);
285         break;
286     case parameters::mode_red_green_monochrome:
287         _output_combobox->setCurrentIndex(24);
288         break;
289     case parameters::mode_red_blue_monochrome:
290         _output_combobox->setCurrentIndex(25);
291         break;
292     }
293     _swap_checkbox->setChecked(stereo_mode_swap);
294 }
295 
video_changed()296 void in_out_widget::video_changed()
297 {
298     if (!_lock)
299     {
300         parameters::stereo_layout_t stereo_layout;
301         bool stereo_layout_swap;
302         get_stereo_layout(stereo_layout, stereo_layout_swap);
303         send_cmd(command::set_video_stream, _video_combobox->currentIndex());
304     }
305 }
306 
audio_changed()307 void in_out_widget::audio_changed()
308 {
309     if (!_lock)
310     {
311         send_cmd(command::set_audio_stream, _audio_combobox->currentIndex());
312     }
313 }
314 
subtitle_changed()315 void in_out_widget::subtitle_changed()
316 {
317     if (!_lock)
318     {
319         send_cmd(command::set_subtitle_stream, _subtitle_combobox->currentIndex() - 1);
320     }
321 }
322 
input_changed()323 void in_out_widget::input_changed()
324 {
325     if (!_lock)
326     {
327         parameters::stereo_layout_t stereo_layout;
328         bool stereo_layout_swap;
329         get_stereo_layout(stereo_layout, stereo_layout_swap);
330         if (stereo_layout == parameters::layout_separate)
331         {
332             _lock = true;
333             _video_combobox->setCurrentIndex(0);
334             _video_combobox->setEnabled(false);
335             _lock = false;
336         }
337         else
338         {
339             _video_combobox->setEnabled(true);
340         }
341         send_cmd(command::set_stereo_layout, static_cast<int>(stereo_layout));
342         send_cmd(command::set_stereo_layout_swap, stereo_layout_swap);
343         parameters::stereo_mode_t stereo_mode;
344         bool stereo_mode_swap;
345         get_stereo_mode(stereo_mode, stereo_mode_swap);
346         if (stereo_layout == parameters::layout_mono
347                 && !(stereo_mode == parameters::mode_mono_left || stereo_mode == parameters::mode_mono_right))
348         {
349             QString s = _settings->value("Session/2d-stereo-mode", "").toString();
350             parameters::stereo_mode_from_string(s.toStdString(), stereo_mode, stereo_mode_swap);
351             _lock = true;
352             set_stereo_mode(stereo_mode, stereo_mode_swap);
353             _lock = false;
354         }
355         else if (stereo_layout != parameters::layout_mono
356                 && (stereo_mode == parameters::mode_mono_left || stereo_mode == parameters::mode_mono_right))
357         {
358             QString s = _settings->value("Session/3d-stereo-mode", "").toString();
359             parameters::stereo_mode_from_string(s.toStdString(), stereo_mode, stereo_mode_swap);
360             _lock = true;
361             set_stereo_mode(stereo_mode, stereo_mode_swap);
362             _lock = false;
363         }
364     }
365 }
366 
output_changed()367 void in_out_widget::output_changed()
368 {
369     if (!_lock)
370     {
371         parameters::stereo_mode_t stereo_mode;
372         bool stereo_mode_swap;
373         get_stereo_mode(stereo_mode, stereo_mode_swap);
374         send_cmd(command::set_stereo_mode, static_cast<int>(stereo_mode));
375         send_cmd(command::set_stereo_mode_swap, stereo_mode_swap);
376     }
377 }
378 
swap_changed()379 void in_out_widget::swap_changed()
380 {
381     if (!_lock)
382     {
383         send_cmd(command::toggle_stereo_mode_swap);
384     }
385 }
386 
update()387 void in_out_widget::update()
388 {
389     const media_input *mi = dispatch::media_input();
390     _lock = true;
391     _video_combobox->setEnabled(mi);
392     _audio_combobox->setEnabled(mi);
393     _subtitle_combobox->setEnabled(mi);
394     _input_combobox->setEnabled(mi);
395     _output_combobox->setEnabled(mi);
396     _swap_checkbox->setEnabled(mi);
397     _video_combobox->clear();
398     _audio_combobox->clear();
399     _subtitle_combobox->clear();
400     if (mi)
401     {
402         for (int i = 0; i < mi->video_streams(); i++)
403         {
404             _video_combobox->addItem(mi->video_stream_name(i).c_str());
405         }
406         for (int i = 0; i < mi->audio_streams(); i++)
407         {
408             _audio_combobox->addItem(mi->audio_stream_name(i).c_str());
409         }
410         _subtitle_combobox->addItem(_("Off"));
411         for (int i = 0; i < mi->subtitle_streams(); i++)
412         {
413             _subtitle_combobox->addItem(mi->subtitle_stream_name(i).c_str());
414         }
415         _video_combobox->setCurrentIndex(dispatch::parameters().video_stream());
416         _audio_combobox->setCurrentIndex(dispatch::parameters().audio_stream());
417         _subtitle_combobox->setCurrentIndex(dispatch::parameters().subtitle_stream() + 1);
418         // Disable unsupported input modes
419         for (int i = 0; i < _input_combobox->count(); i++)
420         {
421             _input_combobox->setCurrentIndex(i);
422             parameters::stereo_layout_t layout;
423             bool swap;
424             get_stereo_layout(layout, swap);
425             qobject_cast<QStandardItemModel *>(_input_combobox->model())->item(i)->setEnabled(
426                     mi->stereo_layout_is_supported(layout, swap));
427         }
428         // Disable unsupported output modes
429         if (!dispatch::video_output() || !dispatch::video_output()->supports_stereo())
430         {
431             set_stereo_mode(parameters::mode_stereo, false);
432             qobject_cast<QStandardItemModel *>(_output_combobox->model())->item(_output_combobox->currentIndex())->setEnabled(false);
433         }
434         set_stereo_layout(dispatch::parameters().stereo_layout(), dispatch::parameters().stereo_layout_swap());
435         set_stereo_mode(dispatch::parameters().stereo_mode(), dispatch::parameters().stereo_mode_swap());
436     }
437     _lock = false;
438 }
439 
get_video_stream()440 int in_out_widget::get_video_stream()
441 {
442     return _video_combobox->currentIndex();
443 }
444 
get_audio_stream()445 int in_out_widget::get_audio_stream()
446 {
447     return _audio_combobox->currentIndex();
448 }
449 
get_subtitle_stream()450 int in_out_widget::get_subtitle_stream()
451 {
452     return _subtitle_combobox->currentIndex() - 1;
453 }
454 
get_stereo_layout(parameters::stereo_layout_t & stereo_layout,bool & stereo_layout_swap)455 void in_out_widget::get_stereo_layout(parameters::stereo_layout_t &stereo_layout, bool &stereo_layout_swap)
456 {
457     switch (_input_combobox->currentIndex())
458     {
459     case 0:
460         stereo_layout = parameters::layout_mono;
461         stereo_layout_swap = false;
462         break;
463     case 1:
464         stereo_layout = parameters::layout_separate;
465         stereo_layout_swap = false;
466         break;
467     case 2:
468         stereo_layout = parameters::layout_separate;
469         stereo_layout_swap = true;
470         break;
471     case 3:
472         stereo_layout = parameters::layout_alternating;
473         stereo_layout_swap = false;
474         break;
475     case 4:
476         stereo_layout = parameters::layout_alternating;
477         stereo_layout_swap = true;
478         break;
479     case 5:
480         stereo_layout = parameters::layout_top_bottom;
481         stereo_layout_swap = false;
482         break;
483     case 6:
484         stereo_layout = parameters::layout_top_bottom_half;
485         stereo_layout_swap = false;
486         break;
487     case 7:
488         stereo_layout = parameters::layout_top_bottom;
489         stereo_layout_swap = true;
490         break;
491     case 8:
492         stereo_layout = parameters::layout_top_bottom_half;
493         stereo_layout_swap = true;
494         break;
495     case 9:
496         stereo_layout = parameters::layout_left_right;
497         stereo_layout_swap = false;
498         break;
499     case 10:
500         stereo_layout = parameters::layout_left_right_half;
501         stereo_layout_swap = false;
502         break;
503     case 11:
504         stereo_layout = parameters::layout_left_right;
505         stereo_layout_swap = true;
506         break;
507     case 12:
508         stereo_layout = parameters::layout_left_right_half;
509         stereo_layout_swap = true;
510         break;
511     case 13:
512         stereo_layout = parameters::layout_even_odd_rows;
513         stereo_layout_swap = false;
514         break;
515     case 14:
516         stereo_layout = parameters::layout_even_odd_rows;
517         stereo_layout_swap = true;
518         break;
519     }
520 }
521 
get_stereo_mode(parameters::stereo_mode_t & stereo_mode,bool & stereo_mode_swap)522 void in_out_widget::get_stereo_mode(parameters::stereo_mode_t &stereo_mode, bool &stereo_mode_swap)
523 {
524     switch (_output_combobox->currentIndex())
525     {
526     case 0:
527         stereo_mode = parameters::mode_mono_left;
528         break;
529     case 1:
530         stereo_mode = parameters::mode_mono_right;
531         break;
532     case 2:
533         stereo_mode = parameters::mode_stereo;
534         break;
535     case 3:
536         stereo_mode = parameters::mode_alternating;
537         break;
538     case 4:
539         stereo_mode = parameters::mode_top_bottom;
540         break;
541     case 5:
542         stereo_mode = parameters::mode_top_bottom_half;
543         break;
544     case 6:
545         stereo_mode = parameters::mode_left_right;
546         break;
547     case 7:
548         stereo_mode = parameters::mode_left_right_half;
549         break;
550     case 8:
551         stereo_mode = parameters::mode_even_odd_rows;
552         break;
553     case 9:
554         stereo_mode = parameters::mode_even_odd_columns;
555         break;
556     case 10:
557         stereo_mode = parameters::mode_checkerboard;
558         break;
559     case 11:
560         stereo_mode = parameters::mode_hdmi_frame_pack;
561         break;
562     case 12:
563         stereo_mode = parameters::mode_red_cyan_monochrome;
564         break;
565     case 13:
566         stereo_mode = parameters::mode_red_cyan_half_color;
567         break;
568     case 14:
569         stereo_mode = parameters::mode_red_cyan_full_color;
570         break;
571     case 15:
572         stereo_mode = parameters::mode_red_cyan_dubois;
573         break;
574     case 16:
575         stereo_mode = parameters::mode_green_magenta_monochrome;
576         break;
577     case 17:
578         stereo_mode = parameters::mode_green_magenta_half_color;
579         break;
580     case 18:
581         stereo_mode = parameters::mode_green_magenta_full_color;
582         break;
583     case 19:
584         stereo_mode = parameters::mode_green_magenta_dubois;
585         break;
586     case 20:
587         stereo_mode = parameters::mode_amber_blue_monochrome;
588         break;
589     case 21:
590         stereo_mode = parameters::mode_amber_blue_half_color;
591         break;
592     case 22:
593         stereo_mode = parameters::mode_amber_blue_full_color;
594         break;
595     case 23:
596         stereo_mode = parameters::mode_amber_blue_dubois;
597         break;
598     case 24:
599         stereo_mode = parameters::mode_red_green_monochrome;
600         break;
601     case 25:
602         stereo_mode = parameters::mode_red_blue_monochrome;
603         break;
604     }
605     stereo_mode_swap = _swap_checkbox->isChecked();
606 }
607 
receive_notification(const notification & note)608 void in_out_widget::receive_notification(const notification &note)
609 {
610     _lock = true;
611     switch (note.type)
612     {
613     case notification::open:
614     case notification::play:
615         update();
616         break;
617     case notification::video_stream:
618         _video_combobox->setCurrentIndex(dispatch::parameters().video_stream());
619         break;
620     case notification::audio_stream:
621         _audio_combobox->setCurrentIndex(dispatch::parameters().audio_stream());
622         break;
623     case notification::subtitle_stream:
624         _subtitle_combobox->setCurrentIndex(dispatch::parameters().subtitle_stream() + 1);
625         break;
626     case notification::stereo_mode_swap:
627         _swap_checkbox->setChecked(dispatch::parameters().stereo_mode_swap());
628         break;
629     default:
630         break;
631     }
632     _lock = false;
633 }
634