2626 rb_define_method(cParams, #param_name, ruby_whisper_params_get_ ## param_name, 0); \
2727 rb_define_method(cParams, #param_name "=", ruby_whisper_params_set_ ## param_name, 1);
2828
29- #define RUBY_WHISPER_PARAMS_PARAM_NAMES_COUNT 30
29+ #define RUBY_WHISPER_PARAMS_PARAM_NAMES_COUNT 32
3030
3131extern VALUE cParams ;
3232
@@ -63,6 +63,8 @@ static ID id_new_segment_callback;
6363static ID id_new_segment_callback_user_data ;
6464static ID id_progress_callback ;
6565static ID id_progress_callback_user_data ;
66+ static ID id_encoder_begin_callback ;
67+ static ID id_encoder_begin_callback_user_data ;
6668static ID id_abort_callback ;
6769static ID id_abort_callback_user_data ;
6870
@@ -126,6 +128,33 @@ static void progress_callback(struct whisper_context *ctx, struct whisper_state
126128 }
127129}
128130
131+ static bool encoder_begin_callback (struct whisper_context * ctx , struct whisper_state * state , void * user_data ) {
132+ const ruby_whisper_callback_container * container = (ruby_whisper_callback_container * )user_data ;
133+ bool is_aborted = false;
134+ VALUE result ;
135+
136+ // Currently, doesn't support state because
137+ // those require to resolve GC-related problems.
138+ if (!NIL_P (container -> callback )) {
139+ result = rb_funcall (container -> callback , id_call , 3 , * container -> context , Qnil , container -> user_data );
140+ if (result == Qfalse ) {
141+ is_aborted = true;
142+ }
143+ }
144+ const long callbacks_len = RARRAY_LEN (container -> callbacks );
145+ if (0 == callbacks_len ) {
146+ return !is_aborted ;
147+ }
148+ for (int j = 0 ; j < callbacks_len ; j ++ ) {
149+ VALUE cb = rb_ary_entry (container -> callbacks , j );
150+ result = rb_funcall (cb , id_call , 0 );
151+ if (result == Qfalse ) {
152+ is_aborted = true;
153+ }
154+ }
155+ return !is_aborted ;
156+ }
157+
129158static bool abort_callback (void * user_data ) {
130159 const ruby_whisper_callback_container * container = (ruby_whisper_callback_container * )user_data ;
131160 if (!NIL_P (container -> callback )) {
@@ -161,6 +190,12 @@ void register_callbacks(ruby_whisper_params * rwp, VALUE * context) {
161190 rwp -> params .progress_callback_user_data = rwp -> progress_callback_container ;
162191 }
163192
193+ if (!NIL_P (rwp -> encoder_begin_callback_container -> callback ) || 0 != RARRAY_LEN (rwp -> encoder_begin_callback_container -> callbacks )) {
194+ rwp -> encoder_begin_callback_container -> context = context ;
195+ rwp -> params .encoder_begin_callback = encoder_begin_callback ;
196+ rwp -> params .encoder_begin_callback_user_data = rwp -> encoder_begin_callback_container ;
197+ }
198+
164199 if (!NIL_P (rwp -> abort_callback_container -> callback ) || 0 != RARRAY_LEN (rwp -> abort_callback_container -> callbacks )) {
165200 rwp -> abort_callback_container -> context = context ;
166201 rwp -> params .abort_callback = abort_callback ;
@@ -173,6 +208,7 @@ rb_whisper_params_mark(ruby_whisper_params *rwp)
173208{
174209 rb_whisper_callbcack_container_mark (rwp -> new_segment_callback_container );
175210 rb_whisper_callbcack_container_mark (rwp -> progress_callback_container );
211+ rb_whisper_callbcack_container_mark (rwp -> encoder_begin_callback_container );
176212 rb_whisper_callbcack_container_mark (rwp -> abort_callback_container );
177213}
178214
@@ -198,6 +234,7 @@ ruby_whisper_params_allocate(VALUE klass)
198234 rwp -> diarize = false;
199235 rwp -> new_segment_callback_container = rb_whisper_callback_container_allocate ();
200236 rwp -> progress_callback_container = rb_whisper_callback_container_allocate ();
237+ rwp -> encoder_begin_callback_container = rb_whisper_callback_container_allocate ();
201238 rwp -> abort_callback_container = rb_whisper_callback_container_allocate ();
202239 return Data_Wrap_Struct (klass , rb_whisper_params_mark , rb_whisper_params_free , rwp );
203240}
@@ -849,6 +886,57 @@ ruby_whisper_params_set_progress_callback_user_data(VALUE self, VALUE value)
849886 rwp -> progress_callback_container -> user_data = value ;
850887 return value ;
851888}
889+
890+ static VALUE
891+ ruby_whisper_params_get_encoder_begin_callback (VALUE self )
892+ {
893+ ruby_whisper_params * rwp ;
894+ Data_Get_Struct (self , ruby_whisper_params , rwp );
895+ return rwp -> encoder_begin_callback_container -> callback ;
896+ }
897+
898+ /*
899+ * Sets encoder begin callback, called when the encoder starts.
900+ *
901+ * params.encoder_begin_callback = ->(context, _, user_data) {
902+ * # ...
903+ * }
904+ *
905+ * call-seq:
906+ * encoder_begin_callback = callback -> callback
907+ */
908+ static VALUE
909+ ruby_whisper_params_set_encoder_begin_callback (VALUE self , VALUE value )
910+ {
911+ ruby_whisper_params * rwp ;
912+ Data_Get_Struct (self , ruby_whisper_params , rwp );
913+ rwp -> encoder_begin_callback_container -> callback = value ;
914+ return value ;
915+ }
916+
917+ static VALUE
918+ ruby_whisper_params_get_encoder_begin_callback_user_data (VALUE self )
919+ {
920+ ruby_whisper_params * rwp ;
921+ Data_Get_Struct (self , ruby_whisper_params , rwp );
922+ return rwp -> encoder_begin_callback_container -> user_data ;
923+ }
924+
925+ /*
926+ * Sets user data passed to the last argument of encoder begin callback.
927+ *
928+ * call-seq:
929+ * encoder_begin_callback_user_data = user_data -> use_data
930+ */
931+ static VALUE
932+ ruby_whisper_params_set_encoder_begin_callback_user_data (VALUE self , VALUE value )
933+ {
934+ ruby_whisper_params * rwp ;
935+ Data_Get_Struct (self , ruby_whisper_params , rwp );
936+ rwp -> encoder_begin_callback_container -> user_data = value ;
937+ return value ;
938+ }
939+
852940static VALUE
853941ruby_whisper_params_get_abort_callback (VALUE self )
854942{
@@ -958,6 +1046,8 @@ ruby_whisper_params_initialize(int argc, VALUE *argv, VALUE self)
9581046 SET_PARAM_IF_SAME (new_segment_callback_user_data )
9591047 SET_PARAM_IF_SAME (progress_callback )
9601048 SET_PARAM_IF_SAME (progress_callback_user_data )
1049+ SET_PARAM_IF_SAME (encoder_begin_callback )
1050+ SET_PARAM_IF_SAME (encoder_begin_callback_user_data )
9611051 SET_PARAM_IF_SAME (abort_callback )
9621052 SET_PARAM_IF_SAME (abort_callback_user_data )
9631053 }
@@ -1008,6 +1098,26 @@ ruby_whisper_params_on_progress(VALUE self)
10081098 return Qnil ;
10091099}
10101100
1101+ /*
1102+ * Hook called when the encoder starts.
1103+ *
1104+ * whisper.on_encoder_begin do
1105+ * # ...
1106+ * end
1107+ *
1108+ * call-seq:
1109+ * on_encoder_begin { ... }
1110+ */
1111+ static VALUE
1112+ ruby_whisper_params_on_encoder_begin (VALUE self )
1113+ {
1114+ ruby_whisper_params * rws ;
1115+ Data_Get_Struct (self , ruby_whisper_params , rws );
1116+ const VALUE blk = rb_block_proc ();
1117+ rb_ary_push (rws -> encoder_begin_callback_container -> callbacks , blk );
1118+ return Qnil ;
1119+ }
1120+
10111121/*
10121122 * Call block to determine whether abort or not. Return +true+ when you want to abort.
10131123 *
@@ -1068,10 +1178,13 @@ init_ruby_whisper_params(VALUE *mWhisper)
10681178 DEFINE_PARAM (new_segment_callback_user_data , 25 )
10691179 DEFINE_PARAM (progress_callback , 26 )
10701180 DEFINE_PARAM (progress_callback_user_data , 27 )
1071- DEFINE_PARAM (abort_callback , 28 )
1072- DEFINE_PARAM (abort_callback_user_data , 29 )
1181+ DEFINE_PARAM (encoder_begin_callback , 28 )
1182+ DEFINE_PARAM (encoder_begin_callback_user_data , 29 )
1183+ DEFINE_PARAM (abort_callback , 30 )
1184+ DEFINE_PARAM (abort_callback_user_data , 31 )
10731185
10741186 rb_define_method (cParams , "on_new_segment" , ruby_whisper_params_on_new_segment , 0 );
10751187 rb_define_method (cParams , "on_progress" , ruby_whisper_params_on_progress , 0 );
1188+ rb_define_method (cParams , "on_encoder_begin" , ruby_whisper_params_on_encoder_begin , 0 );
10761189 rb_define_method (cParams , "abort_on" , ruby_whisper_params_abort_on , 0 );
10771190}
0 commit comments