From 4ff38268aee5efd8e410a16158caa6cb980837f8 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Wed, 22 Dec 2021 16:22:49 -0800 Subject: [PATCH] Plugins: Support multiple handlers per MIME type for streams --- Audio/PluginController.m | 48 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/Audio/PluginController.m b/Audio/PluginController.m index 2f119f037..41e140d36 100644 --- a/Audio/PluginController.m +++ b/Audio/PluginController.m @@ -155,7 +155,16 @@ static PluginController *sharedPluginController = nil; if (decoder && [decoder respondsToSelector:@selector(mimeTypes)]) { for (id mimeType in [decoder mimeTypes]) { - [decodersByMimeType setObject:className forKey:[mimeType lowercaseString]]; + NSString *mimetype = [mimeType lowercaseString]; + NSMutableArray *decoders; + if (![decodersByMimeType objectForKey:mimetype]) + { + decoders = [[NSMutableArray alloc] init]; + [decodersByMimeType setObject:decoders forKey:mimetype]; + } + else + decoders = [decodersByMimeType objectForKey:mimetype]; + [decoders addObject:className]; } } } @@ -202,7 +211,16 @@ static PluginController *sharedPluginController = nil; if (propertiesReader && [propertiesReader respondsToSelector:@selector(mimeTypes)]) { for (id mimeType in [propertiesReader mimeTypes]) { - [propertiesReadersByMimeType setObject:className forKey:[mimeType lowercaseString]]; + NSString *mimetype = [mimeType lowercaseString]; + NSMutableArray *readers; + if (![propertiesReadersByMimeType objectForKey:mimetype]) + { + readers = [[NSMutableArray alloc] init]; + [propertiesReadersByMimeType setObject:readers forKey:mimetype]; + } + else + readers = [propertiesReadersByMimeType objectForKey:mimetype]; + [readers addObject:className]; } } } @@ -277,7 +295,18 @@ static PluginController *sharedPluginController = nil; } } else { - classString = [decodersByMimeType objectForKey:[[source mimeType] lowercaseString]]; + decoders = [decodersByMimeType objectForKey:[[source mimeType] lowercaseString]]; + if (decoders) { + if ( [decoders count] > 1 ) { + return [[CogDecoderMulti alloc] initWithDecoders:decoders]; + } + else { + classString = [decoders objectAtIndex:0]; + } + } + else { + classString = @"SilenceDecoder"; + } } Class decoder = NSClassFromString(classString); @@ -342,7 +371,18 @@ static PluginController *sharedPluginController = nil; } } else { - classString = [propertiesReadersByMimeType objectForKey:[[source mimeType] lowercaseString]]; + readers = [propertiesReadersByMimeType objectForKey:[[source mimeType] lowercaseString]]; + if (readers) + { + if ( [readers count] > 1 ) { + properties = [CogPropertiesReaderMulti propertiesForSource:source readers:readers]; + if (properties != nil && [properties count]) + return properties; + } + else { + classString = [readers objectAtIndex:0]; + } + } } if (classString)