/* HBAudioTransformers.m $
This file is part of the HandBrake source code.
Homepage: .
It may be used under the terms of the GNU General Public License. */
#import "HBAudioTransformers.h"
#import "HBLocalizationUtilities.h"
#include "hb.h"
#pragma mark - Value Transformers
@implementation HBFallbackEncodersTransformer
+ (Class)transformedValueClass
{
return [NSArray class];
}
- (id)transformedValue:(id)value
{
if (value != nil)
{
NSMutableArray *localizedArray = [NSMutableArray array];
for (NSString *text in value)
{
if ([text isEqualToString:@"None"])
{
[localizedArray addObject:HBKitLocalizedString(@"None", @"HBSubtitles -> none track name")];
}
else
{
[localizedArray addObject:text];
}
}
return localizedArray;
}
return value;
}
+ (BOOL)allowsReverseTransformation
{
return NO;
}
@end
@implementation HBFallbackEncoderTransformer
+ (Class)transformedValueClass
{
return [NSString class];
}
- (id)transformedValue:(id)value
{
const char *name = hb_audio_encoder_get_name([value intValue]);
if (name)
{
return @(name);
}
else
{
return HBKitLocalizedString(@"None", @"HBSubtitles -> none track name");
}
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)reverseTransformedValue:(id)value
{
if ([value isEqualTo:HBKitLocalizedString(@"None", @"HBSubtitles -> none track name")])
{
return @(hb_audio_encoder_get_from_name("none"));
}
else
{
return @(hb_audio_encoder_get_from_name([value UTF8String]));
}
}
@end
@implementation HBEncoderTransformer
+ (Class)transformedValueClass
{
return [NSString class];
}
- (id)transformedValue:(id)value
{
const char *name = hb_audio_encoder_get_name([value intValue]);
if (name)
{
return @(name);
}
else
{
return nil;
}
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)reverseTransformedValue:(id)value
{
return @(hb_audio_encoder_get_from_name([value UTF8String]));
}
@end
static NSDictionary *localizedMixdownsNames;
static NSDictionary *localizedReversedMixdownsNames;
@implementation HBMixdownsTransformer
+ (void)initialize
{
if (self == [HBMixdownsTransformer class]) {
localizedMixdownsNames =
@{@"None": HBKitLocalizedString(@"None", @"HBAudio -> Mixdown"),
@"Mono": HBKitLocalizedString(@"Mono", @"HBAudio -> Mixdown"),
@"Mono (Left Only)": HBKitLocalizedString(@"Mono (Left Only)", @"HBAudio -> Mixdown"),
@"Mono (Right Only)": HBKitLocalizedString(@"Mono (Right Only)", @"HBAudio -> Mixdown"),
@"Stereo": HBKitLocalizedString(@"Stereo", @"HBAudio -> Mixdown"),
@"Dolby Surround": HBKitLocalizedString(@"Dolby Surround", @"HBAudio -> Mixdown"),
@"Dolby Pro Logic II": HBKitLocalizedString(@"Dolby Pro Logic II", @"HBAudio -> Mixdown"),
@"5.1 Channels": HBKitLocalizedString(@"5.1 Channels", @"HBAudio -> Mixdown"),
@"6.1 Channels": HBKitLocalizedString(@"6.1 Channels", @"HBAudio -> Mixdown"),
@"7.1 Channels": HBKitLocalizedString(@"7.1 Channels", @"HBAudio -> Mixdown"),
@"7.1 (5F/2R/LFE)": HBKitLocalizedString(@"7.1 (5F/2R/LFE)", @"HBAudio -> Mixdown"),
};
localizedReversedMixdownsNames =
@{HBKitLocalizedString(@"None", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_NONE),
HBKitLocalizedString(@"Mono", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_MONO),
HBKitLocalizedString(@"Mono (Left Only)", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_LEFT),
HBKitLocalizedString(@"Mono (Right Only)", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_RIGHT),
HBKitLocalizedString(@"Stereo", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_STEREO),
HBKitLocalizedString(@"Dolby Surround", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_DOLBY),
HBKitLocalizedString(@"Dolby Pro Logic II", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_DOLBYPLII),
HBKitLocalizedString(@"5.1 Channels", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_5POINT1),
HBKitLocalizedString(@"6.1 Channels", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_6POINT1),
HBKitLocalizedString(@"7.1 Channels", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_7POINT1),
HBKitLocalizedString(@"7.1 (5F/2R/LFE)", @"HBAudio -> Mixdown"): @(HB_AMIXDOWN_5_2_LFE),
};
}
}
+ (NSString *)localizedNameFromMixdown:(int)mixdown
{
switch(mixdown)
{
case HB_AMIXDOWN_NONE:
return HBKitLocalizedString(@"None", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_MONO:
return HBKitLocalizedString(@"Mono", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_LEFT:
return HBKitLocalizedString(@"Mono (Left Only)", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_RIGHT:
return HBKitLocalizedString(@"Mono (Right Only)", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_STEREO:
return HBKitLocalizedString(@"Stereo", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_DOLBY:
return HBKitLocalizedString(@"Dolby Surround", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_DOLBYPLII:
return HBKitLocalizedString(@"Dolby Pro Logic II", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_5POINT1:
return HBKitLocalizedString(@"5.1 Channels", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_6POINT1:
return HBKitLocalizedString(@"6.1 Channels", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_7POINT1:
return HBKitLocalizedString(@"7.1 Channels", @"HBAudio -> Mixdown");
case HB_AMIXDOWN_5_2_LFE:
return HBKitLocalizedString(@"7.1 (5F/2R/LFE)", @"HBAudio -> Mixdown");
default:
{
const char *name = hb_mixdown_get_name(mixdown);
return name ? @(name) : nil;
}
}
}
+ (NSNumber *)mixdownFromLocalizedName:(NSString *)name
{
NSNumber *mixdown = localizedReversedMixdownsNames[name];
return mixdown ? mixdown : @(hb_mixdown_get_from_name(name.UTF8String));
}
+ (Class)transformedValueClass
{
return [NSArray class];
}
- (id)transformedValue:(id)value
{
if (value != nil)
{
NSMutableArray *localizedArray = [[NSMutableArray alloc] initWithCapacity:[value count]];
for (NSString *text in value)
{
NSString *localizedName = localizedMixdownsNames[text];
if (localizedName)
{
[localizedArray addObject:localizedName];
}
}
return localizedArray;
}
return value;
}
+ (BOOL)allowsReverseTransformation
{
return NO;
}
@end
@implementation HBMixdownTransformer
+ (Class)transformedValueClass
{
return [NSString class];
}
- (id)transformedValue:(id)value
{
return [HBMixdownsTransformer localizedNameFromMixdown:[value intValue]];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)reverseTransformedValue:(id)value
{
return [HBMixdownsTransformer mixdownFromLocalizedName:value];
}
@end
@implementation HBSampleRateTransformer
+ (Class)transformedValueClass
{
return [NSString class];
}
- (id)transformedValue:(id)value
{
const char *name = hb_audio_samplerate_get_name([value intValue]);
if (name)
{
return @(name);
}
else
{
return nil;
}
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)reverseTransformedValue:(id)value
{
int sampleRate = hb_audio_samplerate_get_from_name([value UTF8String]);
if (sampleRate < 0)
{
sampleRate = 0;
}
return @(sampleRate);
}
@end
@implementation HBIntegerTransformer
+ (Class)transformedValueClass
{
return [NSString class];
}
- (id)transformedValue:(id)value
{
// treat -1 as a special invalid value
// e.g. passthru has no bitrate since we have no source
if ([value intValue] == -1)
{
return @"N/A";
}
return [value stringValue];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)reverseTransformedValue:(id)value
{
return @([value intValue]);
}
@end