Skip to content

Commit 38ed0e3

Browse files
committed
Add Whisper.set_log
1 parent 6f3acab commit 38ed0e3

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

bindings/ruby/ext/ruby_whisper.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ static ID id_call;
4141
static ID id___method__;
4242
static 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+
91126
static 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

Comments
 (0)