diff options
author | ritsuka <[email protected]> | 2014-08-22 06:30:58 +0000 |
---|---|---|
committer | ritsuka <[email protected]> | 2014-08-22 06:30:58 +0000 |
commit | a13b937ba09ca5c29ef633114b0880a4f1213f0e (patch) | |
tree | ec065c3497235a60ddf03e1e87b9e6b362606f3f /macosx/HBAudioDefaults.m | |
parent | c27510750ff919f6e9343e82d1047fe5cb0ff68b (diff) |
MacGui: renamed HB*Settings classes to HB*Defaults. Added a “…” char to the “Configure Defaults” button.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6341 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBAudioDefaults.m')
-rw-r--r-- | macosx/HBAudioDefaults.m | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/macosx/HBAudioDefaults.m b/macosx/HBAudioDefaults.m new file mode 100644 index 000000000..304849d79 --- /dev/null +++ b/macosx/HBAudioDefaults.m @@ -0,0 +1,241 @@ +/* HBAudioSettings.m $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ + +#import "HBAudioDefaults.h" +#import "HBAudioTrackPreset.h" +#import "hb.h" +#import "lang.h" + +@interface HBAudioDefaults () + +@property (nonatomic, readwrite) int container; + +@end + +@implementation HBAudioDefaults + +- (instancetype)init +{ + self = [super init]; + if (self) { + _encoderFallback = HB_ACODEC_AC3; + _trackSelectionLanguages = [[NSMutableArray alloc] init]; + _tracksArray = [[NSMutableArray alloc] init]; + _trackSelectionBehavior = HBAudioTrackSelectionBehaviorFirst; + _container = HB_MUX_MKV; + } + return self; +} + +- (void)dealloc +{ + [_trackSelectionLanguages release]; + [_tracksArray release]; + [super dealloc]; +} + +- (NSArray *)audioEncoderFallbacks +{ + NSMutableArray *fallbacks = [[NSMutableArray alloc] init]; + for (const hb_encoder_t *audio_encoder = hb_audio_encoder_get_next(NULL); + audio_encoder != NULL; + audio_encoder = hb_audio_encoder_get_next(audio_encoder)) + { + if ((audio_encoder->codec & HB_ACODEC_PASS_FLAG) == 0 && + (audio_encoder->muxers & self.container)) + { + [fallbacks addObject:@(audio_encoder->name)]; + } + } + return [fallbacks autorelease]; +} + +- (NSString *)isoCodeForNativeLang:(NSString *)language +{ + const iso639_lang_t *lang = lang_get_next(NULL); + for (lang = lang_get_next(lang); lang != NULL; lang = lang_get_next(lang)) + { + NSString *nativeLanguage = strlen(lang->native_name) ? @(lang->native_name) : @(lang->eng_name); + + if ([language isEqualToString:nativeLanguage]) + { + return @(lang->iso639_2); + } + } + + return nil; +} + +- (void)applySettingsFromPreset:(NSDictionary *)preset +{ + // Track selection behavior + if ([preset[@"AudioTrackSelectionBehavior"] isEqualToString:@"first"]) + { + self.trackSelectionBehavior = HBAudioTrackSelectionBehaviorFirst; + } + else if ([preset[@"AudioTrackSelectionBehavior"] isEqualToString:@"all"]) + { + self.trackSelectionBehavior = HBAudioTrackSelectionBehaviorAll; + } + else if ([preset[@"AudioTrackSelectionBehavior"] isEqualToString:@"none"]) + { + self.trackSelectionBehavior = HBAudioTrackSelectionBehaviorNone; + } + else + { + // Keep the previous behavior for the old presets + self.trackSelectionBehavior = HBAudioTrackSelectionBehaviorFirst; + } + self.trackSelectionLanguages = [NSMutableArray arrayWithArray:preset[@"AudioLanguageList"]]; + + // If the preset is one of the built in, set some additional options + if ([preset[@"Type"] intValue] == 0) + { + self.trackSelectionBehavior = HBAudioTrackSelectionBehaviorFirst; + if (self.trackSelectionLanguages.count == 0) + { + if ([[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultLanguage"]) + { + NSString *lang = [self isoCodeForNativeLang:[[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultLanguage"]]; + if (lang) + { + [self.trackSelectionLanguages addObject:lang]; + } + } + if ([[NSUserDefaults standardUserDefaults] stringForKey:@"AlternateLanguage"]) + { + NSString *lang = [self isoCodeForNativeLang:[[NSUserDefaults standardUserDefaults] stringForKey:@"AlternateLanguage"]]; + if (lang) + { + [self.trackSelectionLanguages addObject:lang]; + } + } + } + } + + // Passthru settings + self.allowAACPassthru = [preset[@"AudioAllowAACPass"] boolValue]; + self.allowAC3Passthru = [preset[@"AudioAllowAC3Pass"] boolValue]; + self.allowDTSHDPassthru = [preset[@"AudioAllowDTSHDPass"] boolValue]; + self.allowDTSPassthru= [preset[@"AudioAllowDTSPass"] boolValue]; + self.allowMP3Passthru = [preset[@"AudioAllowMP3Pass"] boolValue]; + + self.secondaryEncoderMode = [preset[@"AudioSecondaryEncoderMode"] boolValue]; + + if (preset[@"AudioEncoderFallback"]) + { + // map legacy encoder names via libhb + const char *strValue = hb_audio_encoder_sanitize_name([preset[@"AudioEncoderFallback"] UTF8String]); + self.encoderFallback = hb_audio_encoder_get_from_name(strValue); + } + + for (NSDictionary *track in preset[@"AudioList"]) + { + HBAudioTrackPreset *newTrack = [[HBAudioTrackPreset alloc] init]; + if ([track[@"AudioEncoder"] isKindOfClass:[NSString class]]) + { + newTrack.encoder = hb_audio_encoder_get_from_name([track[@"AudioEncoder"] UTF8String]); + } + if ([track[@"AudioMixdown"] isKindOfClass:[NSString class]]) + { + newTrack.mixdown = hb_mixdown_get_from_name([track[@"AudioMixdown"] UTF8String]); + } + if ([track[@"AudioSamplerate"] isKindOfClass:[NSString class]]) + { + newTrack.sampleRate = hb_audio_samplerate_get_from_name([track[@"AudioSamplerate"] UTF8String]); + + // Set to "Auto" if we didn't find a valid sample rate. + if (newTrack.sampleRate == -1) + { + newTrack.sampleRate = 0; + } + } + newTrack.bitRate = [track[@"AudioBitrate"] intValue]; + + newTrack.drc = [track[@"AudioTrackDRCSlider"] floatValue]; + newTrack.gain = [track[@"AudioTrackGainSlider"] intValue]; + [self.tracksArray addObject:newTrack]; + [newTrack release]; + } +} + +- (void)prepareAudioForPreset:(NSMutableDictionary *)preset +{ + // Track selection behavior + if (self.trackSelectionBehavior == HBAudioTrackSelectionBehaviorFirst) + { + preset[@"AudioTrackSelectionBehavior"] = @"first"; + } + else if (self.trackSelectionBehavior == HBAudioTrackSelectionBehaviorAll) + { + preset[@"AudioTrackSelectionBehavior"] = @"all"; + } + else + { + preset[@"AudioTrackSelectionBehavior"] = @"none"; + } + preset[@"AudioLanguageList"] = self.trackSelectionLanguages; + + // Passthru settings + preset[@"AudioAllowAACPass"] = @(self.allowAACPassthru); + preset[@"AudioAllowAC3Pass"] = @(self.allowAC3Passthru); + preset[@"AudioAllowDTSHDPass"] = @(self.allowDTSHDPassthru); + preset[@"AudioAllowDTSPass"] = @(self.allowDTSPassthru); + preset[@"AudioAllowMP3Pass"] = @(self.allowMP3Passthru); + + preset[@"AudioEncoderFallback"] = @(hb_audio_encoder_get_name(self.encoderFallback)); + + preset[@"AudioSecondaryEncoderMode"] = @(self.secondaryEncoderMode); + + NSMutableArray *audioList = [[NSMutableArray alloc] init]; + + for (HBAudioTrackPreset *track in self.tracksArray) + { + NSString *sampleRate = @"Auto"; + if (hb_audio_samplerate_get_name(track.sampleRate)) + { + sampleRate = @(hb_audio_samplerate_get_name(track.sampleRate)); + } + NSDictionary *newTrack = @{@"AudioEncoder": @(hb_audio_encoder_get_name(track.encoder)), + @"AudioMixdown": @(hb_mixdown_get_name(track.mixdown)), + @"AudioSamplerate": sampleRate, + @"AudioBitrate": @(track.bitRate), + @"AudioTrackDRCSlider": @(track.drc), + @"AudioTrackGainSlider": @(track.gain)}; + + [audioList addObject:newTrack]; + } + + preset[@"AudioList"] = audioList; + [audioList release]; +} + +- (void)validateEncoderFallbackForVideoContainer:(int)container +{ + BOOL isValid = NO; + for (const hb_encoder_t *audio_encoder = hb_audio_encoder_get_next(NULL); + audio_encoder != NULL; + audio_encoder = hb_audio_encoder_get_next(audio_encoder)) + { + if (audio_encoder->muxers & container) + { + if (audio_encoder->codec == self.encoderFallback) + { + isValid = YES; + break; + } + } + } + + if (!isValid) + { + self.encoderFallback = HB_ACODEC_AC3; + } + + self.container = container; +} + +@end |