File size: 3,927 Bytes
bfdf803
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#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);
}