rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c
Go to the documentation of this file.
1 /*
2  Copyright 2021 Picovoice Inc.
3 
4  You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE"
5  file accompanying this source.
6 
7  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
8  an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
9  specific language governing permissions and limitations under the License.
10 */
11 
12 #include <stdarg.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <time.h>
16 
17 #include "pv_circular_buffer.h"
18 
19 static char error_message[256] = {0};
20 
21 static const char *test_error_message(const char *message, va_list args) {
22  vsnprintf(error_message, sizeof(error_message) / sizeof (error_message[0]), message, args);
23  return error_message;
24 }
25 
26 static void check_condition(bool condition, const char *function, int32_t line, const char *message, ...) {
27  if (condition == 0) {
28  va_list args;
29  va_start(args, message);
30  fprintf(stderr, "%s:%s():at_line %d: %s", __FILE__, function, line, test_error_message(message, args));
31  va_end(args);
32  exit(1);
33  }
34 }
35 
36 static void test_pv_circular_buffer_once(void) {
38  pv_circular_buffer_status_t status = pv_circular_buffer_init(128, sizeof(int16_t), &cb);
39  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to initialize buffer.");
40 
41  int16_t in_buffer[] = {5, 7, -20, 35, 70};
42  int32_t in_size = sizeof(in_buffer) / sizeof(in_buffer[0]);
43 
44  int32_t out_size = in_size;
45  int16_t *out_buffer = malloc(out_size * sizeof(int16_t));
46  check_condition(out_buffer != NULL, __FUNCTION__, __LINE__, "Failed to allocate memory.");
47 
48  status = pv_circular_buffer_write(cb, in_buffer, in_size);
49  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to write buffer.");
50 
51  int32_t length = pv_circular_buffer_read(cb, out_buffer, out_size);
52  check_condition(length == out_size, __FUNCTION__ , __LINE__, "Read and write buffers have different sizes.");
53 
54  for (int32_t i = 0; i < in_size; i++) {
55  check_condition(in_buffer[i] == out_buffer[i],
56  __FUNCTION__ ,
57  __LINE__,
58  "Read and write buffers have different values at index %d with values: in_buffer: %d, out_buffer: %d",
59  i,
60  in_buffer[i],
61  out_buffer[i]);
62  }
63 
64  free(out_buffer);
66 }
67 
70  pv_circular_buffer_status_t status = pv_circular_buffer_init(128, sizeof(int16_t), &cb);
71  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to initialize buffer.");
72 
73  int32_t out_size = 5;
74  int16_t *out_buffer = malloc(out_size * sizeof(int16_t));
75  check_condition(out_buffer != NULL, __FUNCTION__, __LINE__, "Failed to allocate memory.");
76 
77  int32_t length = pv_circular_buffer_read(cb, out_buffer, out_size);
78  check_condition(length == 0, __FUNCTION__ , __LINE__, "Expected buffer size to be 0.");
79 
80  free(out_buffer);
82 }
83 
87  10,
88  sizeof(int16_t),
89  &cb);
90  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to initialize buffer.");
91 
92  int16_t in_buffer[] = {5, 7, -20, 35, 70, 100, 0, 1, -100};
93  int32_t in_size = sizeof(in_buffer) / sizeof(in_buffer[0]);
94 
95  status = pv_circular_buffer_write(cb, in_buffer, in_size);
96  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to write to buffer.");
97 
98  status = pv_circular_buffer_write(cb, in_buffer, in_size);
99  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_WRITE_OVERFLOW, __FUNCTION__ , __LINE__, "Expected write overflow.");
100 
102 }
103 
106  pv_circular_buffer_status_t status = pv_circular_buffer_init(2048, sizeof(int16_t), &cb);
107  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to initialize buffer.");
108 
109  int32_t in_size = 512;
110  int16_t in_buffer[in_size];
111  for (int32_t i = 0; i < in_size; i++) {
112  in_buffer[i] = (int16_t) ((rand() % (2000 + 1)) - 1000);
113  }
114 
115  int32_t out_size = in_size;
116  int16_t *out_buffer = malloc(out_size * sizeof(int16_t));
117  check_condition(out_buffer != NULL, __FUNCTION__, __LINE__, "Failed to allocate memory.");
118 
119  for (int32_t i = 0; i < 10; i++) {
120  pv_circular_buffer_write(cb, in_buffer, in_size);
121  int32_t length = pv_circular_buffer_read(cb, out_buffer, out_size);
122  check_condition(length == out_size, __FUNCTION__ , __LINE__, "Read buffer received different sizes.");
123  for (int32_t j = 0; j < in_size; j++) {
124  check_condition(in_buffer[i] == out_buffer[i],
125  __FUNCTION__ ,
126  __LINE__,
127  "Read and write buffers have different values at index %d with values: in_buffer: %d, out_buffer: %d",
128  i,
129  in_buffer[i],
130  out_buffer[i]);
131  }
132  }
133 
134  free(out_buffer);
136 }
137 
140  pv_circular_buffer_status_t status = pv_circular_buffer_init(12, sizeof(int16_t), &cb);
141  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to initialize buffer.");
142 
143  int32_t in_size = 64;
144  int16_t in_buffer[in_size];
145  for (int32_t i = 0; i < in_size; i++) {
146  in_buffer[i] = (int16_t) ((rand() % (2000 + 1)) - 1000);
147  }
148 
149  int32_t out_size = in_size;
150  int16_t *out_buffer = malloc(out_size * sizeof(int16_t));
151  check_condition(out_buffer != NULL, __FUNCTION__, __LINE__, "Failed to allocate memory.");
152 
153  for (int32_t i = 0; i < in_size; i++) {
154  status = pv_circular_buffer_write(cb, in_buffer + i, 1);
155  check_condition(status == PV_CIRCULAR_BUFFER_STATUS_SUCCESS, __FUNCTION__ , __LINE__, "Failed to write to buffer.");
156 
157  int32_t length = pv_circular_buffer_read(cb, out_buffer + i, 1);
158  check_condition(length == 1, __FUNCTION__ , __LINE__, "Buffer read received incorrect output length.");
159 
160  check_condition(in_buffer[i] == out_buffer[i], __FUNCTION__ , __LINE__, "Buffer have incorrect sizes.");
161  }
162 
163  free(out_buffer);
165 }
166 
167 int main() {
168  srand(time(NULL));
169 
175 
176  return 0;
177 }
PV_CIRCULAR_BUFFER_STATUS_WRITE_OVERFLOW
@ PV_CIRCULAR_BUFFER_STATUS_WRITE_OVERFLOW
Definition: porcupine/demo/c/pvrecorder/include/pv_circular_buffer.h:30
pv_circular_buffer_read
int32_t pv_circular_buffer_read(pv_circular_buffer_t *object, void *buffer, int32_t length)
Definition: porcupine/demo/c/pvrecorder/src/pv_circular_buffer.c:68
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
pv_circular_buffer_status_t
pv_circular_buffer_status_t
Definition: porcupine/demo/c/pvrecorder/include/pv_circular_buffer.h:26
test_pv_circular_buffer_once
static void test_pv_circular_buffer_once(void)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:36
time.h
PV_CIRCULAR_BUFFER_STATUS_SUCCESS
@ PV_CIRCULAR_BUFFER_STATUS_SUCCESS
Definition: porcupine/demo/c/pvrecorder/include/pv_circular_buffer.h:27
test_pv_circular_buffer_write_overflow
static void test_pv_circular_buffer_write_overflow(void)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:84
main
int main()
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:167
pv_circular_buffer_delete
void pv_circular_buffer_delete(pv_circular_buffer_t *object)
Definition: porcupine/demo/c/pvrecorder/src/pv_circular_buffer.c:61
test_pv_circular_buffer_read_incomplete
static void test_pv_circular_buffer_read_incomplete(void)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:68
pv_circular_buffer_init
pv_circular_buffer_status_t pv_circular_buffer_init(int32_t capacity, int32_t element_size, pv_circular_buffer_t **object)
Definition: porcupine/demo/c/pvrecorder/src/pv_circular_buffer.c:26
pv_circular_buffer
Definition: porcupine/demo/c/pvrecorder/src/pv_circular_buffer.c:17
test_pv_circular_buffer_read_write
static void test_pv_circular_buffer_read_write(void)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:104
test_error_message
static const char * test_error_message(const char *message, va_list args)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:21
check_condition
static void check_condition(bool condition, const char *function, int32_t line, const char *message,...)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:26
test_pv_circular_buffer_read_write_one_by_one
static void test_pv_circular_buffer_read_write_one_by_one(void)
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:138
args
error_message
static char error_message[256]
Definition: rhino/demo/c/pvrecorder/test/test_pv_circular_buffer.c:19
pv_circular_buffer_write
pv_circular_buffer_status_t pv_circular_buffer_write(pv_circular_buffer_t *object, const void *buffer, int32_t length)
Definition: porcupine/demo/c/pvrecorder/src/pv_circular_buffer.c:108


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:55