]> granicus.if.org Git - handbrake/commitdiff
MacGui: fix HBJob copy method, plus small performance optimisation in HBAudio and...
authorDamiano Galassi <damiog@gmail.com>
Wed, 2 Nov 2016 19:13:37 +0000 (20:13 +0100)
committerDamiano Galassi <damiog@gmail.com>
Wed, 2 Nov 2016 19:13:37 +0000 (20:13 +0100)
macosx/HBAudio.h
macosx/HBAudio.m
macosx/HBJob.m
macosx/HBSubtitles.h
macosx/HBSubtitles.m

index aaaf076edc8e9558ee15ea7383e23c98cf04894f..899c8dc88c7a6b79cb330d05efe5c53156e0af65 100644 (file)
@@ -16,7 +16,7 @@ extern NSString *HBAudioChangedNotification;
 
 @interface HBAudio : NSObject <NSSecureCoding, NSCopying>
 
-@property (nonatomic, readonly) NSMutableArray<NSDictionary *> *sourceTracks;
+@property (nonatomic, readonly) NSArray<NSDictionary *> *sourceTracks;
 @property (nonatomic, readonly) NSMutableArray<HBAudioTrack *> *tracks;
 
 @property (nonatomic, readwrite) HBAudioDefaults *defaults;
index 7d92c5942796299c52310ad4f652947ca2b42272..20862938c9da75a631ac079cb5283f6a53e07423 100644 (file)
@@ -39,13 +39,14 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
         _job = job;
         _container = HB_MUX_MP4;
 
-        _sourceTracks = [job.title.audioTracks mutableCopy];
         _tracks = [[NSMutableArray alloc] init];
         _defaults = [[HBAudioDefaults alloc] init];
 
         // Add the none and foreign track to the source array
+        NSMutableArray *sourceTracks = [job.title.audioTracks mutableCopy];
         NSDictionary *none = @{keyAudioTrackName: NSLocalizedString(@"None", nil)};
-        [_sourceTracks insertObject:none atIndex:0];
+        [sourceTracks insertObject:none atIndex:0];
+        _sourceTracks = [sourceTracks copy];
     }
     return self;
 }
@@ -96,10 +97,7 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
 
 - (void)addAllTracks
 {
-    while (self.countOfTracks)
-    {
-        [self removeObjectFromTracksAtIndex:0];
-    }
+    [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
 
     // Add the remainings tracks
     for (NSUInteger idx = 1; idx < self.sourceTracksArray.count; idx++) {
@@ -111,10 +109,7 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
 
 - (void)removeAll
 {
-    while (self.countOfTracks)
-    {
-        [self removeObjectFromTracksAtIndex:0];
-    }
+    [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
     [self addNoneTrack];
 }
 
@@ -185,16 +180,14 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
 
 - (void)addDefaultTracksFromJobSettings:(NSDictionary *)settings
 {
-    NSArray<NSDictionary<NSString *, id> *> *tracks = settings[@"Audio"][@"AudioList"];
+    NSMutableArray<HBAudioTrack *> *tracks = [NSMutableArray array];
+    NSArray<NSDictionary<NSString *, id> *> *settingsTracks = settings[@"Audio"][@"AudioList"];
 
     // Reinitialize the configured list of audio tracks
-    while (self.countOfTracks)
-    {
-        [self removeObjectFromTracksAtIndex:0];
-    }
+    [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
 
     // Add the tracks
-    for (NSDictionary *trackDict in tracks)
+    for (NSDictionary *trackDict in settingsTracks)
     {
         HBAudioTrack *track = [self trackFromSourceTrackIndex:[trackDict[@"Track"] unsignedIntegerValue] + 1];
 
@@ -213,26 +206,25 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
         track.bitRate = [trackDict[@"Bitrate"] intValue];
         track.encoder = hb_audio_encoder_get_from_name([trackDict[@"Encoder"] UTF8String]);
 
-        [self insertObject:track inTracksAtIndex:[self countOfTracks]];
+        [tracks addObject:track];
     }
 
+    [self insertTracks:tracks atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, tracks.count)]];
+
     // Add an None item
     [self addNoneTrack];
 }
 
 - (BOOL)anyCodecMatches:(int)codec
 {
-    BOOL retval = NO;
-    NSUInteger audioArrayCount = [self countOfTracks];
-    for (NSUInteger i = 0; i < audioArrayCount && !retval; i++)
+    for (HBAudioTrack *track in self.tracks)
     {
-        HBAudioTrack *anAudio = [self objectInTracksAtIndex: i];
-        if (anAudio.isEnabled && codec == anAudio.encoder)
+        if (track.isEnabled && codec == track.encoder)
         {
-            retval = YES;
+            return YES;
         }
     }
-    return retval;
+    return NO;
 }
 
 #pragma mark -
@@ -337,6 +329,12 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
     [self.tracks insertObject:track atIndex:index];
 }
 
+- (void)insertTracks:(NSArray<HBAudioTrack *> *)array atIndexes:(NSIndexSet *)indexes
+{
+    [[self.undo prepareWithInvocationTarget:self] removeTracksAtIndexes:indexes];
+    [self.tracks insertObjects:array atIndexes:indexes];
+}
+
 - (void)removeObjectFromTracksAtIndex:(NSUInteger)index
 {
     HBAudioTrack *track = self.tracks[index];
@@ -344,4 +342,11 @@ NSString *HBAudioChangedNotification = @"HBAudioChangedNotification";
     [self.tracks removeObjectAtIndex:index];
 }
 
+- (void)removeTracksAtIndexes:(NSIndexSet *)indexes
+{
+    NSArray<HBAudioTrack *> *tracks = [self.tracks objectsAtIndexes:indexes];
+    [[self.undo prepareWithInvocationTarget:self] insertTracks:tracks atIndexes:indexes];
+    [self.tracks removeObjectsAtIndexes:indexes];
+}
+
 @end
index 483735d33fcd2e69f2e279d6f8d6fb670c12faf7..e3d608a9ac5e8b006c2c704694aead261e4c01f9 100644 (file)
@@ -222,7 +222,9 @@ NSString *HBChaptersChangedNotification  = @"HBChaptersChangedNotification";
         copy->_video.job = copy;
 
         copy->_audio = [_audio copy];
+        copy->_audio.job = copy;
         copy->_subtitles = [_subtitles copy];
+        copy->_subtitles.job = copy;
 
         copy->_chaptersEnabled = _chaptersEnabled;
         copy->_chapterTitles = [[NSArray alloc] initWithArray:_chapterTitles copyItems:YES];
index 0d5d87a3067da60768cff18879b6f99dd9b2b47b..562052890a96e3c1f1f67aab9f2e98d03e94342e 100644 (file)
@@ -20,7 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)addSrtTrackFromURL:(NSURL *)srtURL;
 
-@property (nonatomic, readonly) NSMutableArray<NSDictionary *> *sourceTracks;
+@property (nonatomic, readonly) NSArray<NSDictionary *> *sourceTracks;
 @property (nonatomic, readonly) NSMutableArray<HBSubtitlesTrack *> *tracks;
 
 @property (nonatomic, readwrite, strong) HBSubtitlesDefaults *defaults;
index 024d30dcfe2307ab0c29a4d32f416d11def57106..985390205df2b237b6a7a9efbd7736ccba4227d0 100644 (file)
@@ -28,6 +28,8 @@ extern NSString *keySubTrackSrtFileURL;
 
 @interface HBSubtitles () <HBTrackDataSource, HBTrackDelegate>
 
+@property (nonatomic, readwrite) NSArray<NSDictionary *> *sourceTracks;
+
 @property (nonatomic, readwrite, weak) HBJob *job;
 @property (nonatomic, readwrite) int container;
 
@@ -43,13 +45,14 @@ extern NSString *keySubTrackSrtFileURL;
     self = [super init];
     if (self)
     {
-        job = job;
+        _job = job;
         _container = HB_MUX_MP4;
 
-        _sourceTracks = [job.title.subtitlesTracks mutableCopy];
         _tracks = [[NSMutableArray alloc] init];
         _defaults = [[HBSubtitlesDefaults alloc] init];
 
+        NSMutableArray *sourceTracks = [job.title.subtitlesTracks mutableCopy];
+
         NSMutableSet<NSString *> *forcedSourceNamesArray = [NSMutableSet set];
         int foreignAudioType = VOBSUB;
         for (NSDictionary *dict in _sourceTracks)
@@ -78,11 +81,13 @@ extern NSString *keySubTrackSrtFileURL;
 
         // Add the none and foreign track to the source array
         NSDictionary *none = @{  keySubTrackName: NSLocalizedString(@"None", nil)};
-        [_sourceTracks insertObject:none atIndex:0];
+        [sourceTracks insertObject:none atIndex:0];
 
         NSDictionary *foreign = @{ keySubTrackName: foreignAudioSearchTrackName,
                                    keySubTrackType: @(foreignAudioType) };
-        [_sourceTracks insertObject:foreign atIndex:1];
+        [sourceTracks insertObject:foreign atIndex:1];
+
+        _sourceTracks = [sourceTracks copy];
 
     }
     return self;
@@ -186,10 +191,7 @@ extern NSString *keySubTrackSrtFileURL;
 
 - (void)addAllTracks
 {
-    while (self.countOfTracks)
-    {
-        [self removeObjectFromTracksAtIndex:0];
-    }
+    [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
 
     // Add the remainings tracks
     for (NSUInteger idx = 1; idx < self.sourceTracksArray.count; idx++) {
@@ -202,10 +204,7 @@ extern NSString *keySubTrackSrtFileURL;
 
 - (void)removeAll
 {
-    while (self.countOfTracks)
-    {
-        [self removeObjectFromTracksAtIndex:0];
-    }
+    [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
     [self addNoneTrack];
 }
 
@@ -217,9 +216,11 @@ extern NSString *keySubTrackSrtFileURL;
 - (void)addSrtTrackFromURL:(NSURL *)srtURL
 {
     // Create a new entry for the subtitle source array so it shows up in our subtitle source list
-    [self.sourceTracks addObject:@{keySubTrackName: srtURL.lastPathComponent,
+    NSMutableArray *sourceTrack = [self.sourceTracks mutableCopy];
+    [sourceTrack addObject:@{keySubTrackName: srtURL.lastPathComponent,
                                    keySubTrackType: @(SRTSUB),
                                    keySubTrackSrtFileURL: srtURL}];
+    self.sourceTracks = sourceTrack;
     HBSubtitlesTrack *track = [self trackFromSourceTrackIndex:self.sourceTracksArray.count - 1];
     [self insertObject:track inTracksAtIndex:[self countOfTracks] - 1];
 }
@@ -284,14 +285,12 @@ extern NSString *keySubTrackSrtFileURL;
 
 - (void)addDefaultTracksFromJobSettings:(NSDictionary *)settings
 {
-    NSArray<NSDictionary<NSString *, id> *> *tracks = settings[@"Subtitle"][@"SubtitleList"];
+    NSMutableArray<HBSubtitlesTrack *> *tracks = [NSMutableArray array];
+    NSArray<NSDictionary<NSString *, id> *> *settingsTracks = settings[@"Subtitle"][@"SubtitleList"];
     NSDictionary<NSString *, id> *search = settings[@"Subtitle"][@"Search"];
 
     // Reinitialize the configured list of audio tracks
-    while (self.countOfTracks)
-    {
-        [self removeObjectFromTracksAtIndex:0];
-    }
+    [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
 
     // Add the foreign audio search pass
     if ([search[@"Enable"] boolValue])
@@ -301,20 +300,22 @@ extern NSString *keySubTrackSrtFileURL;
         track.burnedIn = [search[@"Burn"] boolValue];
         track.forcedOnly = [search[@"Forced"] boolValue];
 
-        [self addTrack:track];
+        [tracks addObject:track];
     }
 
     // Add the tracks
-    for (NSDictionary *trackDict in tracks)
+    for (NSDictionary *trackDict in settingsTracks)
     {
         HBSubtitlesTrack *track = [self trackFromSourceTrackIndex:[trackDict[@"Track"] unsignedIntegerValue] + 2];
 
         track.burnedIn = [trackDict[@"Burn"] boolValue];
         track.forcedOnly = [trackDict[@"Forced"] boolValue];
 
-        [self addTrack:track];
+        [tracks addObject:track];
     }
 
+    [self insertTracks:tracks atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, tracks.count)]];
+
     // Add an None item
     [self addNoneTrack];
 }
@@ -488,6 +489,12 @@ extern NSString *keySubTrackSrtFileURL;
     [self.tracks insertObject:track atIndex:index];
 }
 
+- (void)insertTracks:(NSArray<HBSubtitlesTrack *> *)array atIndexes:(NSIndexSet *)indexes
+{
+    [[self.undo prepareWithInvocationTarget:self] removeTracksAtIndexes:indexes];
+    [self.tracks insertObjects:array atIndexes:indexes];
+}
+
 - (void)removeObjectFromTracksAtIndex:(NSUInteger)index
 {
     HBSubtitlesTrack *track = self.tracks[index];
@@ -495,4 +502,12 @@ extern NSString *keySubTrackSrtFileURL;
     [self.tracks removeObjectAtIndex:index];
 }
 
+- (void)removeTracksAtIndexes:(NSIndexSet *)indexes
+{
+    NSArray<HBSubtitlesTrack *> *tracks = [self.tracks objectsAtIndexes:indexes];
+    [[self.undo prepareWithInvocationTarget:self] insertTracks:tracks atIndexes:indexes];
+    [self.tracks removeObjectsAtIndexes:indexes];
+}
+
+
 @end