| | #include <ruby.h> |
| | #include "ruby_whisper.h" |
| |
|
| | #define N_KEY_NAMES 2 |
| |
|
| | extern VALUE cVADSegment; |
| |
|
| | extern const rb_data_type_t ruby_whisper_vad_segments_type; |
| |
|
| | static VALUE sym_start_time; |
| | static VALUE sym_end_time; |
| | static VALUE key_names; |
| |
|
| | static void |
| | rb_whisper_vad_segment_mark(void *p) |
| | { |
| | ruby_whisper_vad_segment *rwvs = (ruby_whisper_vad_segment *)p; |
| | rb_gc_mark(rwvs->segments); |
| | } |
| |
|
| | static size_t |
| | ruby_whisper_vad_segment_memsize(const void *p) |
| | { |
| | const ruby_whisper_vad_segment *rwvs = p; |
| | size_t size = sizeof(rwvs); |
| | if (!rwvs) { |
| | return 0; |
| | } |
| | if (rwvs->index) { |
| | size += sizeof(rwvs->index); |
| | } |
| | return size; |
| | } |
| |
|
| | static const rb_data_type_t ruby_whisper_vad_segment_type = { |
| | "ruby_whisper_vad_segment", |
| | {rb_whisper_vad_segment_mark, RUBY_DEFAULT_FREE, ruby_whisper_vad_segment_memsize,}, |
| | 0, 0, |
| | 0 |
| | }; |
| |
|
| | static VALUE |
| | ruby_whisper_vad_segment_s_allocate(VALUE klass) |
| | { |
| | ruby_whisper_vad_segment *rwvs; |
| | VALUE obj = TypedData_Make_Struct(klass, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs); |
| | rwvs->segments = Qnil; |
| | rwvs->index = -1; |
| | return obj; |
| | } |
| |
|
| | VALUE |
| | rb_whisper_vad_segment_s_new(VALUE segments, int index) |
| | { |
| | ruby_whisper_vad_segment *rwvs; |
| | const VALUE segment = ruby_whisper_vad_segment_s_allocate(cVADSegment); |
| | TypedData_Get_Struct(segment, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs); |
| | rwvs->segments = segments; |
| | rwvs->index = index; |
| | return segment; |
| | } |
| |
|
| | static VALUE |
| | ruby_whisper_vad_segment_get_start_time(VALUE self) |
| | { |
| | ruby_whisper_vad_segment *rwvs; |
| | ruby_whisper_vad_segments *rwvss; |
| | float t0; |
| |
|
| | TypedData_Get_Struct(self, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs); |
| | TypedData_Get_Struct(rwvs->segments, ruby_whisper_vad_segments, &ruby_whisper_vad_segments_type, rwvss); |
| | t0 = whisper_vad_segments_get_segment_t0(rwvss->segments, rwvs->index); |
| | return DBL2NUM(t0 * 10); |
| | } |
| |
|
| | static VALUE |
| | ruby_whisper_vad_segment_get_end_time(VALUE self) |
| | { |
| | ruby_whisper_vad_segment *rwvs; |
| | ruby_whisper_vad_segments *rwvss; |
| | float t1; |
| |
|
| | TypedData_Get_Struct(self, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs); |
| | TypedData_Get_Struct(rwvs->segments, ruby_whisper_vad_segments, &ruby_whisper_vad_segments_type, rwvss); |
| | t1 = whisper_vad_segments_get_segment_t1(rwvss->segments, rwvs->index); |
| | return DBL2NUM(t1 * 10); |
| | } |
| |
|
| | static VALUE |
| | ruby_whisper_vad_segment_deconstruct_keys(VALUE self, VALUE keys) |
| | { |
| | ruby_whisper_vad_segment *rwvs; |
| | ruby_whisper_vad_segments *rwvss; |
| | VALUE hash, key; |
| | long n_keys; |
| | int i; |
| |
|
| | TypedData_Get_Struct(self, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs); |
| | TypedData_Get_Struct(rwvs->segments, ruby_whisper_vad_segments, &ruby_whisper_vad_segments_type, rwvss); |
| |
|
| | hash = rb_hash_new(); |
| | if (NIL_P(keys)) { |
| | keys = key_names; |
| | n_keys = N_KEY_NAMES; |
| | } else { |
| | n_keys = RARRAY_LEN(keys); |
| | if (n_keys > N_KEY_NAMES) { |
| | return hash; |
| | } |
| | } |
| | for (i = 0; i < n_keys; i++) { |
| | key = rb_ary_entry(keys, i); |
| | if (key == sym_start_time) { |
| | rb_hash_aset(hash, key, ruby_whisper_vad_segment_get_start_time(self)); |
| | } |
| | if (key == sym_end_time) { |
| | rb_hash_aset(hash, key, ruby_whisper_vad_segment_get_end_time(self)); |
| | } |
| | } |
| |
|
| | return hash; |
| | } |
| |
|
| | void |
| | init_ruby_whisper_vad_segment(VALUE *mVAD) |
| | { |
| | cVADSegment = rb_define_class_under(*mVAD, "Segment", rb_cObject); |
| |
|
| | sym_start_time = ID2SYM(rb_intern("start_time")); |
| | sym_end_time = ID2SYM(rb_intern("end_time")); |
| | key_names = rb_ary_new3( |
| | N_KEY_NAMES, |
| | sym_start_time, |
| | sym_end_time |
| | ); |
| |
|
| | rb_define_alloc_func(cVADSegment, ruby_whisper_vad_segment_s_allocate); |
| | rb_define_method(cVADSegment, "start_time", ruby_whisper_vad_segment_get_start_time, 0); |
| | rb_define_method(cVADSegment, "end_time", ruby_whisper_vad_segment_get_end_time, 0); |
| | rb_define_method(cVADSegment, "deconstruct_keys", ruby_whisper_vad_segment_deconstruct_keys, 1); |
| | } |
| |
|