Closed qryxip closed 1 month ago
元々やりたかったこととしては #832 みたいな設計をC APIでもやることでした。しかしそのためにはVoicevoxVoiceModelFile
に生えている二つのゲッターメソッドが邪魔であることが今回わかりました。(このPRはこのPRでマージするとして、その後)どうにかするための対応としては次のように考えています。
二つのゲッターメソッドをゲッターではなくする
voicevox_voice_model_file_id
はuint8_t (*output)[16]
のような引数に吐き出すようにし、voicevox_voice_model_file_get_metas_json
の方はcreate_metas_json
に改名してvoicevox_json_free
が必要なようにする。
単なるゲッターではなくbracket patternにする
関数オブジェクトをどう表現するかがすごい面倒そう…
char*
自体の代わりにVoicevoxStringRef
みたいなオブジェクトを返すようにし、VoicevoxStringRef
は"delete"を必要とする
VoicevoxStringRef *metas = voicevox_voice_model_file_get_metas_json(model);
char *metas_cstr = voicevox_string_ref_get_data(metas);
do_something(metas_cstr);
// `char*`を使い終えたことをVOICEVOX CORE C APIに伝える
voicevox_string_ref_delete(metas);
bracket patternほどではないけど使うのが面倒そう… あとVoicevoxStringRef
もまた同じように管理するの?という気もしてくる。
[追記] voicevox_voice_model_file_delete
と〃_close
の二種類を作る
Closable
や__exit__
のようなクローズ処理に対応する"close"と、本当のデストラクトに対応する"delete"の二種類を作る。"close"の方は他言語バインディング作成専用という感じで。
諦める
このPRで対応を打ち切り、「Synthesizer::load_voice_model
中にVoiceModel
をデストラクトしたらどうなるのか」の問題は各バインディング製作者に任せる。
個人的には1.か4.なのですが、VoicevoxCoreSharpを作っている @yamachu さんにも意見を伺いたいなーと。
今回の変更ですが、言語バインディングライブラリを作る者として扱いやすいC APIになるなと感じました、ありがとうございます。
https://github.com/VOICEVOX/voicevox_core/pull/849#issuecomment-2395172908 こちらの VoicevoxVoiceModelFile の扱いですが、私も 1 or 4 、良さそう具合で言えば 1 > 4 かなと考えています。 正直な所、自分の不勉強で申し訳ないのですが 2 がどんな感じになるのかがイメージできてないからという理由もあります。 3 は扱いが面倒だなという一言に尽きるかな…と…
1 は他の API との一貫性が取れているように感じるので、良いのかなとは思いました。
自分もちゃんとわかってない気もしますが、1が良さそうに思いました! っていうかまあ、これでstring周りの処理が全部共通になるって感じですかね? 確か単純にポイントが得られるパターンと、deleteが必要なパターンがあった記憶。
3e6ddf1
(#849): CApiObject
に"ID"を持たせなくても、ポインタのアドレスで代用できることに気付いたのでそうしてしまいました。永続するboxcar::Vec<impl CApiObject>
によるメモリリークが一要素につき4-byteから1-byteになります。ad753de
(#849): "delete"時にオブジェクトへの他のアクセスを待つようにしました。あとはドキュメントを更新すれば #836 をresolveできるはず。
61cc6df
(#849) このPRのdraftを外せるよう、ドキュメントを更新。e6abd77
(#849): この仕組みならそもそもユーザーから渡されるVoicevoxSynthesizer*
とかの有効性を信用しなくてもよいのでは?と思い、API全般においてVoicevoxSynthesizer
のポインタはポインタのままで扱うように。これによりユーザーに要求するsafety requirementsが緩和された。大丈夫です!
内容
C APIにおいて、Rust APIのオブジェクトそのものの代わりにトークンのような1-bit長の構造体ユーザーに渡すようにすることで、次のことを実現する。
ドキュメントとしてのsafety requirementsもあわせて緩和する。
このPRは #836 の解決
ではなく、ドキュメントにも手を加えていない。というのも。VoicevoxVoiceModelFile
には次のゲッターメソッドがあり、これらをカバーするのは現状のAPIの形だと不可能だからであるvoicevox_voice_model_file_id
voicevox_voice_model_file_get_metas_json
関連 Issue
Resolves #836.
その他