diff options
author | dynaflash <[email protected]> | 2010-07-17 19:15:38 +0000 |
---|---|---|
committer | dynaflash <[email protected]> | 2010-07-17 19:15:38 +0000 |
commit | 3c92cad4fe545eb2159cbb576c57f8e3d1ee6bb5 (patch) | |
tree | d50dbdec016ab17e85074e4871ac8ee8ad1207ab /macosx/HBQueueController.mm | |
parent | b790213069b3320fe94e8de0c3301877ed57ea6b (diff) |
MacGui: Initial implementation of new queue sync code which allows multi-instance encoding.
This allows more than one instances of HandBrake.app to run off of the same queue file.
In the case of multi-instance use these changes occur in the queue window:
- The delete icon for a given queue item does not exist in the queue window if another instance is doing the encoding.
- The encoding icon does not spin if another instance is doing the encoding.
- As before if the queue window is for the instance doing the encoding on that item it will be animated and "spins".
- The queue window status readout now also includes the output file name for the file being encoded for that instance.
Known bugs:
- Drag and Drop queue reordering is somwehat borked. Doesn't corrupt queue but can not allow a drop in some instances.
- I have tested this over 20 multi instance encodes and not once had an issue, but anytime more than one instance is writing to the same external file anything can happen. Beware!
- The session activity log will of course be full of activity log info from all instances in a multi instance scenario. Individual encode logs are unaffected.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3443 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBQueueController.mm')
-rw-r--r-- | macosx/HBQueueController.mm | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/macosx/HBQueueController.mm b/macosx/HBQueueController.mm index 856f10fd6..451d96ee0 100644 --- a/macosx/HBQueueController.mm +++ b/macosx/HBQueueController.mm @@ -109,7 +109,8 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe nil]]; fJobGroups = [[NSMutableArray arrayWithCapacity:0] retain]; - } + } + return self; } @@ -118,14 +119,13 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe [fJobGroups setArray:QueueFileArray]; fIsDragging = NO; /* First stop any timer working now */ - [self stopAnimatingCurrentJobGroupInQueue]; + //[self stopAnimatingCurrentJobGroupInQueue]; [fOutlineView reloadData]; /* lets get the stats on the status of the queue array */ - fEncodingQueueItem = 0; fPendingCount = 0; fCompletedCount = 0; fCanceledCount = 0; @@ -138,11 +138,11 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe * 2 == is yet to be encoded * 3 == cancelled */ - int i = 0; + NSDictionary *thisQueueDict = nil; for(id tempObject in fJobGroups) { - NSDictionary *thisQueueDict = tempObject; + thisQueueDict = tempObject; if ([[thisQueueDict objectForKey:@"Status"] intValue] == 0) // Completed { fCompletedCount++; @@ -150,7 +150,11 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe if ([[thisQueueDict objectForKey:@"Status"] intValue] == 1) // being encoded { fWorkingCount++; - fEncodingQueueItem = i; + /* we have an encoding job so, lets start the animation timer */ + if ([thisQueueDict objectForKey:@"EncodingPID"] && [[thisQueueDict objectForKey:@"EncodingPID"] intValue] == pidNum) + { + fEncodingQueueItem = i; + } } if ([[thisQueueDict objectForKey:@"Status"] intValue] == 2) // pending { @@ -163,14 +167,6 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe i++; } - /* We should fire up the encoding timer here based on fWorkingCount */ - - if (fWorkingCount > 0) - { - /* we have an encoding job so, lets start the animation timer */ - [self startAnimatingCurrentWorkingEncodeInQueue]; - } - /* Set the queue status field in the queue window */ NSMutableString * string; if (fPendingCount == 1) @@ -184,6 +180,7 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe [fQueueCountField setStringValue:string]; } + /* This method sets the status string in the queue window * and is called from Controller.mm (fHBController) * instead of running another timer here polling libhb @@ -191,7 +188,9 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe */ - (void)setQueueStatusString: (NSString *)statusString { -[fProgressTextField setStringValue:statusString]; + + [fProgressTextField setStringValue:statusString]; + } //------------------------------------------------------------------------------------ @@ -227,6 +226,9 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe - (void)setHBController: (HBController *)controller { fHBController = controller; + /* Now get this pidnum from HBController */ + pidNum = [fHBController getThisHBInstancePID]; + [fHBController writeToActivityLog: "HBQueueController : My Pidnum is %d", pidNum]; } #pragma mark - @@ -238,6 +240,7 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe { [self showWindow:sender]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"QueueWindowIsOpen"]; + [self startAnimatingCurrentWorkingEncodeInQueue]; } @@ -252,7 +255,6 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe if( ![[self window] setFrameUsingName:@"Queue"] ) [[self window] center]; [self setWindowFrameAutosaveName:@"Queue"]; - //[[self window] setExcludedFromWindowsMenu:YES]; /* lets setup our queue list outline view for drag and drop here */ [fOutlineView registerForDraggedTypes: [NSArray arrayWithObject:DragDropSimplePboardType] ]; @@ -273,9 +275,7 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe // Show/hide UI elements fCurrentJobPaneShown = NO; // it's shown in the nib - //[self showCurrentJobPane:NO]; - //[self updateQueueCountField]; } @@ -285,6 +285,7 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe - (void)windowWillClose:(NSNotification *)aNotification { [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"QueueWindowIsOpen"]; + [self stopAnimatingCurrentJobGroupInQueue]; } #pragma mark Toolbar @@ -507,7 +508,7 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe } else { - /* since we are not a currently encoding item, we can just be cancelled */ + /* since we are not a currently encoding item, we can just be removed */ [fHBController removeQueueFileItem:row]; } } @@ -520,19 +521,19 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe * In this case, we are paused from the calling window, so calling * [fHBController Pause:NULL]; Again will resume encoding */ - [fHBController Pause:NULL]; + [fHBController Pause:NULL]; if (returnCode == NSAlertOtherReturn) { - /* We need to save the currently encoding item number first */ - int encodingItemToRemove = fEncodingQueueItem; - /* Since we are encoding, we need to let fHBController Cancel this job - * upon which it will move to the next one if there is one - */ - [fHBController doCancelCurrentJob]; - /* Now, we can go ahead and remove the job we just cancelled since - * we have its item number from above - */ - [fHBController removeQueueFileItem:encodingItemToRemove]; + /* We need to save the currently encoding item number first */ + int encodingItemToRemove = fEncodingQueueItem; + /* Since we are encoding, we need to let fHBController Cancel this job + * upon which it will move to the next one if there is one + */ + [fHBController doCancelCurrentJob]; + /* Now, we can go ahead and remove the job we just cancelled since + * we have its item number from above + */ + [fHBController removeQueueFileItem:encodingItemToRemove]; } } @@ -676,7 +677,7 @@ static NSString* HBQueuePauseResumeToolbarIdentifier = @"HBQueuePauseRe } } - +/* We need to make sure we denote only working encodes even for multiple instances */ - (void) animateWorkingEncodeIconInQueue { NSInteger row = fEncodingQueueItem; /// need to set to fEncodingQueueItem @@ -959,9 +960,6 @@ return ![(HBQueueOutlineView*)outlineView isDragging]; - (id)outlineView:(NSOutlineView *)fOutlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { - // nb: The "desc" column is currently an HBImageAndTextCell. However, we are longer - // using the image portion of the cell so we could switch back to a regular NSTextFieldCell. - if ([[tableColumn identifier] isEqualToString:@"desc"]) { @@ -996,7 +994,6 @@ return ![(HBQueueOutlineView*)outlineView isDragging]; nil]; /* First line, we should strip the destination path and just show the file name and add the title num and chapters (if any) */ - //finalDescription = [finalDescription stringByAppendingString:[NSString stringWithFormat:@"Source: %@ Output: %@\n", [item objectForKey:@"SourceName"],[item objectForKey:@"DestinationPath"]]]; NSString * summaryInfo; NSString * titleString = [NSString stringWithFormat:@"Title %d", [[item objectForKey:@"TitleNumber"] intValue]]; @@ -1448,7 +1445,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging]; return @""; } } - +/* This method inserts the proper action icons into the far right of the queue window */ - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([[tableColumn identifier] isEqualToString:@"desc"]) @@ -1465,7 +1462,8 @@ return ![(HBQueueOutlineView*)outlineView isDragging]; { [cell setEnabled: YES]; BOOL highlighted = [outlineView isRowSelected:[outlineView rowForItem: item]] && [[outlineView window] isKeyWindow] && ([[outlineView window] firstResponder] == outlineView); - if ([[item objectForKey:@"Status"] intValue] == 0) + + if ([[item objectForKey:@"Status"] intValue] == 0 || ([[item objectForKey:@"Status"] intValue] == 1 && [[item objectForKey:@"EncodingPID"] intValue] != pidNum)) { [cell setAction: @selector(revealSelectedQueueItem:)]; if (highlighted) @@ -1478,21 +1476,23 @@ return ![(HBQueueOutlineView*)outlineView isDragging]; } else { - [cell setAction: @selector(removeSelectedQueueItem:)]; - if (highlighted) - { - [cell setImage:[NSImage imageNamed:@"DeleteHighlight"]]; - [cell setAlternateImage:[NSImage imageNamed:@"DeleteHighlightPressed"]]; - } - else - [cell setImage:[NSImage imageNamed:@"Delete"]]; + + [cell setAction: @selector(removeSelectedQueueItem:)]; + if (highlighted) + { + [cell setImage:[NSImage imageNamed:@"DeleteHighlight"]]; + [cell setAlternateImage:[NSImage imageNamed:@"DeleteHighlightPressed"]]; + } + else + [cell setImage:[NSImage imageNamed:@"Delete"]]; + } } } - (void)outlineView:(NSOutlineView *)outlineView willDisplayOutlineCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { - // By default, the discolsure image gets centered vertically in the cell. We want + // By default, the disclosure image gets centered vertically in the cell. We want // always at the top. if ([outlineView isItemExpanded: item]) [cell setImagePosition: NSImageAbove]; |