]> git.sesse.net Git - vlc/blob - modules/gui/macosx/TrackSynchronization.m
macosx: added 'subsdelay' to the track synchro panel and removed the bogus, non HIG...
[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     {
78         default:
79         case SUBSDELAY_MODE_ABSOLUTE:
80             o_toolTip = _NS("Extend subtitles duration by this value.\nSet 0 to disable.");
81             o_suffix = @" s";
82             break;
83         case SUBSDELAY_MODE_RELATIVE_SOURCE_DELAY:
84             o_toolTip = _NS("Multiply subtitles duration by this value.\nSet 0 to disable.");
85             o_suffix = @"";
86             break;
87         case SUBSDELAY_MODE_RELATIVE_SOURCE_CONTENT:
88             o_toolTip = _NS("Recalculate subtitles duration according\nto their content and this value.\nSet 0 to disable.");
89             o_suffix = @"";
90             break;
91     }
92
93     [[o_sv_dur_value_fld formatter] setFormat:[NSString stringWithFormat:@"#,##0.000%@", o_suffix]];
94     [o_sv_dur_value_fld setToolTip: o_toolTip];
95
96     if (OSX_LION)
97         [o_window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary];
98
99     [self resetValues:self];
100 }
101
102 - (IBAction)toggleWindow:(id)sender
103 {
104     if( [o_window isVisible] )
105         [o_window orderOut:sender];
106     else
107         [o_window makeKeyAndOrderFront:sender];
108 }
109
110 - (IBAction)resetValues:(id)sender
111 {
112     [o_av_value_fld setFloatValue:0.0];
113     [o_sv_advance_value_fld setFloatValue:0.0];
114     [o_sv_speed_value_fld setFloatValue:1.0];
115     [o_sv_dur_value_fld setFloatValue:0.0];
116     [o_av_stp setFloatValue:0.0];
117     [o_sv_advance_stp setFloatValue:0.0];
118     [o_sv_speed_stp setFloatValue:1.0];
119     [o_sv_dur_stp setFloatValue:0.0];
120
121     input_thread_t * p_input = pl_CurrentInput( p_intf );
122
123     if( p_input )
124     {
125         var_SetTime( p_input, "audio-delay", 0.0 );
126         var_SetTime( p_input, "spu-delay", 0.0 );
127         var_SetFloat( p_input, "sub-fps", 1.0 );
128         [self svDurationValueChanged:nil];
129         vlc_object_release( p_input );
130     }
131 }
132
133 - (void)updateValues
134 {
135     input_thread_t * p_input = pl_CurrentInput( p_intf );
136
137     if( p_input )
138     {
139         [o_av_value_fld setDoubleValue: var_GetTime( p_input, "audio-delay" ) / 1000000.];
140         [o_sv_advance_value_fld setDoubleValue: var_GetTime( p_input, "spu-delay" ) / 1000000.];
141         [o_sv_speed_value_fld setFloatValue: var_GetFloat( p_input, "sub-fps" )];
142         vlc_object_release( p_input );
143     }
144     [o_av_stp setDoubleValue: [o_av_value_fld doubleValue]];
145     [o_sv_advance_stp setDoubleValue: [o_sv_advance_value_fld doubleValue]];
146     [o_sv_speed_stp setDoubleValue: [o_sv_speed_value_fld doubleValue]];
147 }
148
149 - (IBAction)avValueChanged:(id)sender
150 {
151     if( sender == o_av_stp )
152         [o_av_value_fld setDoubleValue: [o_av_stp doubleValue]];
153     else
154         [o_av_stp setDoubleValue: [o_av_value_fld doubleValue]];
155
156     input_thread_t * p_input = pl_CurrentInput( p_intf );
157
158     if( p_input )
159     {
160         var_SetTime( p_input, "audio-delay", [o_av_value_fld doubleValue] * 1000000. );
161
162         vlc_object_release( p_input );
163     }
164 }
165
166 - (IBAction)svAdvanceValueChanged:(id)sender
167 {
168     if( sender == o_sv_advance_stp )
169         [o_sv_advance_value_fld setDoubleValue: [o_sv_advance_stp doubleValue]];
170     else
171         [o_sv_advance_stp setDoubleValue: [o_sv_advance_value_fld doubleValue]];
172
173     input_thread_t * p_input = pl_CurrentInput( p_intf );
174
175     if( p_input )
176     {
177         var_SetTime( p_input, "spu-delay", [o_sv_advance_value_fld doubleValue] * 1000000. );
178
179         vlc_object_release( p_input );
180     }
181 }
182
183 - (IBAction)svSpeedValueChanged:(id)sender
184 {
185     if( sender == o_sv_speed_stp )
186         [o_sv_speed_value_fld setFloatValue: [o_sv_speed_stp floatValue]];
187     else
188         [o_sv_speed_stp setFloatValue: [o_sv_speed_value_fld floatValue]];
189
190     input_thread_t * p_input = pl_CurrentInput( p_intf );
191
192     if( p_input )
193     {
194         var_SetFloat( p_input, "sub-fps", [o_sv_speed_value_fld floatValue] );
195
196         vlc_object_release( p_input );
197     }
198 }
199
200 - (IBAction)svDurationValueChanged:(id)sender
201 {
202     if( sender == o_sv_dur_stp )
203         [o_sv_dur_value_fld setFloatValue: [o_sv_dur_stp floatValue]];
204     else
205         [o_sv_dur_stp setFloatValue: [o_sv_dur_value_fld floatValue]];
206
207     input_thread_t * p_input = pl_CurrentInput( p_intf );
208
209     if( p_input )
210     {
211         float f_factor = [o_sv_dur_value_fld floatValue];
212         config_PutFloat( p_intf, SUBSDELAY_CFG_FACTOR, f_factor );
213
214         /* Try to find an instance of subsdelay, and set its factor */
215         vlc_object_t *p_obj = ( vlc_object_t * ) vlc_object_find_name( p_intf->p_libvlc, "subsdelay" );
216         if( p_obj )
217         {
218             var_SetFloat( p_obj, SUBSDELAY_CFG_FACTOR, f_factor );
219             vlc_object_release( p_obj );
220         }
221         [[VLCVideoEffects sharedInstance] setVideoFilter: "subsdelay" on: f_factor > 0];
222
223         vlc_object_release( p_input );
224     }
225 }
226
227 @end