OSDN Git Service

MacGui: Make .m4v (Use iTunes Friendly Naming) default in preferences.
[handbrake-jp/handbrake-jp-git.git] / macosx / HBCore.m
1 /**
2  * @file
3  * Implementation of class HBCore.
4  */
5
6 #import "HBCore.h"
7 #include "hb.h"
8
9 // These constants specify the current state of HBCore.
10
11 const NSString *HBStateIdle = @"HBStateIdle";           ///< HB is doing nothing (HB_STATE_IDLE)
12 const NSString *HBStateScanning = @"HBStateScanning";   ///< HB is scanning (HB_STATE_SCANNING)
13 const NSString *HBStateScanDone = @"HBStateScanDone";   ///< Scanning has been completed (HB_STATE_SCANDONE)
14 const NSString *HBStateWorking = @"HBStateWorking";     ///< HB is encoding (HB_STATE_WORKING)
15 const NSString *HBStatePaused = @"HBStatePaused";       ///< Encoding is paused (HB_STATE_PAUSED)
16 const NSString *HBStateWorkDone = @"HBStateWorkDone";   ///< Encoding has been completed (HB_STATE_WORKDONE)
17 const NSString *HBStateMuxing = @"HBStateMuxing";       ///< HB is muxing (HB_STATE_MUXING)
18
19
20 // These constants specify various status notifications sent by HBCore
21
22 /// Notification sent to update status while scanning. Matches HB_STATE_SCANNING constant in libhb.
23 NSString *HBCoreScanningNotification = @"HBCoreScanningNotification";
24
25 /// Notification sent after scanning is complete. Matches HB_STATE_SCANDONE constant in libhb.
26 NSString *HBCoreScanDoneNotification = @"HBCoreScanDoneNotification";
27
28 /// Notification sent to update status while encoding. Matches HB_STATE_WORKING constant in libhb.
29 NSString *HBCoreWorkingNotification = @"HBCoreWorkingNotification";
30
31 /// Notification sent when encoding is paused. Matches HB_STATE_PAUSED constant in libhb.
32 NSString *HBCorePausedNotification = @"HBCorePausedNotification";
33
34 /// Notification sent after encoding is complete. Matches HB_STATE_WORKDONE constant in libhb.
35 NSString *HBCoreWorkDoneNotification = @"HBCoreWorkDoneNotification";
36
37 /// Notification sent to update status while muxing. Matches HB_STATE_MUXING constant in libhb.
38 NSString *HBCoreMuxingNotification = @"HBCoreMuxingNotification";
39
40 /**
41  * Private methods of HBCore.
42  */
43 @interface HBCore (Private)
44 - (NSString *)stateAsString:(int)stateValue;
45 @end
46
47 @implementation HBCore
48
49 /**
50  * Initializes HBCore.
51  */
52 - (id)init
53 {
54     if (self = [super init])
55     {
56         state = HBStateIdle;    
57         hb_state = malloc(sizeof(struct hb_state_s));   
58     }
59     return self;
60 }
61
62 /**
63  * Releases resources.
64  */
65 - (void)dealloc
66 {
67     free(hb_state);    
68     [super dealloc];
69 }
70
71 /**
72  * Opens low level HandBrake library. This should be called once before other
73  * functions HBCore are used.
74  *
75  * @param debugMode         If set to YES, libhb will print verbose debug output.
76  * @param checkForUpdates   If set to YES, libhb checks for updated versions.
77  *
78  * @return YES if libhb was opened, NO if there was an error.
79  */
80 - (BOOL)openInDebugMode:(BOOL)debugMode checkForUpdates:(BOOL)checkForUpdates;
81 {
82     NSAssert(!hb_handle, @"[HBCore openInDebugMode:checkForUpdates:] libhb is already open");
83     if (hb_handle)
84         return NO;
85
86     state = HBStateIdle;    
87
88     hb_handle = hb_init(debugMode ? HB_DEBUG_ALL : HB_DEBUG_NONE, checkForUpdates);
89     if (!hb_handle)
90         return NO;
91
92     updateTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2
93                                                     target:self
94                                                   selector:@selector(stateUpdateTimer:) 
95                                                   userInfo:NULL 
96                                                    repeats:YES] retain];
97
98     [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSModalPanelRunLoopMode];        
99     return YES;
100 }
101
102 /**
103  * Closes low level HandBrake library and releases resources.
104  *
105  * @return YES if libhb was closed successfully, NO if there was an error.
106  */
107 - (BOOL)close
108 {
109     NSAssert(hb_handle, @"[HBCore close] libhb is not open");
110     if (!hb_handle)
111         return NO;
112         
113     [updateTimer invalidate];
114     [updateTimer release];
115     updateTimer = nil;
116     hb_close(&hb_handle);
117     hb_handle = NULL;
118     return YES;
119 }
120
121 /**
122  * Returns libhb handle used by this HBCore instance.
123  */ 
124 - (struct hb_handle_s *)hb_handle
125 {
126     return hb_handle;
127 }
128
129 /**
130  * Returns current state of HBCore.
131  *
132  * @return One of the HBState* string constants.
133  */
134 - (const NSString *)state
135 {
136     return state;
137 }
138
139 /**
140  * Returns latest hb_state_s information struct returned by libhb.
141  *
142  * @return Pointer to a hb_state_s struct containing state information of libhb.
143  */
144 - (const struct hb_state_s *)hb_state
145 {
146     return hb_state;
147 }
148
149 @end 
150
151 @implementation HBCore (Private)
152
153 /**
154  * Transforms a libhb state constant to a matching HBCore state constant.
155  */
156 - (const NSString *)stateAsString:(int)stateValue
157 {
158     switch (stateValue)
159     {
160         case HB_STATE_IDLE:
161             return HBStateIdle;        
162         case HB_STATE_SCANNING:
163             return HBStateScanning;
164         case HB_STATE_SCANDONE:
165             return HBStateScanDone;
166         case HB_STATE_WORKING:
167             return HBStateWorking;
168         case HB_STATE_PAUSED:
169             return HBStatePaused;
170         case HB_STATE_WORKDONE:
171             return HBStateWorkDone;
172         case HB_STATE_MUXING:
173             return HBStateMuxing;        
174         default:
175             NSAssert1(NO, @"[HBCore stateAsString:] unknown state %d", stateValue);
176             return nil;
177     }
178 }
179
180 /**
181  * This method polls libhb continuously for state changes and processes them.
182  * Additional processing for each state is performed in methods that start
183  * with 'handle' (e.g. handleHBStateScanning).
184  */
185 - (void)stateUpdateTimer:(NSTimer *)timer
186 {
187     if (!hb_handle)
188     {
189         // Libhb is not open so we cannot do anything.
190         return;
191     }
192     hb_get_state(hb_handle, hb_state);
193
194     if (hb_state->state == HB_STATE_IDLE)
195     {
196         // Libhb reported HB_STATE_IDLE, so nothing interesting has happened.
197         return;
198     }
199         
200     // Update HBCore state to reflect the current state of libhb
201     NSString *newState = [self stateAsString:hb_state->state];
202     if (newState != state)
203     {
204         [self willChangeValueForKey:@"state"];
205         state = newState;
206         [self didChangeValueForKey:@"state"];
207     }
208
209     // Determine name of the method that does further processing for this state
210     // and call it. 
211     SEL sel = NSSelectorFromString([NSString stringWithFormat:@"handle%@", state]);
212     if ([self respondsToSelector:sel])
213         [self performSelector:sel];
214 }
215
216 /**
217  * Processes HBStateScanning state information. Current implementation just
218  * sends HBCoreScanningNotification.
219  */
220 - (void)handleHBStateScanning
221 {
222     [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreScanningNotification object:self];    
223 }
224
225 /**
226  * Processes HBStateScanDone state information. Current implementation just
227  * sends HBCoreScanDoneNotification.
228  */
229 - (void)handleHBStateScanDone
230 {
231     [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreScanDoneNotification object:self];    
232 }
233
234 /**
235  * Processes HBStateWorking state information. Current implementation just
236  * sends HBCoreWorkingNotification.
237  */
238 - (void)handleHBStateWorking
239 {
240     [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreWorkingNotification object:self];    
241 }
242
243 /**
244  * Processes HBStatePaused state information. Current implementation just
245  * sends HBCorePausedNotification.
246  */
247 - (void)handleHBStatePaused
248 {
249     [[NSNotificationCenter defaultCenter] postNotificationName:HBCorePausedNotification object:self];    
250 }
251
252 /**
253  * Processes HBStateWorkDone state information. Current implementation just
254  * sends HBCoreWorkDoneNotification.
255  */
256 - (void)handleHBStateWorkDone
257 {
258     [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreWorkDoneNotification object:self];    
259 }
260
261 /**
262  * Processes HBStateMuxing state information. Current implementation just
263  * sends HBCoreMuxingNotification.
264  */
265 - (void)handleHBStateMuxing
266 {
267     [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreMuxingNotification object:self];    
268 }
269
270 @end