]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/eyetv.m
* forward-port of all eyetv relates sources in my branch
[vlc] / modules / gui / macosx / eyetv.m
diff --git a/modules/gui/macosx/eyetv.m b/modules/gui/macosx/eyetv.m
new file mode 100644 (file)
index 0000000..19e5d43
--- /dev/null
@@ -0,0 +1,170 @@
+/*****************************************************************************\r
+* eyetv.m: small class to control the notification parts of the EyeTV plugin\r
+*****************************************************************************\r
+* Copyright (C) 2006-2007 the VideoLAN team\r
+* $Id$\r
+*\r
+* Authors: Felix Kühne <fkuehne at videolan dot org>\r
+*\r
+* This program is free software; you can redistribute it and/or modify\r
+* it under the terms of the GNU General Public License as published by\r
+* the Free Software Foundation; either version 2 of the License, or\r
+* (at your option) any later version.\r
+*\r
+* This program is distributed in the hope that it will be useful,\r
+* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+* GNU General Public License for more details.\r
+*\r
+* You should have received a copy of the GNU General Public License\r
+* along with this program; if not, write to the Free Software\r
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.\r
+*****************************************************************************/\r
+\r
+#import "eyetv.h"
+/* for apple event interaction [carbon] */\r
+#import <ApplicationServices/ApplicationServices.h> \r
+/* for various VLC core related calls */
+#import "intf.h"\r
+\r
+@implementation VLCEyeTVController\r
+\r
+static VLCEyeTVController *_o_sharedInstance = nil;\r
+\r
++ (VLCEyeTVController *)sharedInstance\r
+{\r
+    return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];\r
+}\r
+\r
+- (id)init \r
+{\r
+    if (_o_sharedInstance) {\r
+        [self dealloc];\r
+    } else {\r
+        _o_sharedInstance = [super init];\r
+\r
+        [[NSDistributedNotificationCenter defaultCenter] 
+                    addObserver: self\r
+                       selector: @selector(globalNotificationReceived:)\r
+                           name: NULL\r
+                         object: @"VLCEyeTVSupport"\r
+             suspensionBehavior: NSNotificationSuspensionBehaviorDeliverImmediately];\r
+    }\r
+    \r
+    return _o_sharedInstance;\r
+}\r
+\r
+- (void)globalNotificationReceived: (NSNotification *)theNotification\r
+{\r
+    msg_Dbg( VLCIntf, "notification received in VLC with name %s and object %s",
+             [[theNotification name] UTF8String], [[theNotification object] UTF8String] );\r
+\r
+    /* update our info on the used device */\r
+    if( [[theNotification name] isEqualToString: @"DeviceAdded"] )\r
+        b_deviceConnected = YES;\r
+    if( [[theNotification name] isEqualToString: @"DeviceRemoved"] )\r
+        b_deviceConnected = NO;\r
+\r
+    /* is eyetv running? */\r
+    if( [[theNotification name] isEqualToString: @"PluginInit"] )\r
+        b_eyeTVactive = YES;\r
+    if( [[theNotification name] isEqualToString: @"PluginQuit"] )\r
+        b_eyeTVactive = NO;\r
+}\r
+\r
+- (BOOL)isEyeTVrunning\r
+{\r
+    return b_eyeTVactive;\r
+}\r
+\r
+- (BOOL)isDeviceConnected\r
+{\r
+    return b_deviceConnected;\r
+}\r
+\r
+\r
+- (void)launchEyeTV\r
+{\r
+    OSStatus stat;\r
+    FSRef eyetvPath;\r
+\r
+    stat = LSFindApplicationForInfo ( 'EyTV',\r
+                                       CFSTR("com.elgato.eyetv"),\r
+                                       NULL,\r
+                                       &eyetvPath,\r
+                                       NULL );\r
+    if( stat != noErr )\r
+        msg_Err( VLCIntf, "finding EyeTV failed with error code %i", (int)stat );\r
+    \r
+    stat = LSOpenFSRef( &eyetvPath, NULL );\r
+    if( stat != noErr )\r
+        msg_Err( VLCIntf, "opening EyeTV failed with error code %i", (int)stat );\r
+    \r
+}\r
+\r
+- (void)switchChannelUp:(BOOL)b_yesOrNo\r
+{\r
+    OSErr err;\r
+    AppleEvent ourAE = {typeNull, nil};\r
+    AEBuildError theBuildError;\r
+    const OSType eyetvSignature = 'EyTV';   /* carbon FOURCC style */\r
+    OSType eyetvCommand;\r
+    \r
+    if( b_yesOrNo == YES )\r
+    {\r
+        eyetvCommand = 'Chup';     /* same style */\r
+        msg_Dbg( VLCIntf, "telling eyetv to switch 1 channel up" );\r
+    }\r
+    else\r
+    {\r
+        eyetvCommand = 'Chdn';     /* same style again */\r
+        msg_Dbg( VLCIntf, "telling eyetv to switch 1 channel down" );\r
+    }\r
+    \r
+    err = AEBuildAppleEvent(\r
+                            /* EyeTV script suite */ eyetvSignature,\r
+                            /* command */ eyetvCommand,\r
+                            /* signature type */ typeApplSignature,\r
+                            /* signature */ &eyetvSignature,\r
+                            /* signature size */ sizeof(eyetvSignature),\r
+                            /* basic return id */ kAutoGenerateReturnID,\r
+                            /* generic transaction id */ kAnyTransactionID,\r
+                            /* to-be-created AE */ &ourAE,\r
+                            /* get some possible errors */ &theBuildError, \r
+                            /* got no params for now */ "" );\r
+    if( err != aeBuildSyntaxNoErr )\r
+    {\r
+        msg_Err( VLCIntf, "Error %i encountered while trying to the build the AE to launch eyetv.\n" \\r
+                 "additionally, the following info was returned: AEBuildErrorCode:%i at pos:%i", \r
+                 (int)err, theBuildError.fError, theBuildError.fErrorPos);\r
+        return;\r
+    }\r
+    else\r
+        msg_Dbg( VLCIntf, "AE created successfully, trying to send now" );\r
+    \r
+    err = AESendMessage(\r
+                        /* our AE */ &ourAE,\r
+                        /* no need for a response-AE */ NULL,\r
+                        /* we neither want a response nor user interaction */ kAENoReply | kAENeverInteract,\r
+                        /* we don't need a special time-out */ kAEDefaultTimeout );\r
+    if( err != noErr )\r
+        msg_Err( VLCIntf, "Error %i encountered while trying to tell EyeTV to switch channel", (int)err );\r
+    \r
+    err = AEDisposeDesc(&ourAE);\r
+}\r
+\r
+- (void)selectChannel: (int)theChannelNum\r
+{\r
+}\r
+\r
+- (int)getNumberOfChannels\r
+{\r
+    return 2;\r
+}\r
+\r
+- (NSString *)getNameOfChannel: (int)theChannelNum\r
+{\r
+    return @"dummy name";\r
+}\r
+\r
+@end\r