Lines Matching refs:bat
25 #include "bat-signal.h"
36 static float sumaudio(struct bat *bat, short int *buffer, int frames)
44 for (n = 0; n < bat->channels; n++) {
50 sum = sum / bat->channels;
55 static void play_and_listen(struct bat *bat, void *buffer, int frames)
63 int num = bat->latency.number;
65 averageinput = (int) (sumaudio(bat, buffer, frames) / frames);
69 if (averageinput > bat->latency.threshold) {
74 if (*input++ > bat->latency.threshold)
76 *input += bat->channels;
81 bat->latency.samples += n;
84 if (bat->latency.samples > frames) {
85 bat->latency.result[num - 1] =
86 (float) bat->latency.samples * 1000 / bat->rate;
87 fprintf(bat->log,
90 (int) bat->latency.result[num - 1]);
93 if (bat->latency.result[n] > max)
94 max = bat->latency.result[n];
95 if (bat->latency.result[n] < min)
96 min = bat->latency.result[n];
97 sum += bat->latency.result[n];
102 bat->latency.state =
104 bat->latency.is_capturing = false;
109 bat->latency.final_result =
111 fprintf(bat->log,
113 bat->latency.final_result);
115 bat->latency.state =
117 bat->latency.is_capturing = false;
122 bat->latency.state = LATENCY_STATE_WAITING;
124 bat->latency.number++;
128 bat->latency.state = LATENCY_STATE_WAITING;
132 bat->latency.samples += frames;
136 if ((unsigned int)bat->latency.samples > bat->rate) {
137 bat->latency.error++;
139 if (bat->latency.error > LATENCY_TEST_NUMBER) {
140 fprintf(bat->err,
142 fprintf(bat->err,
144 bat->latency.state =
146 bat->latency.is_capturing = false;
151 bat->latency.state = LATENCY_STATE_WAITING;
158 static void calculate_threshold(struct bat *bat)
165 average = bat->latency.sum / bat->latency.samples / 32767.0f;
167 bat->latency.threshold = (int) (powf(10.0f, reference / 20.0f)
171 void roundtrip_latency_init(struct bat *bat)
173 bat->latency.number = 1;
174 bat->latency.state = LATENCY_STATE_MEASURE_FOR_1_SECOND;
175 bat->latency.final_result = 0;
176 bat->latency.samples = 0;
177 bat->latency.sum = 0;
178 bat->latency.threshold = 0;
179 bat->latency.is_capturing = false;
180 bat->latency.is_playing = false;
181 bat->latency.error = 0;
182 bat->latency.xrun_error = false;
183 bat->frames = LATENCY_TEST_TIME_LIMIT * bat->rate;
184 bat->periods_played = 0;
187 int handleinput(struct bat *bat, void *buffer, int frames)
189 switch (bat->latency.state) {
192 bat->latency.sum += sumaudio(bat, buffer, frames);
193 bat->latency.samples += frames;
196 if ((unsigned int)bat->latency.samples >= bat->rate) {
197 calculate_threshold(bat);
198 bat->latency.state = LATENCY_STATE_PLAY_AND_LISTEN;
199 bat->latency.samples = 0;
200 bat->latency.sum = 0;
206 play_and_listen(bat, buffer, frames);
211 bat->latency.samples += frames;
213 if ((unsigned int)bat->latency.samples > bat->rate) {
215 bat->latency.samples = 0;
216 bat->latency.state = LATENCY_STATE_MEASURE_FOR_1_SECOND;
227 int handleoutput(struct bat *bat, void *buffer, int bytes, int frames)
232 if (bat->periods_played * frames > 2 * bat->rate
233 && bat->latency.is_capturing == false)
234 return bat->latency.state;
236 if (bat->latency.state == LATENCY_STATE_PLAY_AND_LISTEN)
237 err = generate_sine_wave(bat, frames, buffer);