3 * Implementation of class HBCore.
9 // These constants specify the current state of HBCore.
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)
20 // These constants specify various status notifications sent by HBCore
22 /// Notification sent to update status while scanning. Matches HB_STATE_SCANNING constant in libhb.
23 NSString *HBCoreScanningNotification = @"HBCoreScanningNotification";
25 /// Notification sent after scanning is complete. Matches HB_STATE_SCANDONE constant in libhb.
26 NSString *HBCoreScanDoneNotification = @"HBCoreScanDoneNotification";
28 /// Notification sent to update status while encoding. Matches HB_STATE_WORKING constant in libhb.
29 NSString *HBCoreWorkingNotification = @"HBCoreWorkingNotification";
31 /// Notification sent when encoding is paused. Matches HB_STATE_PAUSED constant in libhb.
32 NSString *HBCorePausedNotification = @"HBCorePausedNotification";
34 /// Notification sent after encoding is complete. Matches HB_STATE_WORKDONE constant in libhb.
35 NSString *HBCoreWorkDoneNotification = @"HBCoreWorkDoneNotification";
37 /// Notification sent to update status while muxing. Matches HB_STATE_MUXING constant in libhb.
38 NSString *HBCoreMuxingNotification = @"HBCoreMuxingNotification";
41 * Private methods of HBCore.
43 @interface HBCore (Private)
44 - (NSString *)stateAsString:(int)stateValue;
47 @implementation HBCore
54 if (self = [super init])
57 hb_state = malloc(sizeof(struct hb_state_s));
72 * Opens low level HandBrake library. This should be called once before other
73 * functions HBCore are used.
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.
78 * @return YES if libhb was opened, NO if there was an error.
80 - (BOOL)openInDebugMode:(BOOL)debugMode checkForUpdates:(BOOL)checkForUpdates;
82 NSAssert(!hb_handle, @"[HBCore openInDebugMode:checkForUpdates:] libhb is already open");
88 hb_handle = hb_init(debugMode ? HB_DEBUG_ALL : HB_DEBUG_NONE, checkForUpdates);
92 updateTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5
94 selector:@selector(stateUpdateTimer:)
98 [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSEventTrackingRunLoopMode];
103 * Closes low level HandBrake library and releases resources.
105 * @return YES if libhb was closed successfully, NO if there was an error.
109 NSAssert(hb_handle, @"[HBCore close] libhb is not open");
113 [updateTimer invalidate];
114 [updateTimer release];
116 hb_close(&hb_handle);
122 * Removes all jobs from the queue.
125 - (void) removeAllJobs
128 while( ( job = hb_job( hb_handle, 0 ) ) )
129 hb_rem( hb_handle, job );
133 * Returns libhb handle used by this HBCore instance.
135 - (struct hb_handle_s *)hb_handle
141 * Returns current state of HBCore.
143 * @return One of the HBState* string constants.
145 - (const NSString *)state
151 * Returns latest hb_state_s information struct returned by libhb.
153 * @return Pointer to a hb_state_s struct containing state information of libhb.
155 - (const struct hb_state_s *)hb_state
162 @implementation HBCore (Private)
165 * Transforms a libhb state constant to a matching HBCore state constant.
167 - (const NSString *)stateAsString:(int)stateValue
173 case HB_STATE_SCANNING:
174 return HBStateScanning;
175 case HB_STATE_SCANDONE:
176 return HBStateScanDone;
177 case HB_STATE_WORKING:
178 return HBStateWorking;
179 case HB_STATE_PAUSED:
180 return HBStatePaused;
181 case HB_STATE_WORKDONE:
182 return HBStateWorkDone;
183 case HB_STATE_MUXING:
184 return HBStateMuxing;
186 NSAssert1(NO, @"[HBCore stateAsString:] unknown state %d", stateValue);
192 * This method polls libhb continuously for state changes and processes them.
193 * Additional processing for each state is performed in methods that start
194 * with 'handle' (e.g. handleHBStateScanning).
196 - (void)stateUpdateTimer:(NSTimer *)timer
200 // Libhb is not open so we cannot do anything.
204 hb_get_state(hb_handle, hb_state);
206 if (hb_state->state == HB_STATE_IDLE)
208 // Libhb reported HB_STATE_IDLE, so nothing interesting has happened.
212 // Update HBCore state to reflect the current state of libhb
213 NSString *newState = [self stateAsString:hb_state->state];
214 if (newState != state)
216 [self willChangeValueForKey:@"state"];
218 [self didChangeValueForKey:@"state"];
221 // Determine name of the method that does further processing for this state
223 SEL sel = NSSelectorFromString([NSString stringWithFormat:@"handle%@", state]);
224 if ([self respondsToSelector:sel])
225 [self performSelector:sel];
229 * Processes HBStateScanning state information. Current implementation just
230 * sends HBCoreScanningNotification.
232 - (void)handleHBStateScanning
234 [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreScanningNotification object:self];
238 * Processes HBStateScanDone state information. Current implementation just
239 * sends HBCoreScanDoneNotification.
241 - (void)handleHBStateScanDone
243 [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreScanDoneNotification object:self];
247 * Processes HBStateWorking state information. Current implementation just
248 * sends HBCoreWorkingNotification.
250 - (void)handleHBStateWorking
252 [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreWorkingNotification object:self];
256 * Processes HBStatePaused state information. Current implementation just
257 * sends HBCorePausedNotification.
259 - (void)handleHBStatePaused
261 [[NSNotificationCenter defaultCenter] postNotificationName:HBCorePausedNotification object:self];
265 * Processes HBStateWorkDone state information. Current implementation just
266 * sends HBCoreWorkDoneNotification.
268 - (void)handleHBStateWorkDone
270 [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreWorkDoneNotification object:self];
274 * Processes HBStateMuxing state information. Current implementation just
275 * sends HBCoreMuxingNotification.
277 - (void)handleHBStateMuxing
279 [[NSNotificationCenter defaultCenter] postNotificationName:HBCoreMuxingNotification object:self];