diff options
author | ritsuka <[email protected]> | 2015-01-09 07:34:11 +0000 |
---|---|---|
committer | ritsuka <[email protected]> | 2015-01-09 07:34:11 +0000 |
commit | e5e00e722af027f199cce7d31c79ec3d0a0688c0 (patch) | |
tree | 91326c26aa8447604a72eeb91ea332e0add5cbaa /macosx/HBAudio.m | |
parent | 0bc96a19bd83d9c5d3694bbc8a8c88c5cc0d8c72 (diff) |
MacGui: rename HBAudio class to HBAudioTrack.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6696 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBAudio.m')
-rw-r--r-- | macosx/HBAudio.m | 645 |
1 files changed, 0 insertions, 645 deletions
diff --git a/macosx/HBAudio.m b/macosx/HBAudio.m deleted file mode 100644 index d4129bde7..000000000 --- a/macosx/HBAudio.m +++ /dev/null @@ -1,645 +0,0 @@ -// -// HBAudio.m -// HandBrake -// -// Created on 2010-08-30. -// - -#import "HBAudio.h" -#import "HBAudioController.h" -#import "HBJob.h" -#import "NSCodingMacro.h" -#import "hb.h" - -NSString *keyAudioCodecName = @"keyAudioCodecName"; -NSString *keyAudioSupportedMuxers = @"keyAudioSupportedMuxers"; -NSString *keyAudioSampleRateName = @"keyAudioSampleRateName"; -NSString *keyAudioBitrateName = @"keyAudioBitrateName"; -NSString *keyAudioMustMatchTrack = @"keyAudioMustMatchTrack"; -NSString *keyAudioMixdownName = @"keyAudioMixdownName"; - -NSString *keyAudioCodec = @"codec"; -NSString *keyAudioMixdown = @"mixdown"; -NSString *keyAudioSamplerate = @"samplerate"; -NSString *keyAudioBitrate = @"bitrate"; - -static NSMutableArray *masterCodecArray = nil; -static NSMutableArray *masterMixdownArray = nil; -static NSMutableArray *masterSampleRateArray = nil; -static NSMutableArray *masterBitRateArray = nil; - -@interface NSArray (HBAudioSupport) -- (NSDictionary *) dictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey; -- (NSDictionary *) lastDictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey; -@end -@implementation NSArray (HBAudioSupport) -- (NSDictionary *) dictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey reverse: (BOOL) reverse - -{ - NSDictionary *retval = nil; - NSEnumerator *enumerator = reverse ? [self reverseObjectEnumerator] : [self objectEnumerator]; - NSDictionary *dict; - id aValue; - - while (nil != (dict = [enumerator nextObject]) && !retval) - { - if (nil != (aValue = dict[aKey]) && [aValue isEqual: anObject]) - { - retval = dict; - } - } - return retval; -} -- (NSDictionary *) dictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey -{ - return [self dictionaryWithObject: anObject matchingKey: aKey reverse: NO]; -} -- (NSDictionary *) lastDictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey -{ - return [self dictionaryWithObject: anObject matchingKey: aKey reverse: YES]; -} - -@end - -@implementation HBAudio - -#pragma mark - -#pragma mark Object Setup - -+ (void) initialize - -{ - if ([HBAudio class] == self) - { - masterCodecArray = [[NSMutableArray alloc] init]; // knowingly leaked - 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)) - { - id audioMustMatchTrack; - if ((audio_encoder->codec & HB_ACODEC_PASS_FLAG) && - (audio_encoder->codec != HB_ACODEC_AUTO_PASS)) - { - audioMustMatchTrack = @(audio_encoder->codec & - ~HB_ACODEC_PASS_FLAG); - } - else - { - audioMustMatchTrack = @NO; - } - [masterCodecArray addObject:@{keyAudioCodecName: @(audio_encoder->name), - keyAudioCodec: @(audio_encoder->codec), - keyAudioSupportedMuxers: @(audio_encoder->muxers), - keyAudioMustMatchTrack: audioMustMatchTrack}]; - } - - masterMixdownArray = [[NSMutableArray alloc] init]; // knowingly leaked - for (const hb_mixdown_t *mixdown = hb_mixdown_get_next(NULL); - mixdown != NULL; - mixdown = hb_mixdown_get_next(mixdown)) - { - [masterMixdownArray addObject:@{keyAudioMixdownName: @(mixdown->name), - keyAudioMixdown: @(mixdown->amixdown)}]; - } - - // Note that for the Auto value we use 0 for the sample rate because our controller will give back the track's - // input sample rate when it finds this 0 value as the selected sample rate. We do this because the input - // sample rate depends on the track, which means it depends on the title, so cannot be nicely set up here. - masterSampleRateArray = [[NSMutableArray alloc] init]; // knowingly leaked - [masterSampleRateArray addObject:@{keyAudioSampleRateName: @"Auto", - keyAudioSamplerate: @0}]; - for (const hb_rate_t *audio_samplerate = hb_audio_samplerate_get_next(NULL); - audio_samplerate != NULL; - audio_samplerate = hb_audio_samplerate_get_next(audio_samplerate)) - { - [masterSampleRateArray addObject:@{keyAudioSampleRateName: @(audio_samplerate->name), - keyAudioSamplerate: @(audio_samplerate->rate)}]; - } - - masterBitRateArray = [[NSMutableArray alloc] init]; // knowingly leaked - for (const hb_rate_t *audio_bitrate = hb_audio_bitrate_get_next(NULL); - audio_bitrate != NULL; - audio_bitrate = hb_audio_bitrate_get_next(audio_bitrate)) - { - [masterBitRateArray addObject:@{keyAudioBitrateName: @(audio_bitrate->name), - keyAudioBitrate: @(audio_bitrate->rate)}]; - } - } -} - -// Ensure the list of codecs is accurate -// Update the current value of codec based on the revised list -- (void) updateCodecs - -{ - NSMutableArray *permittedCodecs = [NSMutableArray array]; - NSUInteger count = [masterCodecArray count]; - NSDictionary *dict; - - // First get a list of the permitted codecs based on the internal rules - if (nil != self.track && self.enabled) - { - BOOL goodToAdd; - - for (unsigned int i = 0; i < count; i++) - { - dict = masterCodecArray[i]; - - // First make sure only codecs permitted by the container are here - goodToAdd = !!([dict[keyAudioSupportedMuxers] intValue] & - [self.videoContainerTag intValue]); - - // Now we make sure if DTS or AC3 is not available in the track it is not put in the codec list, but in a general way - if ([dict[keyAudioMustMatchTrack] boolValue]) - { - if ([dict[keyAudioMustMatchTrack] intValue] != [self.track[keyAudioInputCodec] intValue]) - { - goodToAdd = NO; - } - } - - if (goodToAdd) - { - [permittedCodecs addObject: dict]; - } - } - } - - // Now make sure the permitted list and the actual ones matches - [self setCodecs: permittedCodecs]; - - // Ensure our codec is on the list of permitted codecs - if (!self.codec || ![permittedCodecs containsObject: self.codec]) - { - if (0 < [permittedCodecs count]) - { - self.codec = permittedCodecs[0]; // This should be defaulting to Core Audio - } - else - { - self.codec = nil; - } - } -} - -- (void) updateMixdowns: (BOOL) shouldSetDefault - -{ - NSMutableArray *permittedMixdowns = [NSMutableArray array]; - NSDictionary *dict; - int currentMixdown; - - unsigned long long channelLayout = [self.track[keyAudioInputChannelLayout] unsignedLongLongValue]; - NSUInteger count = [masterMixdownArray count]; - int codecCodec = [self.codec[keyAudioCodec] intValue]; - int theDefaultMixdown = hb_mixdown_get_default(codecCodec, channelLayout); - - for (unsigned int i = 0; i < count; i++) - { - dict = masterMixdownArray[i]; - currentMixdown = [dict[keyAudioMixdown] intValue]; - - if (hb_mixdown_is_supported(currentMixdown, codecCodec, channelLayout)) - { - [permittedMixdowns addObject: dict]; - } - } - - if (!self.enabled) - { - permittedMixdowns = nil; - } - - // Now make sure the permitted list and the actual ones matches - self.mixdowns = permittedMixdowns; - - // Select the proper one - if (shouldSetDefault) - { - self.mixdown = [permittedMixdowns dictionaryWithObject: @(theDefaultMixdown) - matchingKey: keyAudioMixdown]; - } - - if (!self.mixdown || ![permittedMixdowns containsObject: self.mixdown]) - { - self.mixdown = [permittedMixdowns lastObject]; - } -} - -- (void) updateBitRates: (BOOL) shouldSetDefault - -{ - NSMutableArray *permittedBitRates = [NSMutableArray array]; - NSDictionary *dict; - int minBitRate; - int maxBitRate; - int currentBitRate; - BOOL shouldAdd; - - NSUInteger count = [masterBitRateArray count]; - int trackInputBitRate = [self.track[keyAudioInputBitrate] intValue]; - int theSampleRate = [self.sampleRate[keyAudioSamplerate] intValue]; - - if (0 == theSampleRate) // this means Auto - { - theSampleRate = [self.track[keyAudioInputSampleRate] intValue]; - } - - int ourCodec = [self.codec[keyAudioCodec] intValue]; - int ourMixdown = [self.mixdown[keyAudioMixdown] intValue]; - int theDefaultBitRate = hb_audio_bitrate_get_default(ourCodec, theSampleRate, ourMixdown); - hb_audio_bitrate_get_limits(ourCodec, theSampleRate, ourMixdown, &minBitRate, &maxBitRate); - - BOOL codecIsPassthru = ([self.codec[keyAudioCodec] intValue] & HB_ACODEC_PASS_FLAG) ? YES : NO; - BOOL codecIsLossless = (theDefaultBitRate == -1) ? YES : NO; - - if (codecIsPassthru) - { - NSDictionary *sourceBitRate = [masterBitRateArray dictionaryWithObject: @(trackInputBitRate) - matchingKey: keyAudioBitrate]; - if (!sourceBitRate) - { - // the source bitrate isn't in the master array - create it - sourceBitRate = @{keyAudioBitrateName: [NSString stringWithFormat: @"%d", trackInputBitRate], - keyAudioBitrate: @(trackInputBitRate)}; - } - [permittedBitRates addObject: sourceBitRate]; - } - else if (codecIsLossless) - { - NSDictionary *bitRateNotApplicable = @{keyAudioBitrateName: @"N/A", - keyAudioBitrate: @-1}; - [permittedBitRates addObject: bitRateNotApplicable]; - } - else - { - for (unsigned int i = 0; i < count; i++) - { - dict = masterBitRateArray[i]; - currentBitRate = [dict[keyAudioBitrate] intValue]; - - // First ensure the bitrate falls within range of the codec - shouldAdd = (currentBitRate >= minBitRate && currentBitRate <= maxBitRate); - - if (shouldAdd) - { - [permittedBitRates addObject: dict]; - } - } - } - - if (!self.enabled) - { - permittedBitRates = nil; - } - - // Make sure we are updated with the permitted list - self.bitRates = permittedBitRates; - - // Select the proper one - if (shouldSetDefault) - { - [self setBitRateFromName: [NSString stringWithFormat:@"%d", theDefaultBitRate]]; - } - - if (!self.bitRate || ![permittedBitRates containsObject: self.bitRate]) - { - self.bitRate = [permittedBitRates lastObject]; - } -} - -#pragma mark - -#pragma mark Accessors - -- (NSArray *) sampleRates -{ - return masterSampleRateArray; -} - -- (void) dealloc -{ - [_track release]; - [_codec release]; - [_mixdown release]; - [_sampleRate release]; - [_bitRate release]; - [_drc release]; - [_gain release]; - [_videoContainerTag release]; - [_codecs release]; - [_mixdowns release]; - [_bitRates release]; - - [super dealloc]; -} - -#pragma mark - -#pragma mark Setters - -- (void)setVideoContainerTag:(NSNumber *)videoContainerTag -{ - [_videoContainerTag autorelease]; - _videoContainerTag = [videoContainerTag retain]; - [self updateCodecs]; -} - -- (void)setTrack:(NSDictionary *)track -{ - NSDictionary *oldValue = _track; - _track = [track retain]; - if (nil != _track) - { - [self updateCodecs]; - [self updateMixdowns: YES]; - if (self.enabled) - { - self.sampleRate = self.sampleRates[0]; // default to Auto - } - if ([self.controller.noneTrack isEqual: oldValue]) - { - [self.controller switchingTrackFromNone: self]; - } - if ([self.controller.noneTrack isEqual: self.track]) - { - [self.controller settingTrackToNone: self]; - } - } - [oldValue release]; -} - -- (void)setCodec:(NSDictionary *)codec -{ - [_codec autorelease]; - _codec = [codec retain]; - [self updateMixdowns: YES]; - [self updateBitRates: YES]; -} - -- (void)setMixdown:(NSDictionary *)mixdown -{ - [_mixdown autorelease]; - _mixdown = [mixdown retain]; - [self updateBitRates: YES]; - [[NSNotificationCenter defaultCenter] postNotificationName: HBMixdownChangedNotification object: self]; -} - -- (void)setSampleRate:(NSDictionary *)sampleRate -{ - [_sampleRate autorelease]; - _sampleRate = [sampleRate retain]; - [self updateBitRates: NO]; -} - -#pragma mark - -#pragma mark Special Setters - -- (void) setTrackFromIndex: (int) aValue - -{ - self.track = [self.controller.masterTrackArray dictionaryWithObject: @(aValue) - matchingKey: keyAudioTrackIndex]; -} - -// This returns whether it is able to set the actual codec desired. -- (BOOL) setCodecFromName: (NSString *) aValue - -{ - NSDictionary *dict = [self.codecs dictionaryWithObject: aValue matchingKey: keyAudioCodecName]; - - if (nil != dict) - { - self.codec = dict; - } - return (nil != dict); -} - -- (void) setMixdownFromName: (NSString *) aValue - -{ - NSDictionary *dict = [self.mixdowns dictionaryWithObject: aValue matchingKey: keyAudioMixdownName]; - - if (nil != dict) - { - self.mixdown = dict; - } -} - -- (void) setSampleRateFromName: (NSString *) aValue - -{ - NSDictionary *dict = [self.sampleRates dictionaryWithObject: aValue matchingKey: keyAudioSampleRateName]; - - if (nil != dict) - { - self.sampleRate = dict; - } -} - -- (void) setBitRateFromName: (NSString *) aValue - -{ - NSDictionary *dict = [self.bitRates dictionaryWithObject: aValue matchingKey: keyAudioBitrateName]; - - if (nil != dict) - { - self.bitRate = dict; - } -} - - -#pragma mark - -#pragma mark Validation - -// Because we have indicated that the binding for the gain validates immediately we can implement the -// key value binding method to ensure the gain stays in our accepted range. -- (BOOL)validateGain:(id *)ioValue error:(NSError *)outError -{ - BOOL retval = YES; - - if (nil != *ioValue) - { - if ([*ioValue intValue] < -20) - { - *ioValue = @(-20); - } - else if ([*ioValue intValue] > 20) - { - *ioValue = @20; - } - } - - return retval; -} - -#pragma mark - -#pragma mark Bindings Support - -- (BOOL) enabled - -{ - return (nil != self.track) ? (![self.track isEqual: self.controller.noneTrack]) : NO; -} - -- (BOOL) mixdownEnabled - -{ - BOOL retval = self.enabled; - - if (retval) - { - int myMixdown = [self.mixdown[keyAudioMixdown] intValue]; - if (myMixdown == HB_AMIXDOWN_NONE) - { - // "None" mixdown (passthru) - retval = NO; - } - } - return retval; -} - -- (BOOL) bitrateEnabled - -{ - BOOL retval = self.enabled; - - if (retval) - { - int myCodecCodec = [self.codec[keyAudioCodec] intValue]; - int myCodecDefaultBitrate = hb_audio_bitrate_get_default(myCodecCodec, 0, 0); - if (myCodecDefaultBitrate < 0) - { - retval = NO; - } - } - return retval; -} - -- (BOOL) DRCEnabled - -{ - BOOL retval = self.enabled; - - if (retval) - { - int myTrackParam = [self.track[keyAudioInputCodecParam] intValue]; - int myTrackCodec = [self.track[keyAudioInputCodec] intValue]; - int myCodecCodec = [self.codec[keyAudioCodec] intValue]; - if (!hb_audio_can_apply_drc(myTrackCodec, myTrackParam, myCodecCodec)) - { - retval = NO; - } - } - return retval; -} - -- (BOOL) PassThruDisabled - -{ - BOOL retval = self.enabled; - - if (retval) - { - int myCodecCodec = [self.codec[keyAudioCodec] intValue]; - if (myCodecCodec & HB_ACODEC_PASS_FLAG) - { - retval = NO; - } - } - return retval; -} - -+ (NSSet *) keyPathsForValuesAffectingValueForKey: (NSString *) key - -{ - NSSet *retval = nil; - - if ([key isEqualToString: @"enabled"]) - { - retval = [NSSet setWithObjects: @"track", nil]; - } - else if ([key isEqualToString: @"PassThruDisabled"]) - { - retval = [NSSet setWithObjects: @"track", @"codec", nil]; - } - else if ([key isEqualToString: @"DRCEnabled"]) - { - retval = [NSSet setWithObjects: @"track", @"codec", nil]; - } - else if ([key isEqualToString: @"bitrateEnabled"]) - { - retval = [NSSet setWithObjects: @"track", @"codec", nil]; - } - else if ([key isEqualToString: @"mixdownEnabled"]) - { - retval = [NSSet setWithObjects: @"track", @"mixdown", nil]; - } - return retval; -} - -#pragma mark - NSCopying - -- (instancetype)copyWithZone:(NSZone *)zone -{ - HBAudio *copy = [[[self class] alloc] init]; - - if (copy) - { - copy->_track = [_track copy]; - copy->_codec = [_codec copy]; - copy->_mixdown = [_mixdown copy]; - copy->_sampleRate = [_sampleRate copy]; - copy->_bitRate = [_bitRate copy]; - copy->_drc = [_drc copy]; - copy->_gain = [_gain copy]; - copy->_videoContainerTag = [_videoContainerTag copy]; - - copy->_codecs = [_codecs copy]; - copy->_mixdowns = [_mixdowns copy]; - copy->_bitRates = [_bitRates copy]; - } - - return copy; -} - -#pragma mark - NSCoding - -- (void)encodeWithCoder:(NSCoder *)coder -{ - [coder encodeInt:1 forKey:@"HBAudioTrackVersion"]; - - encodeObject(_track); - encodeObject(_codec); - encodeObject(_mixdown); - encodeObject(_sampleRate); - encodeObject(_bitRate); - encodeObject(_drc); - encodeObject(_gain); - encodeObject(_videoContainerTag); - - encodeObject(_codecs); - encodeObject(_mixdowns); - encodeObject(_bitRates); -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - self = [super init]; - - decodeObject(_track); - decodeObject(_codec); - decodeObject(_mixdown); - decodeObject(_sampleRate); - decodeObject(_bitRate); - decodeObject(_drc); - decodeObject(_gain); - decodeObject(_videoContainerTag); - - decodeObject(_codecs); - decodeObject(_mixdowns); - decodeObject(_bitRates); - - return self; -} - -@end - |