// // SilenceDecoder.m // Cog // // Created by Christopher Snowhill on 2/8/15. // Copyright 2015 __NoWork, LLC__. All rights reserved. // #import "SilenceDecoder.h" #import "Logging.h" #import "PlaylistController.h" @implementation SilenceDecoder enum { sample_rate = 44100 }; enum { channels = 2 }; - (BOOL)open:(id)s { [self setSource:s]; NSString *path = [[[s url] relativeString] substringFromIndex:10]; int seconds = [path intValue]; if(!seconds) seconds = 10; length = seconds * sample_rate; remain = length; [self willChangeValueForKey:@"properties"]; [self didChangeValueForKey:@"properties"]; return YES; } - (NSDictionary *)properties { return @{ @"bitrate": @(0), @"sampleRate": @(sample_rate), @"totalFrames": @(length), @"bitsPerSample": @(32), @"floatingPoint": @(YES), @"channels": @(channels), @"seekable": @(YES), @"endian": @"host", @"encoding": @"synthesized" }; } - (NSDictionary *)metadata { return @{}; } - (int)readAudio:(void *)buf frames:(UInt32)frames { int total = frames; if(!IsRepeatOneSet()) { if(total > remain) total = (int)remain; remain -= total; } memset(buf, 0, sizeof(float) * total * channels); return total; } - (long)seek:(long)frame { if(frame > length) frame = length; remain = length - frame; return frame; } - (void)close { } - (void)setSource:(id)s { source = s; } - (id)source { return source; } - (BOOL)isSilence { return YES; } + (NSArray *)fileTypes { return @[]; } + (NSArray *)mimeTypes { return @[@"audio/x-silence"]; } + (float)priority { return 1.0; } + (NSArray *)fileTypeAssociations { return @[]; } @end