diff --git a/content/mimiumのプラグインシステム.md b/content/mimiumのプラグインシステム.md new file mode 100644 index 00000000..d109c307 --- /dev/null +++ b/content/mimiumのプラグインシステム.md @@ -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>`でラップするとかしないといけない。 + +```rust + +struct SystemPluginSignature{ + name:String, + fun: RcReturnCode>>, + 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 for Rc>{ + fn get_plugin_signature(&self)->Vec{ + + } +} + +```