@@ -41,6 +41,8 @@ static ID id_call;
4141static ID id___method__;
4242static ID id_to_enum;
4343
44+ static bool is_log_callback_finalized = false ;
45+
4446/*
4547 * call-seq:
4648 * lang_max_id -> Integer
@@ -88,6 +90,39 @@ static VALUE ruby_whisper_s_lang_str_full(VALUE self, VALUE id) {
8890 return rb_str_new2 (str_full);
8991}
9092
93+ static VALUE ruby_whisper_s_finalize_log_callback (VALUE self, VALUE id) {
94+ is_log_callback_finalized = true ;
95+ return Qnil;
96+ }
97+
98+ /*
99+ * call-seq:
100+ * log_set ->(level, buffer, user_data) { ... }, user_data -> nil
101+ */
102+ static VALUE ruby_whisper_s_log_set (VALUE self, VALUE log_callback, VALUE user_data) {
103+ VALUE old_callback = rb_iv_get (self, " @log_callback" );
104+ if (!NIL_P (old_callback)) {
105+ rb_undefine_finalizer (old_callback);
106+ }
107+
108+ rb_iv_set (self, " @log_callback" , log_callback);
109+ rb_iv_set (self, " @user_data" , user_data);
110+
111+ VALUE finalize_log_callback = rb_funcall (mWhisper , rb_intern (" method" ), 1 , rb_str_new2 (" finalize_log_callback" ));
112+ rb_define_finalizer (log_callback, finalize_log_callback);
113+
114+ whisper_log_set ([](ggml_log_level level, const char * buffer, void * user_data) {
115+ if (is_log_callback_finalized) {
116+ return ;
117+ }
118+ VALUE log_callback = rb_iv_get (mWhisper , " @log_callback" );
119+ VALUE udata = rb_iv_get (mWhisper , " @user_data" );
120+ rb_funcall (log_callback, id_call, 3 , INT2NUM (level), rb_str_new2 (buffer), udata);
121+ }, nullptr );
122+
123+ return Qnil;
124+ }
125+
91126static void ruby_whisper_free (ruby_whisper *rw) {
92127 if (rw->context ) {
93128 whisper_free (rw->context );
@@ -1471,6 +1506,8 @@ void Init_whisper() {
14711506 rb_define_singleton_method (mWhisper , " lang_id" , ruby_whisper_s_lang_id, 1 );
14721507 rb_define_singleton_method (mWhisper , " lang_str" , ruby_whisper_s_lang_str, 1 );
14731508 rb_define_singleton_method (mWhisper , " lang_str_full" , ruby_whisper_s_lang_str_full, 1 );
1509+ rb_define_singleton_method (mWhisper , " log_set" , ruby_whisper_s_log_set, 2 );
1510+ rb_define_singleton_method (mWhisper , " finalize_log_callback" , ruby_whisper_s_finalize_log_callback, 1 );
14741511
14751512 rb_define_alloc_func (cContext, ruby_whisper_allocate);
14761513 rb_define_method (cContext, " initialize" , ruby_whisper_initialize, -1 );
0 commit comments