1
+ #include < cstdio>
2
+ #include < cstdlib>
3
+ #include < iostream>
4
+ #include < memory>
5
+ #include < filesystem>
6
+
7
+ extern " C" {
8
+ #include " simplevad/simple_vad.h"
9
+ #include " simplevad/period_format.h"
10
+ #include " simplevad/file_cut.h"
11
+ }
12
+ int run (FILE *fp, simple_vad *vad, struct cut_info *cut);
13
+
14
+ int add_period_activity (struct periods *per, int is_active, int is_last);
15
+
16
+ int main (int argc,char ** argv) {
17
+ // default cmake-build-debug/main
18
+ const char filename[] = " ../pcm/16k_1.pcm" ;
19
+ const char output_dir[] = " output_pcm" ;
20
+ const char output_filename_prefix[] = " 16k_1.pcm" ;
21
+ if (!std::filesystem::exists (output_dir)) {
22
+ std::filesystem::create_directories (output_dir);
23
+ }
24
+
25
+ std::unique_ptr<FILE, decltype (&fclose)> fp (fopen (filename, " rb" ), &fclose);
26
+ if (!fp) {
27
+ std::cerr << filename << " does not exist\n " ;
28
+ return 3 ;
29
+ }
30
+
31
+ std::unique_ptr<simple_vad, decltype (&simple_vad_free)> vad (simple_vad_create (), &simple_vad_free);
32
+ if (!vad) {
33
+ return 4 ;
34
+ }
35
+
36
+ std::unique_ptr<FILE, decltype (&fclose)> fp2 (fopen (filename, " rb" ), &fclose);
37
+ std::unique_ptr<struct cut_info , decltype (&cut_info_free)> cut (cut_info_create (fp2.get ()), &cut_info_free);
38
+
39
+ snprintf (cut->output_filename_prefix , sizeof (cut->output_filename_prefix ), " %s" , output_filename_prefix);
40
+ snprintf (cut->output_file_dir , sizeof (cut->output_file_dir ), " %s" , output_dir);
41
+
42
+ int res = run (fp.get (), vad.get (), cut.get ());
43
+
44
+ std::cout << " PROGRAM FINISH\n " ;
45
+ return res;
46
+ }
47
+
48
+ int run (FILE *fp, simple_vad *vad, struct cut_info *cut) {
49
+ int16_t data[FRAME_SIZE];
50
+ int res = 0 ;
51
+ struct periods *per = periods_create ();
52
+
53
+ while (res == 0 ) {
54
+ res = read_int16_bytes (fp, data);
55
+ if (res <= 1 ) {
56
+ int is_last = (res == 1 );
57
+ int is_active = process_vad (vad, data);
58
+ add_period_activity (per, is_active, is_last);
59
+ int vad_file_res = cut_add_vad_activity (cut, is_active, is_last);
60
+ if (vad_file_res < 0 ) {
61
+ std::cout << " file write success " << cut->result_filename << " \n " ;
62
+ }
63
+ } else if (ferror (fp)) {
64
+ std::cout << " read failed ferror result : " << ferror (fp) << " \n " ;
65
+ }
66
+ }
67
+
68
+ periods_free (per);
69
+
70
+ if (res != 1 ) {
71
+ std::cerr << " read file error " << res << " \n " ;
72
+ return res;
73
+ }
74
+ return 0 ;
75
+ }
76
+
77
+ int add_period_activity (struct periods *per, int is_active, int is_last) {
78
+ static int old_is_active = 0 ;
79
+ static int count = 0 ;
80
+ int res_add = period_add_vad_activity (per, is_active, is_last);
81
+ if (res_add != 0 ) {
82
+ return res_add;
83
+ }
84
+ if (is_active != old_is_active) {
85
+ old_is_active = is_active;
86
+ }
87
+ count += 1 ;
88
+ if (is_last) {
89
+ // periods_print(per);
90
+ std::cout << " total frames " << count << " \n " ;
91
+ }
92
+ }
0 commit comments