From 61cc6dfcb63379721c1878b080787670b38ec695 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Tue, 8 Oct 2024 03:55:49 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=A8=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/voicevox_core.h | 85 +++++++++++-------- crates/voicevox_core_c_api/src/c_impls.rs | 21 ++--- crates/voicevox_core_c_api/src/lib.rs | 85 +++++++++++-------- 3 files changed, 105 insertions(+), 86 deletions(-) diff --git a/crates/voicevox_core_c_api/include/voicevox_core.h b/crates/voicevox_core_c_api/include/voicevox_core.h index e8656d8ec..e952903c0 100644 --- a/crates/voicevox_core_c_api/include/voicevox_core.h +++ b/crates/voicevox_core_c_api/include/voicevox_core.h @@ -543,8 +543,8 @@ VoicevoxResultCode voicevox_open_jtalk_rc_new(const char *open_jtalk_dic_dir, * @param [in] user_dict ユーザー辞書 * * \safety{ - * - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならず、また ::voicevox_open_jtalk_rc_delete で解放されていてはいけない。 - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -556,6 +556,10 @@ VoicevoxResultCode voicevox_open_jtalk_rc_use_user_dict(const struct OpenJtalkRc /** * ::OpenJtalkRc を破棄(_destruct_)する。 * + * 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 + * + * この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 + * * @param [in] open_jtalk 破棄対象 * * \example{ @@ -565,8 +569,7 @@ VoicevoxResultCode voicevox_open_jtalk_rc_use_user_dict(const struct OpenJtalkRc * } * * \safety{ - * - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならず、また既にこの関数で解放されていてはいけない。 - * - `open_jtalk`は以後ダングリングポインタ(_dangling pointer_)として扱われなくてはならない。 + * - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -618,7 +621,7 @@ VoicevoxResultCode voicevox_voice_model_file_open(const char *path, * @param [out] output_voice_model_id 音声モデルID * * \safety{ - * - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_voice_model_file_close で解放されていてはいけない。 + * - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 * - `output_voice_model_id`は書き込みについて有効でなければならない。 * } */ @@ -638,7 +641,7 @@ void voicevox_voice_model_file_id(const struct VoicevoxVoiceModelFile *model, * @returns メタ情報のJSON文字列 * * \safety{ - * - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_voice_model_file_close で解放されていてはいけない。 + * - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -649,11 +652,14 @@ char *voicevox_voice_model_file_create_metas_json(const struct VoicevoxVoiceMode /** * ::VoicevoxVoiceModelFile を、所有しているファイルディスクリプタを閉じた上で破棄(_destruct_)する。 * + * 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 + * + * この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 + * * @param [in] model 破棄対象 * * \safety{ - * - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また既にこの関数で解放されていてはいけない。 - * - `model`は以後ダングリングポインタ(_dangling pointer_)として扱われなくてはならない。 + * - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -673,7 +679,7 @@ void voicevox_voice_model_file_close(struct VoicevoxVoiceModelFile *model); * * \safety{ * - `onnxruntime`は ::voicevox_onnxruntime_load_once または ::voicevox_onnxruntime_init_once で得たものでなければならない。 - * - `open_jtalk`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_open_jtalk_rc_new で解放されていてはいけない。 + * - `open_jtalk`は ::voicevox_voice_model_file_open で得たものでなければならない。 * - `out_synthesizer`は書き込みについて有効でなければならない。 * } */ @@ -688,11 +694,14 @@ VoicevoxResultCode voicevox_synthesizer_new(const struct VoicevoxOnnxruntime *on /** * ::VoicevoxSynthesizer を破棄(_destruct_)する。 * + * 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 + * + * この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 + * * @param [in] synthesizer 破棄対象 * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また既にこの関数で解放されていてはいけない。 - * - `synthesizer`は以後ダングリングポインタ(_dangling pointer_)として扱われなくてはならない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -709,8 +718,8 @@ void voicevox_synthesizer_delete(struct VoicevoxSynthesizer *synthesizer); * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 - * - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_voice_model_file_close で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 + * - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -728,7 +737,7 @@ VoicevoxResultCode voicevox_synthesizer_load_voice_model(const struct VoicevoxSy * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `model_id`は読み込みについて有効でなければならない。 * } */ @@ -746,7 +755,7 @@ VoicevoxResultCode voicevox_synthesizer_unload_voice_model(const struct Voicevox * @returns ::VoicevoxOnnxruntime のインスタンス * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -762,7 +771,7 @@ const struct VoicevoxOnnxruntime *voicevox_synthesizer_get_onnxruntime(const str * @returns GPUモードかどうか * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -779,7 +788,7 @@ bool voicevox_synthesizer_is_gpu_mode(const struct VoicevoxSynthesizer *synthesi * @returns モデルが読み込まれているかどうか * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `model_id`は読み込みについて有効でなければならない。 * } */ @@ -799,7 +808,7 @@ bool voicevox_synthesizer_is_loaded_voice_model(const struct VoicevoxSynthesizer * @return メタ情報のJSON文字列 * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -859,7 +868,7 @@ VoicevoxResultCode voicevox_onnxruntime_create_supported_devices_json(const stru * } * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `kana`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -894,7 +903,7 @@ VoicevoxResultCode voicevox_synthesizer_create_audio_query_from_kana(const struc * } * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `text`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -930,7 +939,7 @@ VoicevoxResultCode voicevox_synthesizer_create_audio_query(const struct Voicevox * } * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `kana`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -965,7 +974,7 @@ VoicevoxResultCode voicevox_synthesizer_create_accent_phrases_from_kana(const st * } * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `text`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -991,7 +1000,7 @@ VoicevoxResultCode voicevox_synthesizer_create_accent_phrases(const struct Voice * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `accent_phrases_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -1017,7 +1026,7 @@ VoicevoxResultCode voicevox_synthesizer_replace_mora_data(const struct VoicevoxS * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `accent_phrases_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -1043,7 +1052,7 @@ VoicevoxResultCode voicevox_synthesizer_replace_phoneme_length(const struct Voic * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `accent_phrases_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_audio_query_json`は書き込みについて有効でなければならない。 * } @@ -1080,7 +1089,7 @@ struct VoicevoxSynthesisOptions voicevox_make_default_synthesis_options(void); * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `audio_query_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_wav_length`は書き込みについて有効でなければならない。 * - `output_wav`は書き込みについて有効でなければならない。 @@ -1120,7 +1129,7 @@ struct VoicevoxTtsOptions voicevox_make_default_tts_options(void); * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `kana`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_wav_length`は書き込みについて有効でなければならない。 * - `output_wav`は書き込みについて有効でなければならない。 @@ -1151,7 +1160,7 @@ VoicevoxResultCode voicevox_synthesizer_tts_from_kana(const struct VoicevoxSynth * @returns 結果コード * * \safety{ - * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 + * - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 * - `text`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_wav_length`は書き込みについて有効でなければならない。 * - `output_wav`は書き込みについて有効でなければならない。 @@ -1269,7 +1278,7 @@ struct VoicevoxUserDict *voicevox_user_dict_new(void); * @returns 結果コード * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * - `dict_path`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * } */ @@ -1291,7 +1300,7 @@ VoicevoxResultCode voicevox_user_dict_load(const struct VoicevoxUserDict *user_d * @param user_dict は有効な :VoicevoxUserDict のポインタであること * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * - `word->surface`と`word->pronunciation`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * - `output_word_uuid`は書き込みについて有効でなければならない。 * } @@ -1312,7 +1321,7 @@ VoicevoxResultCode voicevox_user_dict_add_word(const struct VoicevoxUserDict *us * @returns 結果コード * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * - `word_uuid`は読み込みについて有効でなければならない。 * - `word->surface`と`word->pronunciation`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * } @@ -1332,7 +1341,7 @@ VoicevoxResultCode voicevox_user_dict_update_word(const struct VoicevoxUserDict * @returns 結果コード * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * - `word_uuid`は読み込みについて有効でなければならない。 * } */ @@ -1352,7 +1361,7 @@ VoicevoxResultCode voicevox_user_dict_remove_word(const struct VoicevoxUserDict * @returns 結果コード * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * - `output_json`は書き込みについて有効でなければならない。 * } */ @@ -1370,7 +1379,7 @@ VoicevoxResultCode voicevox_user_dict_to_json(const struct VoicevoxUserDict *use * @returns 結果コード * * \safety{ - * - `user_dict`と`other_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`と`other_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * } */ #ifdef _WIN32 @@ -1386,7 +1395,7 @@ VoicevoxResultCode voicevox_user_dict_import(const struct VoicevoxUserDict *user * @param [in] path 保存先のファイルパス * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * - `path`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 * } */ @@ -1399,10 +1408,14 @@ VoicevoxResultCode voicevox_user_dict_save(const struct VoicevoxUserDict *user_d /** * ユーザー辞書を破棄(_destruct_)する。 * + * 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 + * + * この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 + * * @param [in] user_dict 破棄対象 * * \safety{ - * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また既にこの関数で解放されていてはいけない。 + * - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 * } */ #ifdef _WIN32 diff --git a/crates/voicevox_core_c_api/src/c_impls.rs b/crates/voicevox_core_c_api/src/c_impls.rs index b29a3f6ad..b56bdcd16 100644 --- a/crates/voicevox_core_c_api/src/c_impls.rs +++ b/crates/voicevox_core_c_api/src/c_impls.rs @@ -141,16 +141,12 @@ fn metas_to_json(metas: &[SpeakerMeta]) -> CString { /// } /// ``` /// -/// `RustApi`そのものではなくこのトレイトのインスタンスをユーザーに渡すようにし、次のユーザー操作に対するセーフティネットを実現する。 +/// `RustApiObject`そのものではなくこのトレイトのインスタンスをユーザーに渡すようにすることで、次のことを実現する。 /// -/// 1. オブジェクトが他スレッドでアクセスされている最中に"delete"を試みる -/// 2. "delete"後に他の通常のメソッド関数の利用を試みる -/// 3. "delete"後に"delete"を試みる -/// -/// ただし次のゲッター関数に関しては機能しない。 -/// -/// - `voicevox_voice_model_file_id` -/// - `voicevox_voice_model_file_get_metas_json` +/// 1. "delete"時に対象オブジェクトに対するアクセスがあった場合、アクセスが終わるまで待つ +/// 2. 次のユーザー操作に対するセーフティネットを張り、パニックするようにする +/// 1. "delete"後に他の通常のメソッド関数の利用を試みる +/// 2. "delete"後に"delete"を試みる pub(crate) trait CApiObject: Default + Debug { type RustApiObject: 'static; @@ -180,10 +176,7 @@ pub(crate) trait CApiObject: Default + Debug { /// # Panics /// - /// 次の場合にパニックする。 - /// - /// * `self`に対して以前にこの関数を呼んでいた場合 - /// * `self`がまだ他で利用中である場合 + /// `self`に対してこの関数を二度呼ぶとパニックする。 fn drop_body(&self) { let body = Self::lock_bodies() .remove(&(self as *const _ as _)) @@ -202,7 +195,7 @@ pub(crate) trait CApiObject: Default + Debug { /// # Panics /// - /// `drop_body`を呼んでいるとパニックする。 + /// `self`に対して`drop_body`を呼んでいるとパニックする。 fn body(&self) -> impl Deref { let body = Self::lock_bodies() .get(&(self as *const _ as _)) diff --git a/crates/voicevox_core_c_api/src/lib.rs b/crates/voicevox_core_c_api/src/lib.rs index dbea536be..6879b89c5 100644 --- a/crates/voicevox_core_c_api/src/lib.rs +++ b/crates/voicevox_core_c_api/src/lib.rs @@ -311,8 +311,8 @@ pub unsafe extern "C" fn voicevox_open_jtalk_rc_new( /// @param [in] user_dict ユーザー辞書 /// /// \safety{ -/// - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならず、また ::voicevox_open_jtalk_rc_delete で解放されていてはいけない。 -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// } #[no_mangle] pub extern "C" fn voicevox_open_jtalk_rc_use_user_dict( @@ -328,6 +328,10 @@ pub extern "C" fn voicevox_open_jtalk_rc_use_user_dict( /// ::OpenJtalkRc を破棄(_destruct_)する。 /// +/// 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 +/// +/// この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 +/// /// @param [in] open_jtalk 破棄対象 /// /// \example{ @@ -337,8 +341,7 @@ pub extern "C" fn voicevox_open_jtalk_rc_use_user_dict( /// } /// /// \safety{ -/// - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならず、また既にこの関数で解放されていてはいけない。 -/// - `open_jtalk`は以後ダングリングポインタ(_dangling pointer_)として扱われなくてはならない。 +/// - `open_jtalk`は ::voicevox_open_jtalk_rc_new で得たものでなければならない。 /// } #[no_mangle] pub unsafe extern "C" fn voicevox_open_jtalk_rc_delete(open_jtalk: NonNull) { @@ -445,7 +448,7 @@ pub unsafe extern "C" fn voicevox_voice_model_file_open( /// @param [out] output_voice_model_id 音声モデルID /// /// \safety{ -/// - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_voice_model_file_close で解放されていてはいけない。 +/// - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 /// - `output_voice_model_id`は書き込みについて有効でなければならない。 /// } #[no_mangle] @@ -467,7 +470,7 @@ pub unsafe extern "C" fn voicevox_voice_model_file_id( /// @returns メタ情報のJSON文字列 /// /// \safety{ -/// - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_voice_model_file_close で解放されていてはいけない。 +/// - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 /// } #[no_mangle] pub extern "C" fn voicevox_voice_model_file_create_metas_json( @@ -479,11 +482,14 @@ pub extern "C" fn voicevox_voice_model_file_create_metas_json( /// ::VoicevoxVoiceModelFile を、所有しているファイルディスクリプタを閉じた上で破棄(_destruct_)する。 /// +/// 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 +/// +/// この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 +/// /// @param [in] model 破棄対象 /// /// \safety{ -/// - `model`は ::voicevox_voice_model_file_open で得たものでなければならず、また既にこの関数で解放されていてはいけない。 -/// - `model`は以後ダングリングポインタ(_dangling pointer_)として扱われなくてはならない。 +/// - `model`は ::voicevox_voice_model_file_open で得たものでなければならない。 /// } #[no_mangle] pub unsafe extern "C" fn voicevox_voice_model_file_close(model: NonNull) { @@ -511,7 +517,7 @@ pub struct VoicevoxSynthesizer { /// /// \safety{ /// - `onnxruntime`は ::voicevox_onnxruntime_load_once または ::voicevox_onnxruntime_init_once で得たものでなければならない。 -/// - `open_jtalk`は ::voicevox_voice_model_file_open で得たものでなければならず、また ::voicevox_open_jtalk_rc_new で解放されていてはいけない。 +/// - `open_jtalk`は ::voicevox_voice_model_file_open で得たものでなければならない。 /// - `out_synthesizer`は書き込みについて有効でなければならない。 /// } #[no_mangle] @@ -533,11 +539,14 @@ pub unsafe extern "C" fn voicevox_synthesizer_new( /// ::VoicevoxSynthesizer を破棄(_destruct_)する。 /// +/// 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 +/// +/// この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 +/// /// @param [in] synthesizer 破棄対象 /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また既にこの関数で解放されていてはいけない。 -/// - `synthesizer`は以後ダングリングポインタ(_dangling pointer_)として扱われなくてはならない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// } #[no_mangle] pub unsafe extern "C" fn voicevox_synthesizer_delete(synthesizer: NonNull) { @@ -553,8 +562,8 @@ pub unsafe extern "C" fn voicevox_synthesizer_delete(synthesizer: NonNull読み込みについて有効でなければならない。 /// } #[no_mangle] @@ -593,7 +602,7 @@ pub extern "C" fn voicevox_synthesizer_unload_voice_model( /// @returns ::VoicevoxOnnxruntime のインスタンス /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// } #[no_mangle] pub extern "C" fn voicevox_synthesizer_get_onnxruntime( @@ -609,7 +618,7 @@ pub extern "C" fn voicevox_synthesizer_get_onnxruntime( /// @returns GPUモードかどうか /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// } #[no_mangle] pub extern "C" fn voicevox_synthesizer_is_gpu_mode(synthesizer: &VoicevoxSynthesizer) -> bool { @@ -625,7 +634,7 @@ pub extern "C" fn voicevox_synthesizer_is_gpu_mode(synthesizer: &VoicevoxSynthes /// @returns モデルが読み込まれているかどうか /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `model_id`は読み込みについて有効でなければならない。 /// } #[no_mangle] @@ -647,7 +656,7 @@ pub extern "C" fn voicevox_synthesizer_is_loaded_voice_model( /// @return メタ情報のJSON文字列 /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// } #[no_mangle] pub extern "C" fn voicevox_synthesizer_create_metas_json( @@ -719,7 +728,7 @@ pub unsafe extern "C" fn voicevox_onnxruntime_create_supported_devices_json( /// } /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `kana`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -767,7 +776,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_create_audio_query_from_kana( /// } /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `text`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -816,7 +825,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_create_audio_query( /// } /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `kana`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -862,7 +871,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_create_accent_phrases_from_kana( /// } /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `text`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -899,7 +908,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_create_accent_phrases( /// @returns 結果コード /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `accent_phrases_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -938,7 +947,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_replace_mora_data( /// @returns 結果コード /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `accent_phrases_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -977,7 +986,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_replace_phoneme_length( /// @returns 結果コード /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `accent_phrases_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_audio_query_json`は書き込みについて有効でなければならない。 /// } @@ -1033,7 +1042,7 @@ pub extern "C" fn voicevox_make_default_synthesis_options() -> VoicevoxSynthesis /// @returns 結果コード /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `audio_query_json`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_wav_length`は書き込みについて有効でなければならない。 /// - `output_wav`は書き込みについて有効でなければならない。 @@ -1093,7 +1102,7 @@ pub extern "C" fn voicevox_make_default_tts_options() -> VoicevoxTtsOptions { /// @returns 結果コード /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `kana`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_wav_length`は書き込みについて有効でなければならない。 /// - `output_wav`は書き込みについて有効でなければならない。 @@ -1134,7 +1143,7 @@ pub unsafe extern "C" fn voicevox_synthesizer_tts_from_kana( /// @returns 結果コード /// /// \safety{ -/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならず、また ::voicevox_synthesizer_delete で解放されていてはいけない。 +/// - `synthesizer`は ::voicevox_synthesizer_new で得たものでなければならない。 /// - `text`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_wav_length`は書き込みについて有効でなければならない。 /// - `output_wav`は書き込みについて有効でなければならない。 @@ -1310,7 +1319,7 @@ pub extern "C" fn voicevox_user_dict_new() -> NonNull { /// @returns 結果コード /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// - `dict_path`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// } #[no_mangle] @@ -1338,7 +1347,7 @@ pub unsafe extern "C" fn voicevox_user_dict_load( /// @param user_dict は有効な :VoicevoxUserDict のポインタであること /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// - `word->surface`と`word->pronunciation`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// - `output_word_uuid`は書き込みについて有効でなければならない。 /// } @@ -1366,7 +1375,7 @@ pub unsafe extern "C" fn voicevox_user_dict_add_word( /// @returns 結果コード /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// - `word_uuid`は読み込みについて有効でなければならない。 /// - `word->surface`と`word->pronunciation`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// } @@ -1393,7 +1402,7 @@ pub unsafe extern "C" fn voicevox_user_dict_update_word( /// @returns 結果コード /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// - `word_uuid`は読み込みについて有効でなければならない。 /// } #[no_mangle] @@ -1419,7 +1428,7 @@ pub extern "C" fn voicevox_user_dict_remove_word( /// @returns 結果コード /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// - `output_json`は書き込みについて有効でなければならない。 /// } #[no_mangle] @@ -1441,7 +1450,7 @@ pub unsafe extern "C" fn voicevox_user_dict_to_json( /// @returns 結果コード /// /// \safety{ -/// - `user_dict`と`other_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`と`other_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// } #[no_mangle] pub extern "C" fn voicevox_user_dict_import( @@ -1461,7 +1470,7 @@ pub extern "C" fn voicevox_user_dict_import( /// @param [in] path 保存先のファイルパス /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また ::voicevox_user_dict_delete で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// - `path`はヌル終端文字列を指し、かつ読み込みについて有効でなければならない。 /// } #[no_mangle] @@ -1479,10 +1488,14 @@ pub unsafe extern "C" fn voicevox_user_dict_save( /// ユーザー辞書を破棄(_destruct_)する。 /// +/// 破棄対象への他スレッドでのアクセスが存在する場合、それらがすべて終わるのを待ってから破棄する。 +/// +/// この関数の呼び出し後に破棄し終えた対象にアクセスすると、プロセスをアボートする。 +/// /// @param [in] user_dict 破棄対象 /// /// \safety{ -/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならず、また既にこの関数で解放されていてはいけない。 +/// - `user_dict`は ::voicevox_user_dict_new で得たものでなければならない。 /// } #[no_mangle] pub unsafe extern "C" fn voicevox_user_dict_delete(user_dict: NonNull) {