@@ -9,36 +9,51 @@ namespace NPlug;
99
1010public sealed class AudioPluginFactory : IAudioPluginFactory
1111{
12- private readonly List < AudioPluginClassInfo > _plugins ;
13- private readonly Dictionary < Guid , Func < IAudioPluginComponent > > _mapGuidToComponentFactory ;
12+ private readonly List < AudioPluginClassInfo > _pluginClassInfos ;
13+ private readonly Dictionary < Guid , Func < IAudioPluginObject > > _mapGuidToComponentFactory ;
1414
1515 public AudioPluginFactory ( AudioPluginFactoryInfo factoryInfo )
1616 {
1717 FactoryInfo = factoryInfo ;
18- _plugins = new List < AudioPluginClassInfo > ( ) ;
19- _mapGuidToComponentFactory = new Dictionary < Guid , Func < IAudioPluginComponent > > ( ) ;
18+ _pluginClassInfos = new List < AudioPluginClassInfo > ( ) ;
19+ _mapGuidToComponentFactory = new Dictionary < Guid , Func < IAudioPluginObject > > ( ) ;
2020 }
2121
2222 public AudioPluginFactoryInfo FactoryInfo { get ; }
23-
24- public void RegisterPlugin < TPlugin > ( AudioProcessorClassInfo pluginClassInfo ) where TPlugin : class , IAudioProcessor , new ( )
23+
24+ public IReadOnlyList < AudioPluginClassInfo > PluginClassInfos => _pluginClassInfos ;
25+
26+ public IAudioPluginObject ? CreateInstance ( Guid pluginId )
27+ {
28+ return _mapGuidToComponentFactory . TryGetValue ( pluginId , out var factory ) ? factory ( ) : null ;
29+ }
30+
31+ public void RegisterPlugin < TPlugin > ( AudioProcessorClassInfo pluginClassInfo , bool registerTests = false ) where TPlugin : class , IAudioProcessor , new ( )
2532 {
2633 RegisterPlugin ( pluginClassInfo , static ( ) => new TPlugin ( ) ) ;
34+
35+ // Register test plugin on the fly
36+ if ( registerTests )
37+ {
38+ var testPluginClassInfo = new AudioTestProviderClassInfo ( Guid . NewGuid ( ) , $ "{ pluginClassInfo . Name } Test Provider") ;
39+ int indexOfAudioProcessor = _pluginClassInfos . Count - 1 ;
40+ RegisterPlugin ( testPluginClassInfo , ( ) => new AudioTestProvider ( this , indexOfAudioProcessor ) ) ;
41+ }
2742 }
2843
2944 public void RegisterPlugin < TPlugin > ( AudioControllerClassInfo pluginClassInfo ) where TPlugin : class , IAudioController , new ( )
3045 {
3146 RegisterPlugin ( pluginClassInfo , static ( ) => new TPlugin ( ) ) ;
3247 }
3348
34- public void RegisterPlugin ( AudioPluginClassInfo pluginClassInfo , Func < IAudioPluginComponent > factory )
49+ public void RegisterPlugin ( AudioPluginClassInfo pluginClassInfo , Func < IAudioPluginObject > factory )
3550 {
36- if ( _mapGuidToComponentFactory . ContainsKey ( pluginClassInfo . Id ) )
51+ if ( _mapGuidToComponentFactory . ContainsKey ( pluginClassInfo . ClassId ) )
3752 {
38- throw new InvalidOperationException ( $ "The plugin { pluginClassInfo . Name } with id: { pluginClassInfo . Id } has been already registered") ;
53+ throw new InvalidOperationException ( $ "The plugin { pluginClassInfo . Name } with id: { pluginClassInfo . ClassId } has been already registered") ;
3954 }
40- _mapGuidToComponentFactory . Add ( pluginClassInfo . Id , factory ) ;
41- _plugins . Add ( pluginClassInfo ) ;
55+ _mapGuidToComponentFactory . Add ( pluginClassInfo . ClassId , factory ) ;
56+ _pluginClassInfos . Add ( pluginClassInfo ) ;
4257 }
4358
4459 /// <summary>
@@ -47,23 +62,61 @@ public void RegisterPlugin(AudioPluginClassInfo pluginClassInfo, Func<IAudioPlug
4762 /// <param name="factory">The factory to copy registered plugins.</param>
4863 public void CopyFrom ( AudioPluginFactory factory )
4964 {
50- foreach ( var pluginInfo in factory . _plugins )
65+ foreach ( var pluginInfo in factory . _pluginClassInfos )
5166 {
52- var componentFactory = _mapGuidToComponentFactory [ pluginInfo . Id ] ;
67+ var componentFactory = _mapGuidToComponentFactory [ pluginInfo . ClassId ] ;
5368 RegisterPlugin ( pluginInfo , componentFactory ) ;
5469 }
5570 }
5671
57- int IAudioPluginFactory . PluginClassInfoCount => _plugins . Count ;
72+ int IAudioPluginFactory . PluginClassInfoCount => _pluginClassInfos . Count ;
5873
5974 AudioPluginClassInfo IAudioPluginFactory . GetPluginClassInfo ( int index )
6075 {
61- if ( ( uint ) index >= ( uint ) _plugins . Count ) throw new ArgumentOutOfRangeException ( nameof ( index ) ) ;
62- return _plugins [ index ] ;
76+ if ( ( uint ) index >= ( uint ) _pluginClassInfos . Count ) throw new ArgumentOutOfRangeException ( nameof ( index ) ) ;
77+ return _pluginClassInfos [ index ] ;
6378 }
64-
65- IAudioPluginComponent ? IAudioPluginFactory . CreateInstance ( Guid pluginId )
79+
80+ /// <summary>
81+ /// Base class for <see cref="IAudioTestProvider"/>.
82+ /// </summary>
83+ private class AudioTestProvider : IAudioTestProvider
6684 {
67- return _mapGuidToComponentFactory . TryGetValue ( pluginId , out var factory ) ? factory ( ) : null ;
85+ private readonly AudioPluginFactory _factory ;
86+ private readonly AudioProcessorClassInfo _audioProcessorClassInfo ;
87+ private IAudioProcessor ? _audioProcessor ;
88+ private IAudioController ? _audioController ;
89+
90+ public AudioTestProvider ( AudioPluginFactory factory , int indexToAudioProcessor )
91+ {
92+ _factory = factory ;
93+ _audioProcessorClassInfo = ( AudioProcessorClassInfo ) _factory . PluginClassInfos [ indexToAudioProcessor ] ;
94+ }
95+
96+ public IAudioProcessor GetAudioProcessor ( )
97+ {
98+ if ( _audioProcessor != null )
99+ {
100+ return _audioProcessor ;
101+ }
102+ _audioProcessor = ( IAudioProcessor ) _factory . CreateInstance ( _audioProcessorClassInfo . ClassId ) ! ;
103+ return _audioProcessor ;
104+ }
105+
106+ public IAudioController GetAudioController ( )
107+ {
108+ if ( _audioController != null )
109+ {
110+ return _audioController ;
111+ }
112+ _audioController = ( IAudioController ) _factory . CreateInstance ( GetAudioProcessor ( ) . ControllerId ) ! ;
113+ return _audioController ;
114+ }
115+
116+ public AudioProcessorCategory GetAudioProcessorCategory ( ) => _audioProcessorClassInfo . Category ;
117+
118+ public Guid GetAudioProcessorClassId ( ) => _audioProcessorClassInfo . ClassId ;
119+
120+ public IAudioPluginFactory GetPluginFactory ( ) => _factory ;
68121 }
69122}
0 commit comments