]> git.sesse.net Git - vlc/blob - modules/gui/macosx/TrackSynchronization.m
macosx: unify and modernize coding style
[vlc] / modules / gui / macosx / TrackSynchronization.m
1 /*****************************************************************************
2  * TrackSynchronization.m: MacOS X interface module
3  *****************************************************************************
4  * Copyright (C) 2011-2012 VLC authors and VideoLAN
5  * Copyright (C) 2011-2012 Felix Paul Kühne
6  * $Id$
7  *
8  * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #import "CompatibilityFixes.h"
26 #import "intf.h"
27 #import "VideoEffects.h"
28 #import <vlc_common.h>
29 #import "TrackSynchronization.h"
30
31 #define SUBSDELAY_CFG_MODE                     "subsdelay-mode"
32 #define SUBSDELAY_CFG_FACTOR                   "subsdelay-factor"
33 #define SUBSDELAY_MODE_ABSOLUTE                0
34 #define SUBSDELAY_MODE_RELATIVE_SOURCE_DELAY   1
35 #define SUBSDELAY_MODE_RELATIVE_SOURCE_CONTENT 2
36
37 @implementation VLCTrackSynchronization
38 static VLCTrackSynchronization *_o_sharedInstance = nil;
39
40 + (VLCTrackSynchronization *)sharedInstance
41 {
42     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
43 }
44
45 - (id)init
46 {
47     if (_o_sharedInstance)
48         [self dealloc];
49     else {
50         p_intf = VLCIntf;
51         _o_sharedInstance = [super init];
52     }
53
54     return _o_sharedInstance;
55 }
56
57 - (void)awakeFromNib
58 {
59     [o_window setTitle:_NS("Track Synchronization")];
60     [o_reset_btn setTitle:_NS("Reset")];
61     [o_av_lbl setStringValue:_NS("Audio/Video")];
62     [o_av_advance_lbl setStringValue: _NS("Audio track synchronization:")];
63     [[o_av_value_fld formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("s")]];
64     [o_av_value_fld setToolTip: _NS("A positive value means that the audio is ahead of the video")];
65     [o_sv_lbl setStringValue: _NS("Subtitles/Video")];
66     [o_sv_advance_lbl setStringValue: _NS("Subtitle track syncronization:")];
67     [[o_sv_advance_value_fld formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("s")]];
68     [o_sv_advance_value_fld setToolTip: _NS("A positive value means that the subtitles are ahead of the video")];
69     [o_sv_speed_lbl setStringValue: _NS("Subtitles speed:")];
70     [[o_sv_speed_value_fld formatter] setFormat:[NSString stringWithFormat:@"#,##0.000 %@", _NS("fps")]];
71     [o_sv_dur_lbl setStringValue: _NS("Subtitles duration factor:")];
72
73     int i_mode = var_InheritInteger(p_intf, SUBSDELAY_CFG_MODE);
74     NSString * o_toolTip, * o_suffix;
75
76     switch (i_mode) {
77         default:
78         case SUBSDELAY_MODE_ABSOLUTE:
79             o_toolTip = _NS("Extend subtitles duration by this value.\nSet 0 to disable.");
80             o_suffix = @" s";
81             break;
82         case SUBSDELAY_MODE_RELATIVE_SOURCE_DELAY:
83             o_toolTip = _NS("Multiply subtitles duration by this value.\nSet 0 to disable.");
84             o_suffix = @"";
85             break;
86         case SUBSDELAY_MODE_RELATIVE_SOURCE_CONTENT:
87             o_toolTip = _NS("Recalculate subtitles duration according\nto their content and this value.\nSet 0 to disable.");
88             o_suffix = @"";
89             break;
90     }
91
92     [[o_sv_dur_value_fld formatter] setFormat:[NSString stringWithFormat:@"#,##0.000%@", o_suffix]];
93     [o_sv_dur_value_fld setToolTip: o_toolTip];
94
95     if (!OSX_SNOW_LEOPARD)
96         [o_window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary];
97
98     [self resetValues:self];
99 }
100
101 - (IBAction)toggleWindow:(id)sender
102 {
103     if ([o_window isVisible])
104         [o_window orderOut:sender];
105     else
106         [o_window makeKeyAndOrderFront:sender];
107 }
108
109 - (IBAction)resetValues:(id)sender
110 {
111     [o_av_value_fld setFloatValue:0.0];
112     [o_sv_advance_value_fld setFloatValue:0.0];
113     [o_sv_speed_value_fld setFloatValue:1.0];
114     [o_sv_dur_value_fld setFloatValue:0.0];
115     [o_av_stp setFloatValue:0.0];
116     [o_sv_advance_stp setFloatValue:0.0];
117     [o_sv_speed_stp setFloatValue:1.0];
118     [o_sv_dur_stp setFloatValue:0.0];
119
120     input_thread_t * p_input = pl_CurrentInput(p_intf);
121
122     if (p_input) {
123         var_SetTime(p_input, "audio-delay", 0.0);
124         var_SetTime(p_input, "spu-delay", 0.0);
125         var_SetFloat(p_input, "sub-fps", 1.0);
126         [self svDurationValueChanged:nil];
127         vlc_object_release(p_input);
128     }
129 }
130
131 - (void)updateValues
132 {
133     input_thread_t * p_input = pl_CurrentInput(p_intf);
134
135     if (p_input) {
136         [o_av_value_fld setDoubleValue: var_GetTime(p_input, "audio-delay") / 1000000.];
137         [o_sv_advance_value_fld setDoubleValue: var_GetTime(p_input, "spu-delay") / 1000000.];
138         [o_sv_speed_value_fld setFloatValue: var_GetFloat(p_input, "sub-fps")];
139         vlc_object_release(p_input);
140     }
141     [o_av_stp setDoubleValue: [o_av_value_fld doubleValue]];
142     [o_sv_advance_stp setDoubleValue: [o_sv_advance_value_fld doubleValue]];
143     [o_sv_speed_stp setDoubleValue: [o_sv_speed_value_fld doubleValue]];
144 }
145
146 - (IBAction)avValueChanged:(id)sender
147 {
148     if (sender == o_av_stp)
149         [o_av_value_fld setDoubleValue: [o_av_stp doubleValue]];
150     else
151         [o_av_stp setDoubleValue: [o_av_value_fld doubleValue]];
152
153     input_thread_t * p_input = pl_CurrentInput(p_intf);
154
155     if (p_input) {
156         var_SetTime(p_input, "audio-delay", [o_av_value_fld doubleValue] * 1000000.);
157
158         vlc_object_release(p_input);
159     }
160 }
161
162 - (IBAction)svAdvanceValueChanged:(id)sender
163 {
164     if (sender == o_sv_advance_stp)
165         [o_sv_advance_value_fld setDoubleValue: [o_sv_advance_stp doubleValue]];
166     else
167         [o_sv_advance_stp setDoubleValue: [o_sv_advance_value_fld doubleValue]];
168
169     input_thread_t * p_input = pl_CurrentInput(p_intf);
170
171     if (p_input) {
172         var_SetTime(p_input, "spu-delay", [o_sv_advance_value_fld doubleValue] * 1000000.);
173
174         vlc_object_release(p_input);
175     }
176 }
177
178 - (IBAction)svSpeedValueChanged:(id)sender
179 {
180     if (sender == o_sv_speed_stp)
181         [o_sv_speed_value_fld setFloatValue: [o_sv_speed_stp floatValue]];
182     else
183         [o_sv_speed_stp setFloatValue: [o_sv_speed_value_fld floatValue]];
184
185     input_thread_t * p_input = pl_CurrentInput(p_intf);
186
187     if (p_input) {
188         var_SetFloat(p_input, "sub-fps", [o_sv_speed_value_fld floatValue]);
189
190         vlc_object_release(p_input);
191     }
192 }
193
194 - (IBAction)svDurationValueChanged:(id)sender
195 {
196     if (sender == o_sv_dur_stp)
197         [o_sv_dur_value_fld setFloatValue: [o_sv_dur_stp floatValue]];
198     else
199         [o_sv_dur_stp setFloatValue: [o_sv_dur_value_fld floatValue]];
200
201     input_thread_t * p_input = pl_CurrentInput(p_intf);
202
203     if (p_input) {
204         float f_factor = [o_sv_dur_value_fld floatValue];
205         config_PutFloat(p_intf, SUBSDELAY_CFG_FACTOR, f_factor);
206
207         /* Try to find an instance of subsdelay, and set its factor */
208         vlc_object_t *p_obj = (vlc_object_t *) vlc_object_find_name(p_intf->p_libvlc, "subsdelay");
209         if (p_obj) {
210             var_SetFloat(p_obj, SUBSDELAY_CFG_FACTOR, f_factor);
211             vlc_object_release(p_obj);
212         }
213         [[VLCVideoEffects sharedInstance] setVideoFilter: "subsdelay" on: f_factor > 0];
214
215         vlc_object_release(p_input);
216     }
217 }
218
219 @end