_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;
}
- (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++) {
- (void)removeAll
{
- while (self.countOfTracks)
- {
- [self removeObjectFromTracksAtIndex:0];
- }
+ [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
[self addNoneTrack];
}
- (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];
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 -
[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];
[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
@interface HBSubtitles () <HBTrackDataSource, HBTrackDelegate>
+@property (nonatomic, readwrite) NSArray<NSDictionary *> *sourceTracks;
+
@property (nonatomic, readwrite, weak) HBJob *job;
@property (nonatomic, readwrite) int container;
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)
// 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;
- (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++) {
- (void)removeAll
{
- while (self.countOfTracks)
- {
- [self removeObjectFromTracksAtIndex:0];
- }
+ [self removeTracksAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.tracks.count)]];
[self addNoneTrack];
}
- (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];
}
- (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])
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];
}
[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];
[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