26
26
rb_define_method(cParams, #param_name, ruby_whisper_params_get_ ## param_name, 0); \
27
27
rb_define_method(cParams, #param_name "=", ruby_whisper_params_set_ ## param_name, 1);
28
28
29
- #define RUBY_WHISPER_PARAMS_PARAM_NAMES_COUNT 30
29
+ #define RUBY_WHISPER_PARAMS_PARAM_NAMES_COUNT 32
30
30
31
31
extern VALUE cParams ;
32
32
@@ -63,6 +63,8 @@ static ID id_new_segment_callback;
63
63
static ID id_new_segment_callback_user_data ;
64
64
static ID id_progress_callback ;
65
65
static ID id_progress_callback_user_data ;
66
+ static ID id_encoder_begin_callback ;
67
+ static ID id_encoder_begin_callback_user_data ;
66
68
static ID id_abort_callback ;
67
69
static ID id_abort_callback_user_data ;
68
70
@@ -126,6 +128,33 @@ static void progress_callback(struct whisper_context *ctx, struct whisper_state
126
128
}
127
129
}
128
130
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
+
129
158
static bool abort_callback (void * user_data ) {
130
159
const ruby_whisper_callback_container * container = (ruby_whisper_callback_container * )user_data ;
131
160
if (!NIL_P (container -> callback )) {
@@ -161,6 +190,12 @@ void register_callbacks(ruby_whisper_params * rwp, VALUE * context) {
161
190
rwp -> params .progress_callback_user_data = rwp -> progress_callback_container ;
162
191
}
163
192
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
+
164
199
if (!NIL_P (rwp -> abort_callback_container -> callback ) || 0 != RARRAY_LEN (rwp -> abort_callback_container -> callbacks )) {
165
200
rwp -> abort_callback_container -> context = context ;
166
201
rwp -> params .abort_callback = abort_callback ;
@@ -173,6 +208,7 @@ rb_whisper_params_mark(ruby_whisper_params *rwp)
173
208
{
174
209
rb_whisper_callbcack_container_mark (rwp -> new_segment_callback_container );
175
210
rb_whisper_callbcack_container_mark (rwp -> progress_callback_container );
211
+ rb_whisper_callbcack_container_mark (rwp -> encoder_begin_callback_container );
176
212
rb_whisper_callbcack_container_mark (rwp -> abort_callback_container );
177
213
}
178
214
@@ -198,6 +234,7 @@ ruby_whisper_params_allocate(VALUE klass)
198
234
rwp -> diarize = false;
199
235
rwp -> new_segment_callback_container = rb_whisper_callback_container_allocate ();
200
236
rwp -> progress_callback_container = rb_whisper_callback_container_allocate ();
237
+ rwp -> encoder_begin_callback_container = rb_whisper_callback_container_allocate ();
201
238
rwp -> abort_callback_container = rb_whisper_callback_container_allocate ();
202
239
return Data_Wrap_Struct (klass , rb_whisper_params_mark , rb_whisper_params_free , rwp );
203
240
}
@@ -849,6 +886,57 @@ ruby_whisper_params_set_progress_callback_user_data(VALUE self, VALUE value)
849
886
rwp -> progress_callback_container -> user_data = value ;
850
887
return value ;
851
888
}
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
+
852
940
static VALUE
853
941
ruby_whisper_params_get_abort_callback (VALUE self )
854
942
{
@@ -958,6 +1046,8 @@ ruby_whisper_params_initialize(int argc, VALUE *argv, VALUE self)
958
1046
SET_PARAM_IF_SAME (new_segment_callback_user_data )
959
1047
SET_PARAM_IF_SAME (progress_callback )
960
1048
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 )
961
1051
SET_PARAM_IF_SAME (abort_callback )
962
1052
SET_PARAM_IF_SAME (abort_callback_user_data )
963
1053
}
@@ -1008,6 +1098,26 @@ ruby_whisper_params_on_progress(VALUE self)
1008
1098
return Qnil ;
1009
1099
}
1010
1100
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
+
1011
1121
/*
1012
1122
* Call block to determine whether abort or not. Return +true+ when you want to abort.
1013
1123
*
@@ -1068,10 +1178,13 @@ init_ruby_whisper_params(VALUE *mWhisper)
1068
1178
DEFINE_PARAM (new_segment_callback_user_data , 25 )
1069
1179
DEFINE_PARAM (progress_callback , 26 )
1070
1180
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 )
1073
1185
1074
1186
rb_define_method (cParams , "on_new_segment" , ruby_whisper_params_on_new_segment , 0 );
1075
1187
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 );
1076
1189
rb_define_method (cParams , "abort_on" , ruby_whisper_params_abort_on , 0 );
1077
1190
}
0 commit comments