eyetv.m
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2. * eyetv.m: small class to control the notification parts of the EyeTV plugin
  3. *****************************************************************************
  4. * Copyright (C) 2006-2007 the VideoLAN team
  5. * $Id: 8220a7159ab489e7a1412d83fb4c3907aeed8f95 $
  6. *
  7. * Authors: Felix Kühne <fkuehne at videolan dot org>
  8. *                Damien Fouilleul <damienf 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. #import "eyetv.h"
  25. /* for apple event interaction [carbon] */
  26. //#import <Foundation/NSAppleScript>
  27. /* for various VLC core related calls */
  28. #import "intf.h"
  29. @implementation VLCEyeTVController
  30. static VLCEyeTVController *_o_sharedInstance = nil;
  31. + (VLCEyeTVController *)sharedInstance
  32. {
  33.     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
  34. }
  35. - (id)init 
  36. {
  37.     if (_o_sharedInstance) {
  38.         [self dealloc];
  39.     } else {
  40.         _o_sharedInstance = [super init];
  41.         [[NSDistributedNotificationCenter defaultCenter]
  42.                     addObserver: self
  43.                        selector: @selector(globalNotificationReceived:)
  44.                            name: NULL
  45.                          object: @"VLCEyeTVSupport"
  46.              suspensionBehavior: NSNotificationSuspensionBehaviorDeliverImmediately];
  47.     }
  48.     
  49.     return _o_sharedInstance;
  50. }
  51. - (void)globalNotificationReceived: (NSNotification *)theNotification
  52. {
  53.     msg_Dbg( VLCIntf, "notification received in VLC with name %s and object %s",
  54.              [[theNotification name] UTF8String], [[theNotification object] UTF8String] );
  55.     /* update our info on the used device */
  56.     if( [[theNotification name] isEqualToString: @"DeviceAdded"] )
  57.         b_deviceConnected = YES;
  58.     if( [[theNotification name] isEqualToString: @"DeviceRemoved"] )
  59.         b_deviceConnected = NO;
  60.     /* is eyetv running? */
  61.     if( [[theNotification name] isEqualToString: @"PluginInit"] )
  62.         b_eyeTVactive = YES;
  63.     if( [[theNotification name] isEqualToString: @"PluginQuit"] )
  64.         b_eyeTVactive = NO;
  65. }
  66. - (BOOL)isEyeTVrunning
  67. {
  68.     return b_eyeTVactive;
  69. }
  70. - (BOOL)isDeviceConnected
  71. {
  72.     return b_deviceConnected;
  73. }
  74. - (void)launchEyeTV
  75. {
  76.     NSAppleScript *script = [[NSAppleScript alloc] initWithSource:
  77.                 @"tell application "EyeTV"n"
  78.                    "launch with server moden"
  79.                  "end tell"];
  80.     NSDictionary *errorDict;
  81.     NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&errorDict];
  82.     if( nil == descriptor ) 
  83.     {
  84.         NSString *errorString = [errorDict objectForKey:NSAppleScriptErrorMessage];
  85.         msg_Err( VLCIntf, "opening EyeTV failed with error status '%s'", [errorString UTF8String] );
  86.     }
  87.     [script release];
  88. }
  89. - (int)currentChannel
  90. {
  91.     int currentChannel = 0;
  92.     NSAppleScript *script = [[NSAppleScript alloc] initWithSource:
  93.             @"tell application "EyeTV" to get current channel"];
  94.     NSDictionary *errorDict;
  95.     NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&errorDict];
  96.     if( nil == descriptor ) 
  97.     {
  98.         NSString *errorString = [errorDict objectForKey:NSAppleScriptErrorMessage];
  99.         msg_Err( VLCIntf, "EyeTV channel inventory failed with error status '%s'", [errorString UTF8String] );
  100.     }
  101.     else
  102.     {
  103.         currentChannel = (int)[descriptor int32Value];
  104.     }
  105.     [script release];
  106.     return currentChannel;
  107. }
  108. - (int)switchChannelUp:(BOOL)b_yesOrNo
  109. {
  110.     int currentChannel = 0;
  111.     NSAppleScript *script;
  112.     NSDictionary *errorDict;
  113.     NSAppleEventDescriptor *descriptor;
  114.     if( b_yesOrNo == YES )
  115.     {
  116.         script = [[NSAppleScript alloc] initWithSource:
  117.                     @"tell application "EyeTV"n"
  118.                        "channel_upn"
  119.                        "get current channeln"
  120.                      "end tell"];
  121.         msg_Dbg( VLCIntf, "telling eyetv to switch 1 channel up" );
  122.     }
  123.     else
  124.     {
  125.         script = [[NSAppleScript alloc] initWithSource:
  126.                     @"tell application "EyeTV"n"
  127.                        "channel_downn"
  128.                        "get current channeln"
  129.                      "end tell"];
  130.         msg_Dbg( VLCIntf, "telling eyetv to switch 1 channel down" );
  131.     }
  132.     
  133.     descriptor = [script executeAndReturnError:&errorDict];
  134.     if( nil == descriptor ) 
  135.     {
  136.         NSString *errorString = [errorDict objectForKey:NSAppleScriptErrorMessage];
  137.         msg_Err( VLCIntf, "EyeTV channel change failed with error status '%s'", [errorString UTF8String] );
  138.     }
  139.     else
  140.     {
  141.         currentChannel = (int)[descriptor int32Value];
  142.     }
  143.     [script release];
  144.     return currentChannel;
  145. }
  146. - (void)selectChannel: (int)theChannelNum
  147. {
  148.     NSAppleScript *script;
  149.     switch( theChannelNum )
  150.     {
  151.         case -2: // Composite
  152.             script = [[NSAppleScript alloc] initWithSource:
  153.                         @"tell application "EyeTV"n"
  154.                          "  input_change input source composite video inputn"
  155.                          "  show player_windown"
  156.                          "end tell"];
  157.             break;
  158.         case -1: // S-Video
  159.             script = [[NSAppleScript alloc] initWithSource:
  160.                         @"tell application "EyeTV"n"
  161.                          "  input_change input source S video inputn"
  162.                          "  show player_windown"
  163.                          "end tell"];
  164.             break;
  165.         case 0: // Last
  166.             script = [[NSAppleScript alloc] initWithSource:
  167.                         @"tell application "EyeTV"n"
  168.                          "  show player_windown"
  169.                          "end tell"];
  170.             break;
  171.         default:
  172.             if( theChannelNum > 0 )
  173.             {
  174.                 NSString *channel_change = [NSString stringWithFormat:
  175.                     @"tell application "EyeTV"n"
  176.                      "  channel_change channel number %dn"
  177.                      "  show player_windown"
  178.                      "end tell", theChannelNum];
  179.                 script = [[NSAppleScript alloc] initWithSource:channel_change];
  180.             }
  181.             else
  182.                 return;
  183.     }
  184.     NSDictionary *errorDict;
  185.     NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&errorDict];
  186.     if( nil == descriptor ) 
  187.     {
  188.         NSString *errorString = [errorDict objectForKey:NSAppleScriptErrorMessage];
  189.         msg_Err( VLCIntf, "EyeTV source change failed with error status '%s'", [errorString UTF8String] );
  190.     }
  191.     [script release];
  192. }
  193. - (NSEnumerator *)allChannels
  194. {
  195.     NSEnumerator *channels = nil;
  196.     NSAppleScript *script = [[NSAppleScript alloc] initWithSource:
  197.             @"tell application "EyeTV" to get name of every channel"];
  198.     NSDictionary *errorDict;
  199.     NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&errorDict];
  200.     if( nil == descriptor ) 
  201.     {
  202.         NSString *errorString = [errorDict objectForKey:NSAppleScriptErrorMessage];
  203.         msg_Err( VLCIntf, "EyeTV channel inventory failed with error status '%s'", [errorString UTF8String] );
  204.     }
  205.     else
  206.     {
  207.         int count = [descriptor numberOfItems];
  208.         int x=0; 
  209.         NSMutableArray *channelArray = [NSMutableArray arrayWithCapacity:count];
  210.         while( x++ < count ) {
  211.             [channelArray addObject:[[descriptor descriptorAtIndex:x] stringValue]];
  212.         }
  213.         channels = [channelArray objectEnumerator];
  214.     }
  215.     [script release];
  216.     return channels;
  217. }
  218. @end