nil]];
fJobGroups = [[NSMutableArray arrayWithCapacity:0] retain];
- }
+ }
+
return self;
}
[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;
* 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++;
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
{
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)
[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
*/
- (void)setQueueStatusString: (NSString *)statusString
{
-[fProgressTextField setStringValue:statusString];
+
+ [fProgressTextField setStringValue:statusString];
+
}
//------------------------------------------------------------------------------------
fHBController = controller;
}
+- (void)setPidNum: (int)myPidnum
+{
+ pidNum = myPidnum;
+ [fHBController writeToActivityLog: "HBQueueController : My Pidnum is %d", pidNum];
+}
+
#pragma mark -
//------------------------------------------------------------------------------------
{
[self showWindow:sender];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"QueueWindowIsOpen"];
+ [self startAnimatingCurrentWorkingEncodeInQueue];
}
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] ];
// Show/hide UI elements
fCurrentJobPaneShown = NO; // it's shown in the nib
- //[self showCurrentJobPane:NO];
- //[self updateQueueCountField];
}
- (void)windowWillClose:(NSNotification *)aNotification
{
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"QueueWindowIsOpen"];
+ [self stopAnimatingCurrentJobGroupInQueue];
}
#pragma mark Toolbar
}
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];
}
}
* 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];
}
}
}
}
-
+/* We need to make sure we denote only working encodes even for multiple instances */
- (void) animateWorkingEncodeIconInQueue
{
NSInteger row = fEncodingQueueItem; /// need to set to fEncodingQueueItem
}
/* check to see how many audio track lines to allow for */
- if ([[queueItemToCheck objectForKey:@"Audio1Track"] intValue] > 0)
- {
- itemHeightForDisplay += rowHeightNonTitle;
- }
- if ([[queueItemToCheck objectForKey:@"Audio2Track"] intValue] > 0)
- {
- itemHeightForDisplay += rowHeightNonTitle;
- }
- if ([[queueItemToCheck objectForKey:@"Audio3Track"] intValue] > 0)
- {
- itemHeightForDisplay += rowHeightNonTitle;
- }
- if ([[queueItemToCheck objectForKey:@"Audio4Track"] intValue] > 0)
- {
- itemHeightForDisplay += rowHeightNonTitle;
- }
+ unsigned int ourMaximumNumberOfAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+ int actualCountOfAudioTracks = 0;
+ for (unsigned int i = 1; i <= ourMaximumNumberOfAudioTracks; i++) {
+ if (0 < [[queueItemToCheck objectForKey: [NSString stringWithFormat: @"Audio%dTrack", i]] intValue]) {
+ actualCountOfAudioTracks++;
+ }
+ }
+ itemHeightForDisplay += (actualCountOfAudioTracks * rowHeightNonTitle);
/* add in subtitle lines for each subtitle in the SubtitleList array */
itemHeightForDisplay += rowHeightNonTitle * [[queueItemToCheck objectForKey:@"SubtitleList"] count];
- (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"])
{
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]];
[finalString appendString:[NSString stringWithFormat:@"%@\n", [item objectForKey:@"PresetName"]] withAttributes:detailAttr];
/* Third Line (Format Summary) */
- NSString * audioCodecSummary = @"";
+ NSString * audioCodecSummary = @""; // This seems to be set by the last track we have available...
/* Lets also get our audio track detail since we are going through the logic for use later */
- NSString * audioDetail1 = @"";
- NSString * audioDetail2 = @"";
- NSString * audioDetail3 = @"";
- NSString * audioDetail4 = @"";
- if ([[item objectForKey:@"Audio1Track"] intValue] > 0)
- {
- audioCodecSummary = [NSString stringWithFormat:@"%@", [item objectForKey:@"Audio1Encoder"]];
- audioDetail1 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
- [item objectForKey:@"Audio1TrackDescription"] ,
- [item objectForKey:@"Audio1Encoder"],
- [item objectForKey:@"Audio1Mixdown"] ,
- [item objectForKey:@"Audio1Samplerate"],
- [item objectForKey:@"Audio1Bitrate"]];
-
- if ([[item objectForKey:@"Audio1TrackDRCSlider"] floatValue] > 0.00)
- {
- audioDetail1 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail1,[item objectForKey:@"Audio1TrackDRCSlider"]];
- }
- else
- {
- audioDetail1 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail1];
- }
- }
-
- if ([[item objectForKey:@"Audio2Track"] intValue] > 0)
- {
- audioCodecSummary = [NSString stringWithFormat:@"%@, %@",audioCodecSummary ,[item objectForKey:@"Audio2Encoder"]];
- audioDetail2 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
- [item objectForKey:@"Audio2TrackDescription"] ,
- [item objectForKey:@"Audio2Encoder"],
- [item objectForKey:@"Audio2Mixdown"] ,
- [item objectForKey:@"Audio2Samplerate"],
- [item objectForKey:@"Audio2Bitrate"]];
-
- if ([[item objectForKey:@"Audio2TrackDRCSlider"] floatValue] > 0.00)
- {
- audioDetail2 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail2,[item objectForKey:@"Audio2TrackDRCSlider"]];
- }
- else
- {
- audioDetail2 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail2];
- }
- }
-
- if ([[item objectForKey:@"Audio3Track"] intValue] > 0)
- {
- audioCodecSummary = [NSString stringWithFormat:@"%@, %@",audioCodecSummary ,[item objectForKey:@"Audio3Encoder"]];
- audioDetail3 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
- [item objectForKey:@"Audio3TrackDescription"] ,
- [item objectForKey:@"Audio3Encoder"],
- [item objectForKey:@"Audio3Mixdown"] ,
- [item objectForKey:@"Audio3Samplerate"],
- [item objectForKey:@"Audio3Bitrate"]];
-
- if ([[item objectForKey:@"Audio3TrackDRCSlider"] floatValue] > 0.00)
- {
- audioDetail3 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail3,[item objectForKey:@"Audio3TrackDRCSlider"]];
- }
- else
- {
- audioDetail3 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail3];
- }
- }
+ unsigned int ourMaximumNumberOfAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+ NSMutableArray *audioDetails = [NSMutableArray arrayWithCapacity: ourMaximumNumberOfAudioTracks];
+ NSString *base;
+ NSString *detailString;
+ NSNumber *drc;
+ for (unsigned int i = 1; i <= ourMaximumNumberOfAudioTracks; i++) {
+ base = [NSString stringWithFormat: @"Audio%d", i];
+ if (0 < [[item objectForKey: [base stringByAppendingString: @"Track"]] intValue]) {
+ audioCodecSummary = [NSString stringWithFormat: @"%@", [item objectForKey: [base stringByAppendingString: @"Encoder"]]];
+ drc = [item objectForKey: [base stringByAppendingString: @"TrackDRCSlider"]];
+ detailString = [NSString stringWithFormat: @"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps), DRC: %@",
+ [item objectForKey: [base stringByAppendingString: @"TrackDescription"]],
+ [item objectForKey: [base stringByAppendingString: @"Encoder"]],
+ [item objectForKey: [base stringByAppendingString: @"Mixdown"]],
+ [item objectForKey: [base stringByAppendingString: @"Samplerate"]],
+ [item objectForKey: [base stringByAppendingString: @"Bitrate"]],
+ (0.0 < [drc floatValue]) ? drc : @"Off"
+ ];
+ [audioDetails addObject: detailString];
+ }
+ }
- if ([[item objectForKey:@"Audio4Track"] intValue] > 0)
- {
- audioCodecSummary = [NSString stringWithFormat:@"%@, %@",audioCodecSummary ,[item objectForKey:@"Audio3Encoder"]];
- audioDetail4 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
- [item objectForKey:@"Audio4TrackDescription"] ,
- [item objectForKey:@"Audio4Encoder"],
- [item objectForKey:@"Audio4Mixdown"] ,
- [item objectForKey:@"Audio4Samplerate"],
- [item objectForKey:@"Audio4Bitrate"]];
-
- if ([[item objectForKey:@"Audio4TrackDRCSlider"] floatValue] > 0.00)
- {
- audioDetail4 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail4,[item objectForKey:@"Audio4TrackDRCSlider"]];
- }
- else
- {
- audioDetail4 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail4];
- }
- }
NSString * jobFormatInfo;
if ([[item objectForKey:@"ChapterMarkers"] intValue] == 1)
[finalString appendString: @"Destination: " withAttributes:detailBoldAttr];
[finalString appendString: [item objectForKey:@"DestinationPath"] withAttributes:detailAttr];
[finalString appendString:@"\n" withAttributes:detailAttr];
+
/* Fifth Line Picture Details*/
NSString * pictureInfo;
pictureInfo = [NSString stringWithFormat:@"%@", [item objectForKey:@"PictureSizingSummary"]];
{
pictureInfo = [pictureInfo stringByAppendingString:@" Keep Aspect Ratio"];
}
+
if ([[item objectForKey:@"VideoGrayScale"] intValue] == 1)
{
pictureInfo = [pictureInfo stringByAppendingString:@", Grayscale"];
else
{
/* we have a specified, constant framerate */
+ if ([[item objectForKey:@"VideoFrameratePFR"] intValue] == 1)
+ {
+ videoInfo = [NSString stringWithFormat:@"%@ Framerate: %@ (peak framerate)", videoInfo ,[item objectForKey:@"VideoFramerate"]];
+ }
+ else
+ {
videoInfo = [NSString stringWithFormat:@"%@ Framerate: %@ (constant framerate)", videoInfo ,[item objectForKey:@"VideoFramerate"]];
+ }
}
if ([[item objectForKey:@"VideoQualityType"] intValue] == 0)// Target Size MB
/* Seventh Line Audio Details*/
- if ([audioDetail1 length] != 0)
- {
- [finalString appendString: @"Audio Track 1: " withAttributes:detailBoldAttr];
- [finalString appendString: audioDetail1 withAttributes:detailAttr];
- [finalString appendString:@"\n" withAttributes:detailAttr];
- }
-
- if ([audioDetail2 length] != 0)
- {
- [finalString appendString: @"Audio Track 2: " withAttributes:detailBoldAttr];
- [finalString appendString: audioDetail2 withAttributes:detailAttr];
- [finalString appendString:@"\n" withAttributes:detailAttr];
- }
-
- if ([audioDetail3 length] != 0)
- {
- [finalString appendString: @"Audio Track 3: " withAttributes:detailBoldAttr];
- [finalString appendString: audioDetail3 withAttributes:detailAttr];
- [finalString appendString:@"\n" withAttributes:detailAttr];
- }
-
- if ([audioDetail4 length] != 0)
- {
- [finalString appendString: @"Audio Track 4: " withAttributes:detailBoldAttr];
- [finalString appendString: audioDetail4 withAttributes:detailAttr];
- [finalString appendString:@"\n" withAttributes:detailAttr];
- }
+ NSEnumerator *audioDetailEnumerator = [audioDetails objectEnumerator];
+ NSString *anAudioDetail;
+ int audioDetailCount = 0;
+ while (nil != (anAudioDetail = [audioDetailEnumerator nextObject])) {
+ audioDetailCount++;
+ if (0 < [anAudioDetail length]) {
+ [finalString appendString: [NSString stringWithFormat: @"Audio Track %d ", audioDetailCount] withAttributes: detailBoldAttr];
+ [finalString appendString: anAudioDetail withAttributes: detailAttr];
+ [finalString appendString: @"\n" withAttributes: detailAttr];
+ }
+ }
+
/* Eighth Line Subtitle Details */
int i = 0;
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"])
{
[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)
}
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];