[obsidian] vault backup: 2024-10-15 16:13:07[
This commit is contained in:
		
							
								
								
									
										37
									
								
								content/mimiumのプラグインシステム.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								content/mimiumのプラグインシステム.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
---
 | 
			
		||||
date: 2024-10-15 15:25
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
#mimium 
 | 
			
		||||
 | 
			
		||||
スケジューラーをプラグインとして切り離すシステムについて考えている。
 | 
			
		||||
 | 
			
		||||
プラグインの種類は主に3つに分けられる。
 | 
			
		||||
 | 
			
		||||
1. IOプラグイン: ホストのシステムとのIOを担当する、Rustで外部関数のFFIを書く必要があるもの。printlnみたいなやつ。インスタンスの生成とか破棄については考える必要がない
 | 
			
		||||
2. ネイティブUGen:クラスにおけるコンストラクタに相当する関数がエクスポートされてて、実行するとクロージャとしてそのインスタンスが帰ってくるもの。
 | 
			
		||||
3. システムプラグイン:今回考えたいもの。原則1VMに対して1インスタンスしか存在せず、`on_init`とか`on_sample`みたいなシステムの関数にフックして任意の処理を実行しつつ、mimium側からもいくつかの関数を通じてアクセスができる(`_mimium_schedule_at`みたいなこと)
 | 
			
		||||
 | 
			
		||||
システムプラグインについて考えると所有権が結構めんどくさい。VMの中ではIOプラグインとネイティブUGenとシステムプラグインは同じ`CallExtFun`もしくは`CallExtCls`で扱えるようにしたい。がシステムプラグインはVMホスト側(というかオーディオドライバー)からと、mimium側からRustのクロージャインスタンスとを通じて双方向からアクセスされることになる。システムプラグインのインスタンスはクロージャとVM本体と両方から参照されることになるので、`Rc<Refcell<_>>`でラップするとかしないといけない。
 | 
			
		||||
 | 
			
		||||
```rust
 | 
			
		||||
 | 
			
		||||
struct SystemPluginSignature{
 | 
			
		||||
	name:String,
 | 
			
		||||
	fun: Rc<RefCell<dyn Fn(&mut Machine)->ReturnCode>>,
 | 
			
		||||
	ty:TypeNodeId
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
trait SystemPlugin{
 | 
			
		||||
 fn on_init(&mut self, machine:&mut Machine);
 | 
			
		||||
 fn on_sample(&mut self, machine:&mut Machine);
 | 
			
		||||
 fn get_plugin_signature(self)->Vec<>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T:SystemPlugin> for Rc<RefCell<T>>{
 | 
			
		||||
 fn get_plugin_signature(&self)->Vec<SystemPluginSignature>{
 | 
			
		||||
	 
 | 
			
		||||
 }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
		Reference in New Issue
	
	Block a user