]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/output.m
macosx: create new classes for all controls bar related code
[vlc] / modules / gui / macosx / output.m
index bba0086137cf74a1b646dda4edb9e81312ad31e7..e5b146d284493beb46d9ddbcd030918a7811331a 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * output.m: MacOS X Output Dialog
  *****************************************************************************
- * Copyright (C) 2002-2003 the VideoLAN team
+ * Copyright (C) 2002-2007 VLC authors and VideoLAN
  * $Id$
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
@@ -21,7 +21,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
 #include "output.h"
 
 /*****************************************************************************
- * VLCOutput implementation 
+ * VLCOutput implementation
  *****************************************************************************/
 @implementation VLCOutput
+@synthesize soutMRL=o_mrl;
 
 - (id)init
 {
     [super dealloc];
 }
 
-- (void)setMRL:(NSArray *)o_mrl_array
-{
-    [o_mrl autorelease];
-    o_mrl = [o_mrl_array copy];
-}
-
-- (NSArray *)getMRL
-{
-    return [o_mrl copy];
-}
-
 - (void)setTranscode:(NSString *)o_transcode_string
 {
     [o_transcode autorelease];
     NSArray *o_v_codecs = [NSArray arrayWithObjects: @"mp1v", @"mp2v", @"mp4v", @"DIV1",
         @"DIV2", @"DIV3", @"h263", @"h264", @"WMV1", @"WMV2", @"MJPG", @"theo", nil];
 
-    [o_output_ckbox setTitle: _NS("Advanced output:")];
+    [o_output_ckbox setTitle: _NS("Streaming/Saving:")];
     [o_output_settings setTitle: _NS("Settings...")];
     [o_btn_ok setTitle: _NS("OK")];
 
-    [o_options_lbl setTitle: _NS("Output Options")];
-    [o_display setTitle: _NS("Play locally")];
+    [o_options_lbl setTitle: _NS("Streaming and Transcoding Options")];
+    [o_display setTitle: _NS("Display the stream locally")];
     [[o_method cellAtRow:0 column:0] setTitle: _NS("File")];
     [[o_method cellAtRow:1 column:0] setTitle: _NS("Stream")];
     [o_dump_chkbox setTitle: _NS("Dump raw input")];
-    [o_btn_browse setTitle: _NS("Browse...")]; 
+    [o_btn_browse setTitle: _NS("Browse...")];
     [o_stream_address_lbl setStringValue: _NS("Address")];
     [o_stream_port_lbl setStringValue: _NS("Port")];
     [o_stream_ttl_lbl setStringValue: @"TTL"];
     [o_mux_selector removeAllItems];
     [o_mux_selector addItemsWithTitles: o_muxers];
 
-    [o_transcode_lbl setTitle: _NS("Transcode options")];
+    [o_transcode_lbl setTitle: _NS("Transcoding options")];
     [o_transcode_video_chkbox setTitle: _NS("Video")];
     [o_transcode_video_selector removeAllItems];
     [o_transcode_video_selector addItemsWithTitles: o_v_codecs];
 - (IBAction)outputChanged:(id)sender;
 {
     if ([o_output_ckbox state] == NSOnState)
-    {
         [o_output_settings setEnabled:YES];
-    }
     else
-    {
         [o_output_settings setEnabled:NO];
-    }
 }
 
 - (IBAction)outputSettings:(id)sender
     [o_sdp_url setEnabled: NO];
     [[o_mux_selector itemAtIndex: 0] setEnabled: YES];
 
-    if( [o_mode isEqualToString: _NS("File")] )
-    {
+    if ([o_mode isEqualToString: _NS("File")]) {
         [o_file_field setEnabled: YES];
         [o_btn_browse setEnabled: YES];
         [o_dump_chkbox setEnabled: YES];
         [[o_mux_selector itemAtIndex: 6] setEnabled: YES]; // MPEG 4
         [[o_mux_selector itemAtIndex: 7] setEnabled: YES]; // QuickTime
         [[o_mux_selector itemAtIndex: 8] setEnabled: YES]; // Raw
-    }
-    else if( [o_mode isEqualToString: _NS("Stream")] )
-    {
+    } else if ([o_mode isEqualToString: _NS("Stream")]) {
         [o_file_field setEnabled: NO];
         [o_dump_chkbox setEnabled: NO];
         [o_btn_browse setEnabled: NO];
 
         o_mode = [o_stream_type titleOfSelectedItem];
 
-        if( [o_mode isEqualToString: @"HTTP"] )
-        {
+        if ([o_mode isEqualToString: @"HTTP"]) {
             [o_stream_address setEnabled: YES];
             [o_stream_ttl setEnabled: NO];
             [o_stream_ttl_stp setEnabled: NO];
             [[o_mux_selector itemAtIndex: 6] setEnabled: NO];
             [[o_mux_selector itemAtIndex: 7] setEnabled: NO];
             [[o_mux_selector itemAtIndex: 8] setEnabled: YES];
-        }
-        else if( [o_mode isEqualToString: @"MMSH"] )
-        {
+        } else if ([o_mode isEqualToString: @"MMSH"]) {
             [o_stream_address setEnabled: YES];
             [o_stream_ttl setEnabled: NO];
             [o_stream_ttl_stp setEnabled: NO];
             [[o_mux_selector itemAtIndex: 7] setEnabled: NO];
             [[o_mux_selector itemAtIndex: 8] setEnabled: NO];
             [o_mux_selector selectItemAtIndex: 5];
-        }
-        else if( [o_mode isEqualToString: @"UDP"] )
-        {
+        } else if ([o_mode isEqualToString: @"UDP"]) {
             [o_stream_address setEnabled: YES];
             [o_stream_ttl setEnabled: YES];
             [o_stream_ttl_stp setEnabled: YES];
             [[o_mux_selector itemAtIndex: 8] setEnabled: YES];
             [o_sap_chkbox setEnabled: YES];
             [o_channel_name setEnabled: YES];
-        }
-        else if( [o_mode isEqualToString: @"RTP"] )
-        {
+        } else if ([o_mode isEqualToString: @"RTP"]) {
             [o_stream_address setEnabled: YES];
             [o_stream_ttl setEnabled: YES];
             [o_stream_ttl_stp setEnabled: YES];
         }
     }
 
-    if( ![[o_mux_selector selectedItem] isEnabled] && ![o_mode isEqualToString: @"RTP"] )
-    {
+    if (![[o_mux_selector selectedItem] isEnabled] && ![o_mode isEqualToString: @"RTP"])
         [o_mux_selector selectItemAtIndex: 0];
-    }
-    else if (![[o_mux_selector selectedItem] isEnabled] && [o_mode isEqualToString: @"RTP"] )
-    {
+    else if (![[o_mux_selector selectedItem] isEnabled] && [o_mode isEqualToString: @"RTP"])
         [o_mux_selector selectItemAtIndex: 8];
-    }
+
     [self outputInfoChanged: nil];
 }
 
     NSArray *o_sout_options;
 
     [o_mrl_string appendString: o_transcode];
-    if( [o_display state] == NSOnState )
-    {
+    if ([o_display state] == NSOnState)
         [o_mrl_string appendString: @"duplicate{dst=display,dst="];
-    }
 
     o_mode = [[o_method selectedCell] title];
     o_mux = [o_mux_selector titleOfSelectedItem];
 
-    if ( [o_mux isEqualToString: @"AVI"] ) o_mux_string = @"avi";
-    else if ( [o_mux isEqualToString: @"Ogg"] ) o_mux_string = @"ogg";
-    else if ( [o_mux isEqualToString: @"MPEG PS"] ) o_mux_string = @"ps";
-    else if ( [o_mux isEqualToString: @"MPEG 4"] ) o_mux_string = @"mp4";
-    else if ( [o_mux isEqualToString: @"MPEG 1"] ) o_mux_string = @"mpeg1";
-    else if ( [o_mux isEqualToString: @"Quicktime"] ) o_mux_string = @"mov";
-    else if ( [o_mux isEqualToString: @"ASF"] ) o_mux_string = @"asf";
-    else if ( [o_mux isEqualToString: @"Raw"] ) o_mux_string = @"raw";
+    if ([o_mux isEqualToString: @"AVI"]) o_mux_string = @"avi";
+    else if ([o_mux isEqualToString: @"Ogg"]) o_mux_string = @"ogg";
+    else if ([o_mux isEqualToString: @"MPEG PS"]) o_mux_string = @"ps";
+    else if ([o_mux isEqualToString: @"MPEG 4"]) o_mux_string = @"mp4";
+    else if ([o_mux isEqualToString: @"MPEG 1"]) o_mux_string = @"mpeg1";
+    else if ([o_mux isEqualToString: @"Quicktime"]) o_mux_string = @"mov";
+    else if ([o_mux isEqualToString: @"ASF"]) o_mux_string = @"asf";
+    else if ([o_mux isEqualToString: @"Raw"]) o_mux_string = @"raw";
     else o_mux_string = @"ts";
 
-    if( [o_mode isEqualToString: _NS("File")] )
-    {
-        if( [o_dump_chkbox state] == NSOnState )
-        {
+    if ([o_mode isEqualToString: _NS("File")]) {
+        if ([o_dump_chkbox state] == NSOnState) {
             NSMutableArray * o_sout_options;
             o_sout_options = [NSArray arrayWithObjects:
-                                    [NSString stringWithString:
-                                    @":demux=dump"],
+                                    @":demux=dump",
                                     [NSString stringWithFormat:
                                     @":demuxdump-file=%@",
                                     [o_file_field stringValue]],
                                     nil];
-            [self setMRL:o_sout_options];
+            [self setSoutMRL:o_sout_options];
             return;
-        }
-        else
-        {
-                [o_mrl_string appendFormat:
-                        @"std{access=file,mux=%@,url=\"%@\"}",
-                        o_mux_string, [o_file_field stringValue]];
-        }
+        } else
+                [o_mrl_string appendFormat: @"std{access=file,mux=%@,dst=\"%@\"}", o_mux_string, [o_file_field stringValue]];
     }
-    else if( [o_mode isEqualToString: _NS("Stream")] )
-    {
+    else if ([o_mode isEqualToString: _NS("Stream")]) {
         o_mode = [o_stream_type titleOfSelectedItem];
 
-        if ( [o_mode isEqualToString: @"HTTP"] )
+        if ([o_mode isEqualToString: @"HTTP"])
             o_mode = @"http";
-        else if ( [o_mode isEqualToString: @"MMSH"] )
-        {
-            if ( [o_mux isEqualToString: @"ASF"] ) o_mux_string = @"asfh";
+        else if ([o_mode isEqualToString: @"MMSH"]) {
+            if ([o_mux isEqualToString: @"ASF"])
+                o_mux_string = @"asfh";
             o_mode = @"mmsh";
-        }
-        else if ( [o_mode isEqualToString: @"UDP"] )
-        {
+        } else if ([o_mode isEqualToString: @"UDP"]) {
             o_mode = @"udp";
-            if( [o_sap_chkbox state] == NSOnState )
-            {
-                if ( ![[o_channel_name stringValue] isEqualToString: @""] )
-                    [o_announce appendFormat:
-                        @",sap,name=%@", [o_channel_name stringValue]];
+            if ([o_sap_chkbox state] == NSOnState) {
+                if (![[o_channel_name stringValue] isEqualToString: @""])
+                    [o_announce appendFormat:@",sap,name=%@", [o_channel_name stringValue]];
                 else
                     [o_announce appendFormat:@",sap"];
             }
         }
-        if ( ![o_mode isEqualToString: @"RTP"] )
-        {
+        if (![o_mode isEqualToString: @"RTP"]) {
             /* split up the hostname and the following path to paste the
              * port correctly. Not need, if there isn't any path following the
              * hostname. */
-            NSArray * o_urlItems = [[o_stream_address stringValue] \
-                componentsSeparatedByString: @"/"];
+            NSArray * o_urlItems = [[o_stream_address stringValue] componentsSeparatedByString: @"/"];
             NSMutableString * o_finalStreamAddress;
             o_finalStreamAddress = [[NSMutableString alloc] init];
-            
+
             if ([o_urlItems count] == 1)
-            {
-                [o_finalStreamAddress appendFormat: @"\"%@:%@\"", \
-                    [o_stream_address stringValue],[o_stream_port stringValue]];
-            }
-            else
-            {
-                [o_finalStreamAddress appendFormat: @"\"%@:%@", [o_urlItems \
-                    objectAtIndex: 0], [o_stream_port stringValue]];
-                unsigned int x;
-                x = 1;
-                while (x != [o_urlItems count])
-                {
-                    [o_finalStreamAddress appendFormat: @"/%@", [o_urlItems \
-                        objectAtIndex: x]];
-                    x = (x + 1);
-                }
+                [o_finalStreamAddress appendFormat: @"\"%@:%@\"", [o_stream_address stringValue],[o_stream_port stringValue]];
+            else {
+                [o_finalStreamAddress appendFormat: @"\"%@:%@", [o_urlItems objectAtIndex: 0], [o_stream_port stringValue]];
+                NSUInteger itemCount = [o_urlItems count];
+                for (NSUInteger x = 0; x < itemCount; x++)
+                    [o_finalStreamAddress appendFormat: @"/%@", [o_urlItems objectAtIndex: x]];
                 [o_finalStreamAddress appendString: @"\""];
             }
-            
+
             [o_mrl_string appendFormat:
-                        @"std{access=%@,mux=%@,url=%@%@}",
+                        @"std{access=%@,mux=%@,dst=%@%@}",
                         o_mode, o_mux_string, o_finalStreamAddress, o_announce];
-        }
-        else
-        {
+        } else {
             NSString * o_stream_name;
 
-            if (![[o_channel_name stringValue] isEqualToString: @""] )
-            {
-                o_stream_name = [NSString stringWithFormat:@",name=%@",
-                                [o_channel_name stringValue]];
-            }
+            if (![[o_channel_name stringValue] isEqualToString: @""])
+                o_stream_name = [NSString stringWithFormat:@",name=%@", [o_channel_name stringValue]];
             else
-            {
                 o_stream_name = @"";
-            }
 
-            if ( [o_sap_chkbox state] == NSOnState )
-            {
+            if ([o_sap_chkbox state] == NSOnState)
                 [o_announce appendString: @",sdp=sap"];
-            }
-            if ([o_rtsp_chkbox state] == NSOnState )
-            {
+
+            if ([o_rtsp_chkbox state] == NSOnState)
                 [o_announce appendFormat:@",sdp=\"rtsp://%@\"",[o_sdp_url stringValue]];
 
-            }
-            if ([o_http_chkbox state] == NSOnState )
-            {
+            if ([o_http_chkbox state] == NSOnState)
                 [o_announce appendFormat:@",sdp=\"http://%@\"",[o_sdp_url stringValue]];
-            }
-            if ([o_file_chkbox state] == NSOnState )
-            {
+
+            if ([o_file_chkbox state] == NSOnState)
                 [o_announce appendFormat:@",sdp=\"file://%@\"",[o_sdp_url stringValue]];
-            }
+
             [o_mrl_string appendFormat:
                         @"rtp{dst=\"%@\",port=%@%@%@}",[o_stream_address stringValue],
                         [o_stream_port stringValue], o_stream_name, o_announce];
         }
 
     }
-    if( [o_display state] == NSOnState )
-    {
+    if ([o_display state] == NSOnState)
         [o_mrl_string appendString: @"}"];
-    }
+
     o_sout_options = [NSArray arrayWithObjects: o_mrl_string,nil];
-    [self setMRL:o_sout_options];
+    [self setSoutMRL:o_sout_options];
 }
 
 - (void)TTLChanged:(NSNotification *)o_notification
 {
     intf_thread_t * p_intf = VLCIntf;
-    config_PutInt( p_intf, "ttl", [o_stream_ttl intValue] );
+    config_PutInt(p_intf, "ttl", [o_stream_ttl intValue]);
 }
 
 - (IBAction)outputFileBrowse:(id)sender
 {
     NSSavePanel *o_save_panel = [NSSavePanel savePanel];
     NSString *o_mux_string;
-    if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"MPEG PS"] )
+    if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"MPEG PS"])
         o_mux_string = @"vob";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"MPEG 1"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"MPEG 1"])
         o_mux_string = @"mpg";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"AVI"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"AVI"])
         o_mux_string = @"avi";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"ASF"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"ASF"])
         o_mux_string = @"asf";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"Ogg"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"Ogg"])
         o_mux_string = @"ogm";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"MPEG 4"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"MPEG 4"])
         o_mux_string = @"mp4";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"Quicktime"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"Quicktime"])
         o_mux_string = @"mov";
-    else if ( [[o_mux_selector titleOfSelectedItem] isEqualToString: @"Raw"] )
+    else if ([[o_mux_selector titleOfSelectedItem] isEqualToString: @"Raw"])
         o_mux_string = @"raw";
     else
         o_mux_string = @"ts";
 
     [o_save_panel setTitle: _NS("Save File")];
     [o_save_panel setPrompt: _NS("Save")];
+    [o_save_panel setNameFieldStringValue: o_name];
 
-    if( [o_save_panel runModalForDirectory: nil
-            file: o_name] == NSOKButton )
-    {
-        NSString *o_filename = [o_save_panel filename];
+    if ([o_save_panel runModal] == NSFileHandlingPanelOKButton) {
+        NSString *o_filename = [[o_save_panel URL] path];
         [o_file_field setStringValue: o_filename];
         [self outputInfoChanged: nil];
     }
 
 - (void)transcodeChanged:(NSNotification *)o_notification
 {
-    if( [o_transcode_video_chkbox state] == NSOnState )
-    {
+    if ([o_transcode_video_chkbox state] == NSOnState) {
         [o_transcode_video_selector setEnabled: YES];
         [o_transcode_video_bitrate setEnabled: YES];
         [o_transcode_video_scale setEnabled: YES];
-    }
-    else
-    {
+    } else {
         [o_transcode_video_selector setEnabled: NO];
         [o_transcode_video_bitrate setEnabled: NO];
         [o_transcode_video_scale setEnabled: NO];
     }
-    if( [o_transcode_audio_chkbox state] == NSOnState )
-    {
+    if ([o_transcode_audio_chkbox state] == NSOnState) {
         [o_transcode_audio_selector setEnabled: YES];
         [o_transcode_audio_bitrate setEnabled: YES];
         [o_transcode_audio_channels setEnabled: YES];
-    }
-    else
-    {
+    } else {
         [o_transcode_audio_selector setEnabled: NO];
         [o_transcode_audio_bitrate setEnabled: NO];
         [o_transcode_audio_channels setEnabled: NO];
 
 - (void)transcodeInfoChanged:(NSNotification *)o_notification
 {
-    NSMutableString *o_transcode_string;
-
-    if( [o_transcode_video_chkbox state] == NSOnState ||
-        [o_transcode_audio_chkbox state] == NSOnState )
-    {
-        o_transcode_string = [NSMutableString stringWithString:@"transcode{"];
-        if ( [o_transcode_video_chkbox state] == NSOnState )
-        {
+    NSMutableString *o_transcode_string = [NSMutableString stringWithCapacity:200];
+
+    if ([o_transcode_video_chkbox state] == NSOnState ||
+        [o_transcode_audio_chkbox state] == NSOnState) {
+        [o_transcode_string appendString:@"transcode{"];
+        if ([o_transcode_video_chkbox state] == NSOnState) {
             [o_transcode_string appendFormat: @"vcodec=\"%@\",vb=\"%@\"" \
                                                             ",scale=\"%@\"",
                 [o_transcode_video_selector titleOfSelectedItem],
                 [o_transcode_video_bitrate stringValue],
                 [o_transcode_video_scale stringValue]];
-            if ( [o_transcode_audio_chkbox state] == NSOnState )
-            {
+            if ([o_transcode_audio_chkbox state] == NSOnState)
                 [o_transcode_string appendString: @","];
-            }
         }
-        if ( [o_transcode_audio_chkbox state] == NSOnState )
-        {
+        if ([o_transcode_audio_chkbox state] == NSOnState) {
             [o_transcode_string appendFormat: @"acodec=\"%@\",ab=\"%@\"",
                 [o_transcode_audio_selector titleOfSelectedItem],
                 [o_transcode_audio_bitrate stringValue]];
-            if ( ![[o_transcode_audio_channels stringValue]
-                                            isEqualToString: @""])
-            {
-                [o_transcode_string appendFormat: @",channels=\"%@\"",
-                                   [o_transcode_audio_channels stringValue]];
-            }
+            if (![[o_transcode_audio_channels stringValue] isEqualToString: @""])
+                [o_transcode_string appendFormat: @",channels=\"%@\"", [o_transcode_audio_channels stringValue]];
         }
         [o_transcode_string appendString:@"}:"];
     }
     else
-    {
-        o_transcode_string = [NSString stringWithString:@""];
-    }
+        [o_transcode_string setString: @""];
+
     [self setTranscode: o_transcode_string];
     [self outputInfoChanged:nil];
 }
     [o_channel_name setEnabled: [o_sap_chkbox state] ||
                 [o_mode isEqualToString: @"RTP"]];
 
-    if ([o_mode isEqualToString: @"RTP"])
-    {
-/*        if ([[sender title] isEqualToString: _NS("SAP announce")])
-        {
+    if ([o_mode isEqualToString: @"RTP"]) {
+/*        if ([[sender title] isEqualToString: _NS("SAP announce")]) {
             [o_rtsp_chkbox setState:NSOffState];
             [o_http_chkbox setState:NSOffState];
         }*/
-        if ([[sender title] isEqualToString:_NS("RTSP announce")])
-        {
+        if ([[sender title] isEqualToString:_NS("RTSP announce")]) {
 //            [o_sap_chkbox setState:NSOffState];
             [o_http_chkbox setState:NSOffState];
             [o_file_chkbox setState:NSOffState];
-        }
-        else if ([[sender title] isEqualToString:_NS("HTTP announce")])
-        {
+        } else if ([[sender title] isEqualToString:_NS("HTTP announce")]) {
 //            [o_sap_chkbox setState:NSOffState];
             [o_rtsp_chkbox setState:NSOffState];
             [o_file_chkbox setState:NSOffState];
-        }
-        else if ([[sender title] isEqualToString:_NS("Export SDP as file")])
-        {
+        } else if ([[sender title] isEqualToString:_NS("Export SDP as file")]) {
             [o_rtsp_chkbox setState:NSOffState];
             [o_http_chkbox setState:NSOffState];
         }
 
-        if ( [o_rtsp_chkbox state] == NSOnState ||
-                            [o_http_chkbox state] == NSOnState ||
-                            [o_file_chkbox state] == NSOnState )
-        {
+        if ([o_rtsp_chkbox state] == NSOnState ||
+            [o_http_chkbox state] == NSOnState ||
+            [o_file_chkbox state] == NSOnState)
             [o_sdp_url setEnabled: YES];
-        }
         else
-        {
             [o_sdp_url setEnabled: NO];
-        }
     }
     [self outputInfoChanged: nil];
 }