]> code.delx.au - pulseaudio/blob - src/modules/module-equalizer-sink.c
module-equalizer-sink: fixed equalizer state save/restore
[pulseaudio] / src / modules / module-equalizer-sink.c
1 /***
2 This file is part of PulseAudio.
3
4 This module is based off Lennart Poettering's LADSPA sink and swaps out
5 LADSPA functionality for a dbus-aware STFT OLA based digital equalizer.
6 All new work is published under Pulseaudio's original license.
7 Copyright 2009 Jason Newton <nevion@gmail.com>
8
9 Original Author:
10 Copyright 2004-2008 Lennart Poettering
11
12 PulseAudio is free software; you can redistribute it and/or modify
13 it under the terms of the GNU Lesser General Public License as published
14 by the Free Software Foundation; either version 2.1 of the License,
15 or (at your option) any later version.
16
17 PulseAudio is distributed in the hope that it will be useful, but
18 WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 General Public License for more details.
21
22 You should have received a copy of the GNU Lesser General Public License
23 along with PulseAudio; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 USA.
26 ***/
27
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include <float.h>
35 #include <math.h>
36 #include <fftw3.h>
37 #include <string.h>
38
39 #include <pulse/xmalloc.h>
40 #include <pulse/i18n.h>
41 #include <pulse/timeval.h>
42
43 #include <pulsecore/core-rtclock.h>
44 #include <pulsecore/aupdate.h>
45 #include <pulsecore/core-error.h>
46 #include <pulsecore/namereg.h>
47 #include <pulsecore/sink.h>
48 #include <pulsecore/module.h>
49 #include <pulsecore/core-util.h>
50 #include <pulsecore/modargs.h>
51 #include <pulsecore/log.h>
52 #include <pulsecore/thread.h>
53 #include <pulsecore/thread-mq.h>
54 #include <pulsecore/rtpoll.h>
55 #include <pulsecore/sample-util.h>
56 #include <pulsecore/shared.h>
57 #include <pulsecore/idxset.h>
58 #include <pulsecore/strlist.h>
59 #include <pulsecore/database.h>
60 #include <pulsecore/protocol-dbus.h>
61 #include <pulsecore/dbus-util.h>
62
63 #include <stdint.h>
64 #include <time.h>
65
66
67 //#undef __SSE2__
68 #ifdef __SSE2__
69 #include <xmmintrin.h>
70 #include <emmintrin.h>
71 #endif
72
73
74
75 #include "module-equalizer-sink-symdef.h"
76
77 PA_MODULE_AUTHOR("Jason Newton");
78 PA_MODULE_DESCRIPTION(_("General Purpose Equalizer"));
79 PA_MODULE_VERSION(PACKAGE_VERSION);
80 PA_MODULE_LOAD_ONCE(FALSE);
81 PA_MODULE_USAGE(_("sink=<sink to connect to> "));
82
83 #define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
84
85
86 struct userdata {
87 pa_module *module;
88 pa_sink *sink;
89 pa_sink_input *sink_input;
90 char *name;
91
92 size_t channels;
93 size_t fft_size;//length (res) of fft
94 size_t window_size;/*
95 *sliding window size
96 *effectively chooses R
97 */
98 size_t R;/* the hop size between overlapping windows
99 * the latency of the filter, calculated from window_size
100 * based on constraints of COLA and window function
101 */
102 //for twiddling with pulseaudio
103 size_t overlap_size;//window_size-R
104 size_t samples_gathered;
105 size_t input_buffer_max;
106 //message
107 float *W;//windowing function (time domain)
108 float *work_buffer, **input, **overlap_accum;
109 fftwf_complex *output_window;
110 fftwf_plan forward_plan, inverse_plan;
111 //size_t samplings;
112
113 float **Xs;
114 float ***Hs;//thread updatable copies of the freq response filters (magintude based)
115 pa_aupdate **a_H;
116 pa_memchunk conv_buffer;
117 pa_memblockq *input_q;
118 pa_bool_t first_iteration;
119
120 pa_dbus_protocol *dbus_protocol;
121 char *dbus_path;
122 pa_bool_t set_default;
123
124 pa_database *database;
125 char **base_profiles;
126 };
127
128 static const char* const valid_modargs[] = {
129 "sink_name",
130 "sink_properties",
131 "master",
132 "format",
133 "rate",
134 "set_default",
135 "channels",
136 "channel_map",
137 NULL
138 };
139
140
141 #define v_size 4
142 #define SINKLIST "equalized_sinklist"
143 #define EQDB "equalizer_db"
144 #define EQ_STATE_DB "equalizer-state"
145 #define FILTER_SIZE (u->fft_size / 2 + 1)
146 #define CHANNEL_PROFILE_SIZE (FILTER_SIZE + 1)
147 #define FILTER_STATE_SIZE (CHANNEL_PROFILE_SIZE * u->channels)
148 static void dbus_init(struct userdata *u);
149 static void dbus_done(struct userdata *u);
150
151 static void hanning_window(float *W, size_t window_size){
152 //h=.5*(1-cos(2*pi*j/(window_size+1)), COLA for R=(M+1)/2
153 for(size_t i=0; i < window_size;++i){
154 W[i] = (float).5*(1-cos(2*M_PI*i/(window_size+1)));
155 }
156 }
157
158 static void fix_filter(float *H, size_t fft_size){
159 //divide out the fft gain
160 for(size_t i = 0; i < fft_size / 2 + 1; ++i){
161 H[i] /= fft_size;
162 }
163 }
164
165 static void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points){
166 //Note that xs must be monotonically increasing!
167 float x_range_lower, x_range_upper, c0;
168 pa_assert_se(n_points>=2);
169 pa_assert_se(xs[0] == 0);
170 pa_assert_se(xs[n_points - 1] == length - 1);
171 for(size_t x = 0, x_range_lower_i = 0; x < length-1; ++x){
172 pa_assert(x_range_lower_i < n_points-1);
173 x_range_lower = (float) (xs[x_range_lower_i]);
174 x_range_upper = (float) (xs[x_range_lower_i+1]);
175 pa_assert_se(x_range_lower < x_range_upper);
176 pa_assert_se(x >= x_range_lower);
177 pa_assert_se(x <= x_range_upper);
178 //bilinear-interpolation of coefficients specified
179 c0 = (x-x_range_lower)/(x_range_upper-x_range_lower);
180 pa_assert_se(c0 >= 0&&c0 <= 1.0);
181 signal[x] = ((1.0f - c0) * ys[x_range_lower_i] + c0 * ys[x_range_lower_i + 1]);
182 while(x >= xs[x_range_lower_i + 1]){
183 x_range_lower_i++;
184 }
185 }
186 signal[length-1]=ys[n_points-1];
187 }
188
189 static int is_monotonic(const uint32_t *xs,size_t length){
190 if(length<2){
191 return 1;
192 }
193 for(size_t i = 1; i < length; ++i){
194 if(xs[i]<=xs[i-1]){
195 return 0;
196 }
197 }
198 return 1;
199 }
200
201 //ensure's memory allocated is a multiple of v_size
202 //and aligned
203 static void * alloc(size_t x,size_t s){
204 size_t f = PA_ROUND_UP(x*s, sizeof(float)*v_size);
205 float *t;
206 pa_assert(f >= x*s);
207 t = fftwf_malloc(f);
208 memset(t, 0, f);
209 return t;
210 }
211
212 static void alloc_input_buffers(struct userdata *u, size_t min_buffer_length){
213 if(min_buffer_length <= u->input_buffer_max){
214 return;
215 }
216 pa_assert(min_buffer_length >= u->window_size);
217 for(size_t c = 0; c < u->channels; ++c){
218 float *tmp = alloc(min_buffer_length, sizeof(float));
219 if(u->input[c]){
220 if(!u->first_iteration){
221 memcpy(tmp, u->input[c], u->overlap_size * sizeof(float));
222 }
223 free(u->input[c]);
224 }
225 u->input[c] = tmp;
226 }
227 u->input_buffer_max = min_buffer_length;
228 }
229
230 /* Called from I/O thread context */
231 static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
232 struct userdata *u = PA_SINK(o)->userdata;
233
234 switch (code) {
235
236 case PA_SINK_MESSAGE_GET_LATENCY: {
237 //size_t fs=pa_frame_size(&u->sink->sample_spec);
238
239 /* The sink is _put() before the sink input is, so let's
240 * make sure we don't access it in that time. Also, the
241 * sink input is first shut down, the sink second. */
242 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
243 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) {
244 *((pa_usec_t*) data) = 0;
245 return 0;
246 }
247
248 *((pa_usec_t*) data) =
249 /* Get the latency of the master sink */
250 pa_sink_get_latency_within_thread(u->sink_input->sink) +
251
252 /* Add the latency internal to our sink input on top */
253 pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
254 // pa_bytes_to_usec(u->samples_gathered * fs, &u->sink->sample_spec);
255 //+ pa_bytes_to_usec(u->latency * fs, ss)
256 //+ pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
257 return 0;
258 }
259 }
260
261 return pa_sink_process_msg(o, code, data, offset, chunk);
262 }
263
264
265 /* Called from main context */
266 static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
267 struct userdata *u;
268
269 pa_sink_assert_ref(s);
270 pa_assert_se(u = s->userdata);
271
272 if (!PA_SINK_IS_LINKED(state) ||
273 !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
274 return 0;
275
276 pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
277 return 0;
278 }
279
280 /* Called from I/O thread context */
281 static void sink_request_rewind_cb(pa_sink *s) {
282 struct userdata *u;
283
284 pa_sink_assert_ref(s);
285 pa_assert_se(u = s->userdata);
286
287 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
288 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
289 return;
290
291 /* Just hand this one over to the master sink */
292 pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes+pa_memblockq_get_length(u->input_q), TRUE, FALSE, FALSE);
293 }
294
295 /* Called from I/O thread context */
296 static void sink_update_requested_latency_cb(pa_sink *s) {
297 struct userdata *u;
298
299 pa_sink_assert_ref(s);
300 pa_assert_se(u = s->userdata);
301
302 if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
303 !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
304 return;
305
306 /* Just hand this one over to the master sink */
307 pa_sink_input_set_requested_latency_within_thread(
308 u->sink_input,
309 pa_sink_get_requested_latency_within_thread(s));
310 }
311
312 /* Called from main context */
313 static void sink_set_volume_cb(pa_sink *s) {
314 struct userdata *u;
315
316 pa_sink_assert_ref(s);
317 pa_assert_se(u = s->userdata);
318
319 if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
320 !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
321 return;
322
323 pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE);
324 }
325
326 /* Called from main context */
327 static void sink_set_mute_cb(pa_sink *s) {
328 struct userdata *u;
329
330 pa_sink_assert_ref(s);
331 pa_assert_se(u = s->userdata);
332
333 if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
334 !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
335 return;
336
337 pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
338 }
339
340
341 //reference implementation
342 static void dsp_logic(
343 float * restrict dst,//used as a temp array too, needs to be fft_length!
344 float * restrict src,/*input data w/ overlap at start,
345 *automatically cycled in routine
346 */
347 float * restrict overlap,
348 const float X,//multipliar
349 const float * restrict H,//The freq. magnitude scalers filter
350 const float * restrict W,//The windowing function
351 fftwf_complex * restrict output_window,//The transformed window'd src
352 struct userdata *u){
353 //use a linear-phase sliding STFT and overlap-add method (for each channel)
354 //zero padd the data
355 memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
356 //window the data
357 for(size_t j = 0; j < u->window_size; ++j){
358 dst[j] = X * W[j] * src[j];
359 }
360 //Processing is done here!
361 //do fft
362 fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
363 //perform filtering
364 for(size_t j = 0; j < FILTER_SIZE; ++j){
365 u->output_window[j][0] *= H[j];
366 u->output_window[j][1] *= H[j];
367 }
368 //inverse fft
369 fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
370 ////debug: tests overlaping add
371 ////and negates ALL PREVIOUS processing
372 ////yields a perfect reconstruction if COLA is held
373 //for(size_t j = 0; j < u->window_size; ++j){
374 // u->work_buffer[j] = u->W[j] * u->input[c][j];
375 //}
376
377 //overlap add and preserve overlap component from this window (linear phase)
378 for(size_t j = 0; j < u->overlap_size; ++j){
379 u->work_buffer[j] += overlap[j];
380 overlap[j] = dst[u->R + j];
381 }
382 ////debug: tests if basic buffering works
383 ////shouldn't modify the signal AT ALL (beyond roundoff)
384 //for(size_t j = 0; j < u->window_size;++j){
385 // u->work_buffer[j] = u->input[c][j];
386 //}
387
388 //preseve the needed input for the next window's overlap
389 memmove(src, src + u->R,
390 (u->samples_gathered - u->R) * sizeof(float)
391 );
392 }
393
394 typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
395 typedef union float_vector {
396 float f[v_size];
397 v4sf v;
398 #ifdef __SSE2__
399 __m128 m;
400 #endif
401 } float_vector_t;
402
403 ////regardless of sse enabled, the loops in here assume
404 ////16 byte aligned addresses and memory allocations divisible by v_size
405 //void dsp_logic(
406 // float * restrict dst,//used as a temp array too, needs to be fft_length!
407 // float * restrict src,/*input data w/ overlap at start,
408 // *automatically cycled in routine
409 // */
410 // float * restrict overlap,//The size of the overlap
411 // const float X,//multipliar
412 // const float * restrict H,//The freq. magnitude scalers filter
413 // const float * restrict W,//The windowing function
414 // fftwf_complex * restrict output_window,//The transformed window'd src
415 // struct userdata *u){//Collection of constants
416 //float_vector_t x = {X, X, X, X};
417 // const size_t window_size = PA_ROUND_UP(u->window_size,v_size);
418 // const size_t fft_h = PA_ROUND_UP(FILTER_SIZE, v_size / 2);
419 // //const size_t R = PA_ROUND_UP(u->R, v_size);
420 // const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
421 // overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
422 //
423 // //assert(u->samples_gathered >= u->R);
424 // //zero out the bit beyond the real overlap so we don't add garbage
425 // for(size_t j = overlap_size; j > u->overlap_size; --j){
426 // overlap[j-1] = 0;
427 // }
428 // //use a linear-phase sliding STFT and overlap-add method
429 // //zero padd the data
430 // memset(dst + u->window_size, 0, (u->fft_size - u->window_size)*sizeof(float));
431 // //window the data
432 // for(size_t j = 0; j < window_size; j += v_size){
433 // //dst[j] = W[j]*src[j];
434 // float_vector_t *d = (float_vector_t*) (dst+j);
435 // float_vector_t *w = (float_vector_t*) (W+j);
436 // float_vector_t *s = (float_vector_t*) (src+j);
437 //#if __SSE2__
438 // d->m = _mm_mul_ps(x->m, _mm_mul_ps(w->m, s->m));
439 //#else
440 // d->v = x->v * w->v * s->v;
441 //#endif
442 // }
443 // //Processing is done here!
444 // //do fft
445 // fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
446 //
447 //
448 // //perform filtering - purely magnitude based
449 // for(size_t j = 0;j < fft_h; j+=v_size/2){
450 // //output_window[j][0]*=H[j];
451 // //output_window[j][1]*=H[j];
452 // float_vector_t *d = (float_vector_t*)(output_window+j);
453 // float_vector_t h;
454 // h.f[0] = h.f[1] = H[j];
455 // h.f[2] = h.f[3] = H[j+1];
456 //#if __SSE2__
457 // d->m = _mm_mul_ps(d->m, h.m);
458 //#else
459 // d->v = d->v*h->v;
460 //#endif
461 // }
462 // //inverse fft
463 // fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
464 //
465 // ////debug: tests overlaping add
466 // ////and negates ALL PREVIOUS processing
467 // ////yields a perfect reconstruction if COLA is held
468 // //for(size_t j = 0; j < u->window_size; ++j){
469 // // dst[j] = W[j]*src[j];
470 // //}
471 //
472 // //overlap add and preserve overlap component from this window (linear phase)
473 // for(size_t j = 0; j < overlap_size; j+=v_size){
474 // //dst[j]+=overlap[j];
475 // //overlap[j]+=dst[j+R];
476 // float_vector_t *d = (float_vector_t*)(dst+j);
477 // float_vector_t *o = (float_vector_t*)(overlap+j);
478 //#if __SSE2__
479 // d->m = _mm_add_ps(d->m, o->m);
480 // o->m = ((float_vector_t*)(dst+u->R+j))->m;
481 //#else
482 // d->v = d->v+o->v;
483 // o->v = ((float_vector_t*)(dst+u->R+j))->v;
484 //#endif
485 // }
486 // //memcpy(overlap, dst+u->R, u->overlap_size*sizeof(float));
487 //
488 // //////debug: tests if basic buffering works
489 // //////shouldn't modify the signal AT ALL (beyond roundoff)
490 // //for(size_t j = 0; j < u->window_size; ++j){
491 // // dst[j] = src[j];
492 // //}
493 //
494 // //preseve the needed input for the next window's overlap
495 // memmove(src, src + u->R,
496 // u->overlap_size * sizeof(float)
497 // );
498 //}
499
500 static void process_samples(struct userdata *u, pa_memchunk *tchunk){
501 size_t fs = pa_frame_size(&(u->sink->sample_spec));
502 float *dst;
503 unsigned a_i;
504 float *H, X;
505 size_t iterations, offset;
506 pa_assert(u->samples_gathered >= u->window_size);
507 iterations = (u->samples_gathered - u->overlap_size) / u->R;
508 tchunk->index = 0;
509 tchunk->length = iterations * u->R * fs;
510 tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
511 dst = ((float*) pa_memblock_acquire(tchunk->memblock));
512 for(size_t iter = 0; iter < iterations; ++iter){
513 offset = iter * u->R * fs;
514 for(size_t c = 0;c < u->channels; c++) {
515 a_i = pa_aupdate_read_begin(u->a_H[c]);
516 X = u->Xs[c][a_i];
517 H = u->Hs[c][a_i];
518 dsp_logic(
519 u->work_buffer,
520 u->input[c],
521 u->overlap_accum[c],
522 X,
523 H,
524 u->W,
525 u->output_window,
526 u
527 );
528 pa_aupdate_read_end(u->a_H[c]);
529 if(u->first_iteration){
530 /* The windowing function will make the audio ramped in, as a cheap fix we can
531 * undo the windowing (for non-zero window values)
532 */
533 for(size_t i = 0; i < u->overlap_size; ++i){
534 u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
535 }
536 }
537 pa_sample_clamp(PA_SAMPLE_FLOAT32NE, (uint8_t *) (dst + c) + offset, fs, u->work_buffer, sizeof(float), u->R);
538 }
539 if(u->first_iteration){
540 u->first_iteration = FALSE;
541 }
542 u->samples_gathered -= u->R;
543 }
544 pa_memblock_release(tchunk->memblock);
545 }
546
547 static void input_buffer(struct userdata *u, pa_memchunk *in){
548 size_t fs = pa_frame_size(&(u->sink->sample_spec));
549 size_t samples = in->length/fs;
550 float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
551 pa_assert(u->samples_gathered + samples <= u->input_buffer_max);
552 for(size_t c = 0; c < u->channels; c++) {
553 //buffer with an offset after the overlap from previous
554 //iterations
555 pa_assert_se(
556 u->input[c] + u->samples_gathered + samples <= u->input[c] + u->input_buffer_max
557 );
558 pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c] + u->samples_gathered, sizeof(float), src + c, fs, samples);
559 }
560 u->samples_gathered += samples;
561 pa_memblock_release(in->memblock);
562 }
563
564 /* Called from I/O thread context */
565 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
566 struct userdata *u;
567 size_t fs, target_samples;
568 struct timeval start, end;
569 pa_memchunk tchunk;
570 pa_sink_input_assert_ref(i);
571 pa_assert_se(u = i->userdata);
572 pa_assert(chunk);
573 pa_assert(u->sink);
574 fs = pa_frame_size(&(u->sink->sample_spec));
575 target_samples = PA_ROUND_UP(nbytes / fs, u->R);
576 if(u->first_iteration){
577 //allocate request_size
578 target_samples = PA_MAX(target_samples, u->window_size);
579 }else{
580 //allocate request_size + overlap
581 target_samples += u->overlap_size;
582 alloc_input_buffers(u, target_samples);
583 }
584 alloc_input_buffers(u, target_samples);
585 chunk->memblock = NULL;
586
587 /* Hmm, process any rewind request that might be queued up */
588 pa_sink_process_rewind(u->sink, 0);
589
590 //pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
591 pa_rtclock_get(&start);
592 do{
593 size_t input_remaining = target_samples - u->samples_gathered;
594 pa_assert(input_remaining > 0);
595 while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
596 //pa_sink_render(u->sink, input_remaining * fs, &tchunk);
597 pa_sink_render_full(u->sink, input_remaining * fs, &tchunk);
598 pa_assert(tchunk.memblock);
599 pa_memblockq_push(u->input_q, &tchunk);
600 pa_memblock_unref(tchunk.memblock);
601 }
602 pa_assert(tchunk.memblock);
603 tchunk.length = PA_MIN(input_remaining * fs, tchunk.length);
604 pa_memblockq_drop(u->input_q, tchunk.length);
605 //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
606 /* copy new input */
607 //pa_rtclock_get(start);
608 input_buffer(u, &tchunk);
609 //pa_rtclock_get(&end);
610 //pa_log_debug("Took %0.5f seconds to setup", pa_timeval_diff(end, start) / (double) PA_USEC_PER_SEC);
611 pa_memblock_unref(tchunk.memblock);
612 }while(u->samples_gathered < target_samples);
613
614 pa_rtclock_get(&end);
615 pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
616
617 pa_assert(u->fft_size >= u->window_size);
618 pa_assert(u->R < u->window_size);
619 /* set the H filter */
620 pa_rtclock_get(&start);
621 /* process a block */
622 process_samples(u, chunk);
623 pa_rtclock_get(&end);
624 pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
625
626 pa_assert(chunk->memblock);
627 //pa_log_debug("gave %ld", chunk->length/fs);
628 //pa_log_debug("end pop");
629 return 0;
630 }
631
632 /* Called from main context */
633 static void sink_input_volume_changed_cb(pa_sink_input *i) {
634 struct userdata *u;
635
636 pa_sink_input_assert_ref(i);
637 pa_assert_se(u = i->userdata);
638
639 pa_sink_volume_changed(u->sink, &i->volume);
640 }
641
642 /* Called from main context */
643 static void sink_input_mute_changed_cb(pa_sink_input *i) {
644 struct userdata *u;
645
646 pa_sink_input_assert_ref(i);
647 pa_assert_se(u = i->userdata);
648
649 pa_sink_mute_changed(u->sink, i->muted);
650 }
651
652 static void reset_filter(struct userdata *u){
653 size_t fs = pa_frame_size(&u->sink->sample_spec);
654 size_t max_request;
655 u->samples_gathered = 0;
656 for(size_t i = 0; i < u->channels; ++i){
657 memset(u->overlap_accum[i], 0, u->overlap_size * sizeof(float));
658 }
659 u->first_iteration = TRUE;
660 //set buffer size to max request, no overlap copy
661 max_request = PA_ROUND_UP(pa_sink_input_get_max_request(u->sink_input) / fs , u->R);
662 max_request = PA_MAX(max_request, u->window_size);
663 pa_sink_set_max_request_within_thread(u->sink, max_request * fs);
664 }
665
666 /* Called from I/O thread context */
667 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
668 struct userdata *u;
669 size_t amount = 0;
670
671 pa_log_debug("Rewind callback!");
672 pa_sink_input_assert_ref(i);
673 pa_assert_se(u = i->userdata);
674
675 if (u->sink->thread_info.rewind_nbytes > 0) {
676 size_t max_rewrite;
677
678 //max_rewrite = nbytes;
679 max_rewrite = nbytes + pa_memblockq_get_length(u->input_q);
680 //PA_MIN(pa_memblockq_get_length(u->input_q), nbytes);
681 amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
682 u->sink->thread_info.rewind_nbytes = 0;
683
684 if (amount > 0) {
685 //invalidate the output q
686 pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
687 pa_log("Resetting filter");
688 reset_filter(u);
689 }
690 }
691
692 pa_sink_process_rewind(u->sink, amount);
693 pa_memblockq_rewind(u->input_q, nbytes);
694 }
695
696 /* Called from I/O thread context */
697 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
698 struct userdata *u;
699
700 pa_sink_input_assert_ref(i);
701 pa_assert_se(u = i->userdata);
702
703 pa_memblockq_set_maxrewind(u->input_q, nbytes);
704 pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
705 }
706
707 /* Called from I/O thread context */
708 static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
709 struct userdata *u;
710 size_t fs;
711 pa_sink_input_assert_ref(i);
712 pa_assert_se(u = i->userdata);
713 //if(u->first_iteration){
714 // return;
715 //}
716 fs = pa_frame_size(&(u->sink->sample_spec));
717 pa_sink_set_max_request_within_thread(u->sink, PA_ROUND_UP(nbytes / fs, u->R) * fs);
718 }
719
720 /* Called from I/O thread context */
721 static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
722 struct userdata *u;
723
724 pa_sink_input_assert_ref(i);
725 pa_assert_se(u = i->userdata);
726
727 pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
728 }
729
730 /* Called from I/O thread context */
731 static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) {
732 struct userdata *u;
733
734 pa_sink_input_assert_ref(i);
735 pa_assert_se(u = i->userdata);
736
737 pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
738 }
739
740 /* Called from I/O thread context */
741 static void sink_input_detach_cb(pa_sink_input *i) {
742 struct userdata *u;
743
744 pa_sink_input_assert_ref(i);
745 pa_assert_se(u = i->userdata);
746
747 pa_sink_detach_within_thread(u->sink);
748
749 pa_sink_set_rtpoll(u->sink, NULL);
750 }
751
752 /* Called from I/O thread context */
753 static void sink_input_attach_cb(pa_sink_input *i) {
754 struct userdata *u;
755 size_t fs, max_request;
756 pa_sink_input_assert_ref(i);
757 pa_assert_se(u = i->userdata);
758
759 pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll);
760 pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
761
762 pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
763 fs = pa_frame_size(&u->sink->sample_spec);
764 //set buffer size to max request, no overlap copy
765 max_request = PA_ROUND_UP(pa_sink_input_get_max_request(u->sink_input) / fs , u->R);
766 max_request = PA_MAX(max_request, u->window_size);
767 pa_sink_set_max_request_within_thread(u->sink, max_request * fs);
768 pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i));
769 pa_sink_attach_within_thread(u->sink);
770 if(u->set_default){
771 pa_log_debug("Setting default sink to %s", u->sink->name);
772 pa_namereg_set_default_sink(u->module->core, u->sink);
773 }
774 }
775
776 /* Called from main context */
777 static void sink_input_kill_cb(pa_sink_input *i) {
778 struct userdata *u;
779
780 pa_sink_input_assert_ref(i);
781 pa_assert_se(u = i->userdata);
782
783 /* The order here matters! We first kill the sink input, followed
784 * by the sink. That means the sink callbacks must be protected
785 * against an unconnected sink input! */
786 pa_sink_input_unlink(u->sink_input);
787 pa_sink_unlink(u->sink);
788
789 pa_sink_input_unref(u->sink_input);
790 u->sink_input = NULL;
791
792 pa_sink_unref(u->sink);
793 u->sink = NULL;
794
795 pa_module_unload_request(u->module, TRUE);
796 }
797
798 /* Called from IO thread context */
799 static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) {
800 struct userdata *u;
801
802 pa_sink_input_assert_ref(i);
803 pa_assert_se(u = i->userdata);
804
805 /* If we are added for the first time, ask for a rewinding so that
806 * we are heard right-away. */
807 if (PA_SINK_INPUT_IS_LINKED(state) &&
808 i->thread_info.state == PA_SINK_INPUT_INIT) {
809 pa_log_debug("Requesting rewind due to state change.");
810 pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE);
811 }
812 }
813
814 static void pack(char **strs, size_t len, char **packed, size_t *length){
815 size_t t_len = 0;
816 size_t headers = (1+len) * sizeof(uint16_t);
817 char *p;
818 for(size_t i = 0; i < len; ++i){
819 t_len += strlen(strs[i]);
820 }
821 *length = headers + t_len;
822 p = *packed = pa_xmalloc0(*length);
823 *((uint16_t *) p) = (uint16_t) len;
824 p += sizeof(uint16_t);
825 for(size_t i = 0; i < len; ++i){
826 uint16_t l = strlen(strs[i]);
827 *((uint16_t *) p) = (uint16_t) l;
828 p += sizeof(uint16_t);
829 memcpy(p, strs[i], l);
830 p += l;
831 }
832 }
833 static void unpack(char *str, size_t length, char ***strs, size_t *len){
834 char *p = str;
835 *len = *((uint16_t *) p);
836 p += sizeof(uint16_t);
837 *strs = pa_xnew(char *, *len);
838
839 for(size_t i = 0; i < *len; ++i){
840 size_t l = *((uint16_t *) p);
841 p += sizeof(uint16_t);
842 (*strs)[i] = pa_xnew(char, l + 1);
843 memcpy((*strs)[i], p, l);
844 (*strs)[i][l] = '\0';
845 p += l;
846 }
847 }
848 static void save_profile(struct userdata *u, size_t channel, char *name){
849 unsigned a_i;
850 const size_t profile_size = CHANNEL_PROFILE_SIZE * sizeof(float);
851 float *H_n, *profile;
852 const float *H;
853 pa_datum key, data;
854 profile = pa_xnew0(float, profile_size);
855 a_i = pa_aupdate_read_begin(u->a_H[channel]);
856 profile[0] = u->Xs[a_i][channel];
857 H = u->Hs[channel][a_i];
858 H_n = profile + 1;
859 for(size_t i = 0 ; i <= FILTER_SIZE; ++i){
860 H_n[i] = H[i] * u->fft_size;
861 //H_n[i] = H[i];
862 }
863 pa_aupdate_read_end(u->a_H[channel]);
864 key.data=name;
865 key.size = strlen(key.data);
866 data.data = profile;
867 data.size = profile_size;
868 pa_database_set(u->database, &key, &data, TRUE);
869 pa_database_sync(u->database);
870 if(u->base_profiles[channel]){
871 pa_xfree(u->base_profiles[channel]);
872 }
873 u->base_profiles[channel] = pa_xstrdup(name);
874 }
875
876 static void save_state(struct userdata *u){
877 unsigned a_i;
878 const size_t filter_state_size = FILTER_STATE_SIZE * sizeof(float);
879 float *H_n, *state;
880 float *H;
881 pa_datum key, data;
882 pa_database *database;
883 char *dbname;
884 char *state_name = u->name;
885 char *packed;
886 size_t packed_length;
887
888 pack(u->base_profiles, u->channels, &packed, &packed_length);
889 state = (float *) pa_xmalloc0(filter_state_size + packed_length);
890 memcpy(state + FILTER_STATE_SIZE, packed, packed_length);
891 pa_xfree(packed);
892
893 for(size_t c = 0; c < u->channels; ++c){
894 a_i = pa_aupdate_read_begin(u->a_H[c]);
895 state[c * CHANNEL_PROFILE_SIZE] = u->Xs[c][a_i];
896 H = u->Hs[c][a_i];
897 H_n = &state[c * CHANNEL_PROFILE_SIZE + 1];
898 memcpy(H_n, H, FILTER_SIZE * sizeof(float));
899 pa_aupdate_read_end(u->a_H[c]);
900 }
901
902 key.data = state_name;
903 key.size = strlen(key.data);
904 data.data = state;
905 data.size = filter_state_size + packed_length;
906 //thread safety for 0.9.17?
907 pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, FALSE));
908 pa_assert_se(database = pa_database_open(dbname, TRUE));
909 pa_xfree(dbname);
910
911 pa_database_set(database, &key, &data, TRUE);
912 pa_database_sync(database);
913 pa_database_close(database);
914 pa_xfree(state);
915 }
916
917 static void remove_profile(pa_core *c, char *name){
918 pa_datum key;
919 pa_database *database;
920 key.data = name;
921 key.size = strlen(key.data);
922 pa_assert_se(database = pa_shared_get(c, EQDB));
923 pa_database_unset(database, &key);
924 pa_database_sync(database);
925 }
926
927 static const char* load_profile(struct userdata *u, size_t channel, char *name){
928 unsigned a_i;
929 pa_datum key, value;
930 const size_t profile_size = CHANNEL_PROFILE_SIZE * sizeof(float);
931 key.data = name;
932 key.size = strlen(key.data);
933 if(pa_database_get(u->database, &key, &value) != NULL){
934 if(value.size == profile_size){
935 float *profile = (float *) value.data;
936 a_i = pa_aupdate_write_begin(u->a_H[channel]);
937 u->Xs[channel][a_i] = profile[0];
938 memcpy(u->Hs[channel][a_i], profile + 1, FILTER_SIZE * sizeof(float));
939 fix_filter(u->Hs[channel][a_i], u->fft_size);
940 pa_aupdate_write_end(u->a_H[channel]);
941 pa_xfree(u->base_profiles[channel]);
942 u->base_profiles[channel] = pa_xstrdup(name);
943 }else{
944 return "incompatible size";
945 }
946 pa_datum_free(&value);
947 }else{
948 return "profile doesn't exist";
949 }
950 return NULL;
951 }
952
953 static void load_state(struct userdata *u){
954 unsigned a_i;
955 float *H;
956 pa_datum key, value;
957 pa_database *database;
958 char *dbname;
959 char *state_name = u->name;
960 pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, FALSE));
961 database = pa_database_open(dbname, FALSE);
962 pa_xfree(dbname);
963 if(!database){
964 pa_log("No resume state");
965 return;
966 }
967
968 key.data = state_name;
969 key.size = strlen(key.data);
970
971 if(pa_database_get(database, &key, &value) != NULL){
972 if(value.size > FILTER_STATE_SIZE * sizeof(float) + sizeof(uint16_t)){
973 float *state = (float *) value.data;
974 size_t n_profs;
975 char **names;
976 for(size_t c = 0; c < u->channels; ++c){
977 a_i = pa_aupdate_write_begin(u->a_H[c]);
978 H = state + c * CHANNEL_PROFILE_SIZE + 1;
979 u->Xs[c][a_i] = state[c * CHANNEL_PROFILE_SIZE];
980 memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
981 pa_aupdate_write_end(u->a_H[c]);
982 }
983 unpack(((char *)value.data) + FILTER_STATE_SIZE * sizeof(float), value.size - FILTER_STATE_SIZE * sizeof(float), &names, &n_profs);
984 n_profs = PA_MIN(n_profs, u->channels);
985 for(size_t c = 0; c < n_profs; ++c){
986 pa_xfree(u->base_profiles[c]);
987 u->base_profiles[c] = names[c];
988 }
989 pa_xfree(names);
990 }
991 pa_datum_free(&value);
992 }else{
993 pa_log("resume state exists but is wrong size!");
994 }
995 pa_database_close(database);
996 }
997
998 /* Called from main context */
999 static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
1000 struct userdata *u;
1001
1002 pa_sink_input_assert_ref(i);
1003 pa_assert_se(u = i->userdata);
1004
1005 return u->sink != dest;
1006 }
1007
1008 /* Called from main context */
1009 static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
1010 struct userdata *u;
1011
1012 pa_sink_input_assert_ref(i);
1013 pa_assert_se(u = i->userdata);
1014 if (dest) {
1015 pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
1016 pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
1017 } else
1018 pa_sink_set_asyncmsgq(u->sink, NULL);
1019 }
1020
1021 int pa__init(pa_module*m) {
1022 struct userdata *u;
1023 pa_sample_spec ss;
1024 pa_channel_map map;
1025 pa_modargs *ma;
1026 const char *z;
1027 pa_sink *master;
1028 pa_sink_input_new_data sink_input_data;
1029 pa_sink_new_data sink_data;
1030 size_t fs;
1031 float *H;
1032 unsigned a_i;
1033
1034 pa_assert(m);
1035
1036 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
1037 pa_log("Failed to parse module arguments.");
1038 goto fail;
1039 }
1040
1041 if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) {
1042 pa_log("Master sink not found, trying default");
1043 master = pa_namereg_get_default_sink(m->core);
1044 if(!master){
1045 pa_log("no default sink found!");
1046 goto fail;
1047 }
1048 }
1049
1050 ss = master->sample_spec;
1051 ss.format = PA_SAMPLE_FLOAT32;
1052 map = master->channel_map;
1053 if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
1054 pa_log("Invalid sample format specification or channel map");
1055 goto fail;
1056 }
1057 fs = pa_frame_size(&ss);
1058
1059 u = pa_xnew0(struct userdata, 1);
1060 u->module = m;
1061 m->userdata = u;
1062
1063 u->set_default = TRUE;
1064 pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
1065
1066 u->channels = ss.channels;
1067 u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));//probably unstable near corner cases of powers of 2
1068 pa_log_debug("fft size: %ld", u->fft_size);
1069 u->window_size = 15999;
1070 u->R = (u->window_size + 1) / 2;
1071 u->overlap_size = u->window_size - u->R;
1072 u->samples_gathered = 0;
1073 u->input_buffer_max = 0;
1074 u->a_H = pa_xnew0(pa_aupdate *, u->channels);
1075 u->Xs = pa_xnew0(float *, u->channels);
1076 u->Hs = pa_xnew0(float **, u->channels);
1077 for(size_t c = 0; c < u->channels; ++c){
1078 u->Xs[c] = pa_xnew0(float, 2);
1079 u->Hs[c] = pa_xnew0(float *, 2);
1080 for(size_t i = 0; i < 2; ++i){
1081 u->Hs[c][i] = alloc(FILTER_SIZE, sizeof(float));
1082 }
1083 }
1084 u->W = alloc(u->window_size, sizeof(float));
1085 u->work_buffer = alloc(u->fft_size, sizeof(float));
1086 memset(u->work_buffer, 0, u->fft_size*sizeof(float));
1087 u->input = pa_xnew0(float *, u->channels);
1088 u->overlap_accum = pa_xnew0(float *, u->channels);
1089 for(size_t c = 0; c < u->channels; ++c){
1090 u->a_H[c] = pa_aupdate_new();
1091 u->input[c] = NULL;
1092 u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
1093 memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
1094 }
1095 u->output_window = alloc((FILTER_SIZE), sizeof(fftwf_complex));
1096 u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
1097 u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
1098
1099 hanning_window(u->W, u->window_size);
1100 u->first_iteration = TRUE;
1101
1102 u->base_profiles = pa_xnew0(char *, u->channels);
1103 for(size_t c = 0; c < u->channels; ++c){
1104 u->base_profiles[c] = pa_xstrdup("default");
1105 }
1106
1107 /* Create sink */
1108 pa_sink_new_data_init(&sink_data);
1109 sink_data.driver = __FILE__;
1110 sink_data.module = m;
1111 if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL))))
1112 sink_data.name = pa_sprintf_malloc("%s.equalizer", master->name);
1113 pa_sink_new_data_set_sample_spec(&sink_data, &ss);
1114 pa_sink_new_data_set_channel_map(&sink_data, &map);
1115 z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
1116 pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "FFT based equalizer on %s",z? z: master->name);
1117 pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
1118 pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
1119
1120 if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) {
1121 pa_log("Invalid properties");
1122 pa_sink_new_data_done(&sink_data);
1123 goto fail;
1124 }
1125
1126 u->sink = pa_sink_new(m->core, &sink_data,
1127 PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME|
1128 (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY)));
1129 pa_sink_new_data_done(&sink_data);
1130
1131 if (!u->sink) {
1132 pa_log("Failed to create sink.");
1133 goto fail;
1134 }
1135 u->name=pa_xstrdup(u->sink->name);
1136 u->sink->parent.process_msg = sink_process_msg_cb;
1137 u->sink->set_state = sink_set_state_cb;
1138 u->sink->update_requested_latency = sink_update_requested_latency_cb;
1139 u->sink->request_rewind = sink_request_rewind_cb;
1140 u->sink->set_volume = sink_set_volume_cb;
1141 u->sink->set_mute = sink_set_mute_cb;
1142 u->sink->userdata = u;
1143 u->input_q = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, &u->sink->silence);
1144
1145 pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
1146 //pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->R*fs, &ss));
1147
1148 /* Create sink input */
1149 pa_sink_input_new_data_init(&sink_input_data);
1150 sink_input_data.driver = __FILE__;
1151 sink_input_data.module = m;
1152 sink_input_data.sink = master;
1153 pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Equalized Stream");
1154 pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
1155 pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
1156 pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
1157
1158 pa_sink_input_new(&u->sink_input, m->core, &sink_input_data);
1159 pa_sink_input_new_data_done(&sink_input_data);
1160
1161 if (!u->sink_input)
1162 goto fail;
1163
1164 u->sink_input->pop = sink_input_pop_cb;
1165 u->sink_input->process_rewind = sink_input_process_rewind_cb;
1166 u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
1167 u->sink_input->update_max_request = sink_input_update_max_request_cb;
1168 u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb;
1169 u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb;
1170 u->sink_input->kill = sink_input_kill_cb;
1171 u->sink_input->attach = sink_input_attach_cb;
1172 u->sink_input->detach = sink_input_detach_cb;
1173 u->sink_input->state_change = sink_input_state_change_cb;
1174 u->sink_input->may_move_to = sink_input_may_move_to_cb;
1175 u->sink_input->moving = sink_input_moving_cb;
1176 u->sink_input->volume_changed = sink_input_volume_changed_cb;
1177 u->sink_input->mute_changed = sink_input_mute_changed_cb;
1178
1179 u->sink_input->userdata = u;
1180
1181 pa_sink_put(u->sink);
1182 pa_sink_input_put(u->sink_input);
1183
1184 pa_modargs_free(ma);
1185
1186
1187 dbus_init(u);
1188
1189 //default filter to these
1190 for(size_t c = 0; c< u->channels; ++c){
1191 a_i = pa_aupdate_write_begin(u->a_H[c]);
1192 H = u->Hs[c][a_i];
1193 u->Xs[c][a_i] = 1.0f;
1194 for(size_t i = 0; i < FILTER_SIZE; ++i){
1195 H[i] = 1.0 / sqrtf(2.0f);
1196 }
1197 fix_filter(H, u->fft_size);
1198 pa_aupdate_write_end(u->a_H[c]);
1199 }
1200 //load old parameters
1201 load_state(u);
1202
1203 return 0;
1204
1205 fail:
1206 if (ma)
1207 pa_modargs_free(ma);
1208
1209
1210 pa__done(m);
1211
1212 return -1;
1213 }
1214
1215 int pa__get_n_used(pa_module *m) {
1216 struct userdata *u;
1217
1218 pa_assert(m);
1219 pa_assert_se(u = m->userdata);
1220
1221 return pa_sink_linked_by(u->sink);
1222 }
1223
1224 void pa__done(pa_module*m) {
1225 struct userdata *u;
1226
1227 pa_assert(m);
1228
1229 if (!(u = m->userdata))
1230 return;
1231
1232 save_state(u);
1233
1234 dbus_done(u);
1235
1236 for(size_t c = 0; c < u->channels; ++c){
1237 pa_xfree(u->base_profiles[c]);
1238 }
1239 pa_xfree(u->base_profiles);
1240
1241 /* See comments in sink_input_kill_cb() above regarding
1242 * destruction order! */
1243
1244 if (u->sink_input)
1245 pa_sink_input_unlink(u->sink_input);
1246
1247 if (u->sink)
1248 pa_sink_unlink(u->sink);
1249
1250 if (u->sink_input)
1251 pa_sink_input_unref(u->sink_input);
1252
1253 if (u->sink)
1254 pa_sink_unref(u->sink);
1255
1256 pa_memblockq_free(u->input_q);
1257
1258 fftwf_destroy_plan(u->inverse_plan);
1259 fftwf_destroy_plan(u->forward_plan);
1260 pa_xfree(u->output_window);
1261 for(size_t c=0; c < u->channels; ++c){
1262 pa_aupdate_free(u->a_H[c]);
1263 pa_xfree(u->overlap_accum[c]);
1264 pa_xfree(u->input[c]);
1265 }
1266 pa_xfree(u->a_H);
1267 pa_xfree(u->overlap_accum);
1268 pa_xfree(u->input);
1269 pa_xfree(u->work_buffer);
1270 pa_xfree(u->W);
1271 for(size_t c = 0; c < u->channels; ++c){
1272 pa_xfree(u->Xs[c]);
1273 for(size_t i = 0; i < 2; ++i){
1274 pa_xfree(u->Hs[c][i]);
1275 }
1276 pa_xfree(u->Hs[c]);
1277 }
1278 pa_xfree(u->Xs);
1279 pa_xfree(u->Hs);
1280
1281 pa_xfree(u->name);
1282
1283 pa_xfree(u);
1284 }
1285
1286 /*
1287 * DBus Routines and Callbacks
1288 */
1289 #define EXTNAME "org.PulseAudio.Ext.Equalizing1"
1290 #define MANAGER_PATH "/org/pulseaudio/equalizing1"
1291 #define MANAGER_IFACE EXTNAME ".Manager"
1292 #define EQUALIZER_IFACE EXTNAME ".Equalizer"
1293 static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
1294 static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u);
1295 static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u);
1296 static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
1297 static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
1298 static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
1299 static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
1300 static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
1301 static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
1302 static void equalizer_get_n_channels(DBusConnection *conn, DBusMessage *msg, void *_u);
1303 static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
1304 static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
1305 static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
1306 static void equalizer_handle_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
1307 static void equalizer_handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
1308 static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
1309 static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
1310 static void equalizer_handle_save_state(DBusConnection *conn, DBusMessage *msg, void *_u);
1311 static void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, void *_u);
1312 enum manager_method_index {
1313 MANAGER_METHOD_REMOVE_PROFILE,
1314 MANAGER_METHOD_MAX
1315 };
1316
1317 pa_dbus_arg_info remove_profile_args[]={
1318 {"name", "s","in"},
1319 };
1320
1321 static pa_dbus_method_handler manager_methods[MANAGER_METHOD_MAX]={
1322 [MANAGER_METHOD_REMOVE_PROFILE]{
1323 .method_name="RemoveProfile",
1324 .arguments=remove_profile_args,
1325 .n_arguments=sizeof(remove_profile_args)/sizeof(pa_dbus_arg_info),
1326 .receive_cb=manager_handle_remove_profile}
1327 };
1328
1329 enum manager_handler_index {
1330 MANAGER_HANDLER_REVISION,
1331 MANAGER_HANDLER_EQUALIZED_SINKS,
1332 MANAGER_HANDLER_PROFILES,
1333 MANAGER_HANDLER_MAX
1334 };
1335
1336 static pa_dbus_property_handler manager_handlers[MANAGER_HANDLER_MAX]={
1337 [MANAGER_HANDLER_REVISION]={.property_name="InterfaceRevision",.type="u",.get_cb=manager_get_revision,.set_cb=NULL},
1338 [MANAGER_HANDLER_EQUALIZED_SINKS]={.property_name="EqualizedSinks",.type="ao",.get_cb=manager_get_sinks,.set_cb=NULL},
1339 [MANAGER_HANDLER_PROFILES]={.property_name="Profiles",.type="as",.get_cb=manager_get_profiles,.set_cb=NULL}
1340 };
1341
1342 pa_dbus_arg_info sink_args[]={
1343 {"sink", "o", NULL}
1344 };
1345
1346 enum manager_signal_index{
1347 MANAGER_SIGNAL_SINK_ADDED,
1348 MANAGER_SIGNAL_SINK_REMOVED,
1349 MANAGER_SIGNAL_PROFILES_CHANGED,
1350 MANAGER_SIGNAL_MAX
1351 };
1352
1353 static pa_dbus_signal_info manager_signals[MANAGER_SIGNAL_MAX]={
1354 [MANAGER_SIGNAL_SINK_ADDED]={.name="SinkAdded", .arguments=sink_args, .n_arguments=sizeof(sink_args)/sizeof(pa_dbus_arg_info)},
1355 [MANAGER_SIGNAL_SINK_REMOVED]={.name="SinkRemoved", .arguments=sink_args, .n_arguments=sizeof(sink_args)/sizeof(pa_dbus_arg_info)},
1356 [MANAGER_SIGNAL_PROFILES_CHANGED]={.name="ProfilesChanged", .arguments=NULL, .n_arguments=0}
1357 };
1358
1359 static pa_dbus_interface_info manager_info={
1360 .name=MANAGER_IFACE,
1361 .method_handlers=manager_methods,
1362 .n_method_handlers=MANAGER_METHOD_MAX,
1363 .property_handlers=manager_handlers,
1364 .n_property_handlers=MANAGER_HANDLER_MAX,
1365 .get_all_properties_cb=manager_get_all,
1366 .signals=manager_signals,
1367 .n_signals=MANAGER_SIGNAL_MAX
1368 };
1369
1370 enum equalizer_method_index {
1371 EQUALIZER_METHOD_FILTER_POINTS,
1372 EQUALIZER_METHOD_SEED_FILTER,
1373 EQUALIZER_METHOD_SAVE_PROFILE,
1374 EQUALIZER_METHOD_LOAD_PROFILE,
1375 EQUALIZER_METHOD_SET_FILTER,
1376 EQUALIZER_METHOD_GET_FILTER,
1377 EQUALIZER_METHOD_SAVE_STATE,
1378 EQUALIZER_METHOD_GET_PROFILE_NAME,
1379 EQUALIZER_METHOD_MAX
1380 };
1381
1382 enum equalizer_handler_index {
1383 EQUALIZER_HANDLER_REVISION,
1384 EQUALIZER_HANDLER_SAMPLERATE,
1385 EQUALIZER_HANDLER_FILTERSAMPLERATE,
1386 EQUALIZER_HANDLER_N_COEFS,
1387 EQUALIZER_HANDLER_N_CHANNELS,
1388 EQUALIZER_HANDLER_MAX
1389 };
1390
1391 pa_dbus_arg_info filter_points_args[]={
1392 {"channel", "u","in"},
1393 {"xs", "au","in"},
1394 {"ys", "ad","out"},
1395 {"preamp", "d","out"}
1396 };
1397 pa_dbus_arg_info seed_filter_args[]={
1398 {"channel", "u","in"},
1399 {"xs", "au","in"},
1400 {"ys", "ad","in"},
1401 {"preamp", "d","in"}
1402 };
1403
1404 pa_dbus_arg_info set_filter_args[]={
1405 {"channel", "u","in"},
1406 {"ys", "ad","in"},
1407 {"preamp", "d","in"}
1408 };
1409 pa_dbus_arg_info get_filter_args[]={
1410 {"channel", "u","in"},
1411 {"ys", "ad","out"},
1412 {"preamp", "d","out"}
1413 };
1414
1415 pa_dbus_arg_info save_profile_args[]={
1416 {"channel", "u","in"},
1417 {"name", "s","in"}
1418 };
1419 pa_dbus_arg_info load_profile_args[]={
1420 {"channel", "u","in"},
1421 {"name", "s","in"}
1422 };
1423 pa_dbus_arg_info base_profile_name_args[]={
1424 {"channel", "u","in"},
1425 {"name", "s","out"}
1426 };
1427
1428 static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
1429 [EQUALIZER_METHOD_SEED_FILTER]{
1430 .method_name="SeedFilter",
1431 .arguments=seed_filter_args,
1432 .n_arguments=sizeof(seed_filter_args)/sizeof(pa_dbus_arg_info),
1433 .receive_cb=equalizer_handle_seed_filter},
1434 [EQUALIZER_METHOD_FILTER_POINTS]{
1435 .method_name="FilterAtPoints",
1436 .arguments=filter_points_args,
1437 .n_arguments=sizeof(filter_points_args)/sizeof(pa_dbus_arg_info),
1438 .receive_cb=equalizer_handle_get_filter_points},
1439 [EQUALIZER_METHOD_SET_FILTER]{
1440 .method_name="SetFilter",
1441 .arguments=set_filter_args,
1442 .n_arguments=sizeof(set_filter_args)/sizeof(pa_dbus_arg_info),
1443 .receive_cb=equalizer_handle_set_filter},
1444 [EQUALIZER_METHOD_GET_FILTER]{
1445 .method_name="GetFilter",
1446 .arguments=get_filter_args,
1447 .n_arguments=sizeof(get_filter_args)/sizeof(pa_dbus_arg_info),
1448 .receive_cb=equalizer_handle_get_filter},
1449 [EQUALIZER_METHOD_SAVE_PROFILE]{
1450 .method_name="SaveProfile",
1451 .arguments=save_profile_args,
1452 .n_arguments=sizeof(save_profile_args)/sizeof(pa_dbus_arg_info),
1453 .receive_cb=equalizer_handle_save_profile},
1454 [EQUALIZER_METHOD_LOAD_PROFILE]{
1455 .method_name="LoadProfile",
1456 .arguments=load_profile_args,
1457 .n_arguments=sizeof(load_profile_args)/sizeof(pa_dbus_arg_info),
1458 .receive_cb=equalizer_handle_load_profile},
1459 [EQUALIZER_METHOD_SAVE_STATE]{
1460 .method_name="SaveState",
1461 .arguments=NULL,
1462 .n_arguments=0,
1463 .receive_cb=equalizer_handle_save_state},
1464 [EQUALIZER_METHOD_GET_PROFILE_NAME]{
1465 .method_name="BaseProfile",
1466 .arguments=base_profile_name_args,
1467 .n_arguments=sizeof(base_profile_name_args)/sizeof(pa_dbus_arg_info),
1468 .receive_cb=equalizer_handle_get_profile_name}
1469 };
1470
1471 static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
1472 [EQUALIZER_HANDLER_REVISION]={.property_name="InterfaceRevision",.type="u",.get_cb=equalizer_get_revision,.set_cb=NULL},
1473 [EQUALIZER_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=equalizer_get_sample_rate,.set_cb=NULL},
1474 [EQUALIZER_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=equalizer_get_filter_rate,.set_cb=NULL},
1475 [EQUALIZER_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=equalizer_get_n_coefs,.set_cb=NULL},
1476 [EQUALIZER_HANDLER_N_CHANNELS]{.property_name="NChannels",.type="u",.get_cb=equalizer_get_n_channels,.set_cb=NULL},
1477 };
1478
1479 enum equalizer_signal_index{
1480 EQUALIZER_SIGNAL_FILTER_CHANGED,
1481 EQUALIZER_SIGNAL_SINK_RECONFIGURED,
1482 EQUALIZER_SIGNAL_MAX
1483 };
1484
1485 static pa_dbus_signal_info equalizer_signals[EQUALIZER_SIGNAL_MAX]={
1486 [EQUALIZER_SIGNAL_FILTER_CHANGED]={.name="FilterChanged", .arguments=NULL, .n_arguments=0},
1487 [EQUALIZER_SIGNAL_SINK_RECONFIGURED]={.name="SinkReconfigured", .arguments=NULL, .n_arguments=0},
1488 };
1489
1490 static pa_dbus_interface_info equalizer_info={
1491 .name=EQUALIZER_IFACE,
1492 .method_handlers=equalizer_methods,
1493 .n_method_handlers=EQUALIZER_METHOD_MAX,
1494 .property_handlers=equalizer_handlers,
1495 .n_property_handlers=EQUALIZER_HANDLER_MAX,
1496 .get_all_properties_cb=equalizer_get_all,
1497 .signals=equalizer_signals,
1498 .n_signals=EQUALIZER_SIGNAL_MAX
1499 };
1500
1501 void dbus_init(struct userdata *u){
1502 uint32_t dummy;
1503 DBusMessage *signal = NULL;
1504 pa_idxset *sink_list = NULL;
1505 u->dbus_protocol=pa_dbus_protocol_get(u->sink->core);
1506 u->dbus_path=pa_sprintf_malloc("/org/pulseaudio/core1/sink%d", u->sink->index);
1507
1508 pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &equalizer_info, u);
1509 sink_list = pa_shared_get(u->sink->core, SINKLIST);
1510 u->database = pa_shared_get(u->sink->core, EQDB);
1511 if(sink_list == NULL){
1512 char *dbname;
1513 sink_list=pa_idxset_new(&pa_idxset_trivial_hash_func, &pa_idxset_trivial_compare_func);
1514 pa_shared_set(u->sink->core, SINKLIST, sink_list);
1515 pa_assert_se(dbname = pa_state_path("equalizer-presets", FALSE));
1516 pa_assert_se(u->database = pa_database_open(dbname, TRUE));
1517 pa_xfree(dbname);
1518 pa_shared_set(u->sink->core, EQDB, u->database);
1519 pa_dbus_protocol_add_interface(u->dbus_protocol, MANAGER_PATH, &manager_info, u->sink->core);
1520 pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
1521 }
1522 pa_idxset_put(sink_list, u, &dummy);
1523
1524 pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_SINK_ADDED].name)));
1525 dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &u->dbus_path, DBUS_TYPE_INVALID);
1526 pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
1527 dbus_message_unref(signal);
1528 }
1529
1530 void dbus_done(struct userdata *u){
1531 pa_idxset *sink_list;
1532 uint32_t dummy;
1533
1534 DBusMessage *signal = NULL;
1535 pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_SINK_REMOVED].name)));
1536 dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &u->dbus_path, DBUS_TYPE_INVALID);
1537 pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
1538 dbus_message_unref(signal);
1539
1540 pa_assert_se(sink_list=pa_shared_get(u->sink->core,SINKLIST));
1541 pa_idxset_remove_by_data(sink_list,u,&dummy);
1542 if(pa_idxset_size(sink_list)==0){
1543 pa_dbus_protocol_unregister_extension(u->dbus_protocol, EXTNAME);
1544 pa_dbus_protocol_remove_interface(u->dbus_protocol, MANAGER_PATH, manager_info.name);
1545 pa_shared_remove(u->sink->core, EQDB);
1546 pa_database_close(u->database);
1547 pa_shared_remove(u->sink->core, SINKLIST);
1548 pa_xfree(sink_list);
1549 }
1550 pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, equalizer_info.name);
1551 pa_xfree(u->dbus_path);
1552 pa_dbus_protocol_unref(u->dbus_protocol);
1553 }
1554
1555 void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
1556 DBusError error;
1557 pa_core *c = (pa_core *)_u;
1558 DBusMessage *signal = NULL;
1559 pa_dbus_protocol *dbus_protocol;
1560 char *name;
1561 pa_assert(conn);
1562 pa_assert(msg);
1563 pa_assert(c);
1564 dbus_error_init(&error);
1565 if(!dbus_message_get_args(msg, &error,
1566 DBUS_TYPE_STRING, &name,
1567 DBUS_TYPE_INVALID)){
1568 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
1569 dbus_error_free(&error);
1570 return;
1571 }
1572 remove_profile(c,name);
1573 pa_dbus_send_empty_reply(conn, msg);
1574
1575 pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
1576 dbus_protocol = pa_dbus_protocol_get(c);
1577 pa_dbus_protocol_send_signal(dbus_protocol, signal);
1578 pa_dbus_protocol_unref(dbus_protocol);
1579 dbus_message_unref(signal);
1580 }
1581
1582 void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
1583 uint32_t rev=1;
1584 pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
1585 }
1586
1587 static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
1588 void *iter = NULL;
1589 struct userdata *sink_u = NULL;
1590 uint32_t dummy;
1591 pa_idxset *sink_list;
1592 pa_assert(u);
1593 pa_assert(names);
1594 pa_assert(n_sinks);
1595
1596 pa_assert_se(sink_list = pa_shared_get(u, SINKLIST));
1597 *n_sinks = (unsigned) pa_idxset_size(sink_list);
1598 *names = *n_sinks > 0 ? pa_xnew0(char *,*n_sinks) : NULL;
1599 for(uint32_t i = 0; i < *n_sinks; ++i){
1600 sink_u = (struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
1601 (*names)[i] = pa_xstrdup(sink_u->dbus_path);
1602 }
1603 }
1604
1605 void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
1606 unsigned n;
1607 char **names = NULL;
1608 pa_assert(conn);
1609 pa_assert(msg);
1610 pa_assert(_u);
1611
1612 get_sinks((pa_core *) _u, &names, &n);
1613 pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, names, n);
1614 for(unsigned i = 0; i < n; ++i){
1615 pa_xfree(names[i]);
1616 }
1617 pa_xfree(names);
1618 }
1619
1620 static void get_profiles(pa_core *c, char ***names, unsigned *n){
1621 char *name;
1622 pa_database *database;
1623 pa_datum key, next_key;
1624 pa_strlist *head=NULL, *iter;
1625 pa_bool_t done;
1626 pa_assert_se(database = pa_shared_get(c, EQDB));
1627
1628 pa_assert(c);
1629 pa_assert(names);
1630 pa_assert(n);
1631 done = !pa_database_first(database, &key, NULL);
1632 *n = 0;
1633 while(!done){
1634 done = !pa_database_next(database, &key, &next_key, NULL);
1635 name=pa_xmalloc(key.size + 1);
1636 memcpy(name, key.data, key.size);
1637 name[key.size] = '\0';
1638 pa_datum_free(&key);
1639 head = pa_strlist_prepend(head, name);
1640 pa_xfree(name);
1641 key = next_key;
1642 (*n)++;
1643 }
1644 (*names) = *n > 0 ? pa_xnew0(char *, *n) : NULL;
1645 iter=head;
1646 for(unsigned i = 0; i < *n; ++i){
1647 (*names)[*n - 1 - i] = pa_xstrdup(pa_strlist_data(iter));
1648 iter = pa_strlist_next(iter);
1649 }
1650 pa_strlist_free(head);
1651 }
1652
1653 void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
1654 char **names;
1655 unsigned n;
1656 pa_assert(conn);
1657 pa_assert(msg);
1658 pa_assert(_u);
1659
1660 get_profiles((pa_core *)_u, &names, &n);
1661 pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_STRING, names, n);
1662 for(unsigned i = 0; i < n; ++i){
1663 pa_xfree(names[i]);
1664 }
1665 pa_xfree(names);
1666 }
1667
1668 void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
1669 pa_core *c;
1670 char **names = NULL;
1671 unsigned n;
1672 DBusMessage *reply = NULL;
1673 DBusMessageIter msg_iter, dict_iter;
1674 uint32_t rev;
1675 pa_assert(conn);
1676 pa_assert(msg);
1677 pa_assert_se(c = _u);
1678
1679 pa_assert_se((reply = dbus_message_new_method_return(msg)));
1680 dbus_message_iter_init_append(reply, &msg_iter);
1681 pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
1682
1683 rev = 1;
1684 pa_dbus_append_basic_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
1685
1686 get_sinks(c, &names, &n);
1687 pa_dbus_append_basic_array_variant_dict_entry(&dict_iter,manager_handlers[MANAGER_HANDLER_EQUALIZED_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, names, n);
1688 for(unsigned i = 0; i < n; ++i){
1689 pa_xfree(names[i]);
1690 }
1691 pa_xfree(names);
1692
1693 get_profiles(c, &names, &n);
1694 pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_PROFILES].property_name, DBUS_TYPE_STRING, names, n);
1695 for(unsigned i = 0; i < n; ++i){
1696 pa_xfree(names[i]);
1697 }
1698 pa_xfree(names);
1699 pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
1700 pa_assert_se(dbus_connection_send(conn, reply, NULL));
1701 dbus_message_unref(reply);
1702 }
1703
1704 void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u) {
1705 struct userdata *u=(struct userdata *) _u;
1706 DBusError error;
1707 DBusMessage *signal = NULL;
1708 float *ys;
1709 uint32_t *xs, channel, r_channel;
1710 double *_ys, preamp;
1711 unsigned x_npoints, y_npoints, a_i;
1712 float *H;
1713 pa_bool_t points_good = TRUE;
1714 pa_assert(conn);
1715 pa_assert(msg);
1716 pa_assert(u);
1717
1718 dbus_error_init(&error);
1719
1720 if(!dbus_message_get_args(msg, &error,
1721 DBUS_TYPE_UINT32, &channel,
1722 DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
1723 DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &_ys, &y_npoints,
1724 DBUS_TYPE_DOUBLE, &preamp,
1725 DBUS_TYPE_INVALID)){
1726 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
1727 dbus_error_free(&error);
1728 return;
1729 }
1730 if(channel > u->channels){
1731 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
1732 dbus_error_free(&error);
1733 return;
1734 }
1735 for(size_t i = 0; i < x_npoints; ++i){
1736 if(xs[i] >= FILTER_SIZE){
1737 points_good = FALSE;
1738 break;
1739 }
1740 }
1741 if(!is_monotonic(xs, x_npoints) || !points_good){
1742 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs must be monotonic and 0<=x<=%ld", u->fft_size / 2);
1743 dbus_error_free(&error);
1744 return;
1745 }else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > FILTER_SIZE ){
1746 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", FILTER_SIZE);
1747 dbus_error_free(&error);
1748 return;
1749 }else if(xs[0] != 0 || xs[x_npoints - 1] != u->fft_size / 2){
1750 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs[0] must be 0 and xs[-1]=fft_size/2");
1751 dbus_error_free(&error);
1752 return;
1753 }
1754
1755 ys = pa_xmalloc(x_npoints * sizeof(float));
1756 for(uint32_t i = 0; i < x_npoints; ++i){
1757 ys[i] = (float) _ys[i];
1758 }
1759 r_channel = channel == u->channels ? 0 : channel;
1760 a_i = pa_aupdate_write_begin(u->a_H[r_channel]);
1761 H = u->Hs[r_channel][a_i];
1762 u->Xs[r_channel][a_i] = preamp;
1763 interpolate(H, FILTER_SIZE, xs, ys, x_npoints);
1764 fix_filter(H, u->fft_size);
1765 if(channel == u->channels){
1766 for(size_t c = 1; c < u->channels; ++c){
1767 unsigned b_i = pa_aupdate_write_begin(u->a_H[c]);
1768 float *H_p = u->Hs[c][b_i];
1769 u->Xs[c][b_i] = preamp;
1770 memcpy(H_p, H, FILTER_SIZE * sizeof(float));
1771 pa_aupdate_write_end(u->a_H[c]);
1772 }
1773 }
1774 pa_aupdate_write_end(u->a_H[r_channel]);
1775 pa_xfree(ys);
1776
1777
1778 pa_dbus_send_empty_reply(conn, msg);
1779
1780 pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
1781 pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
1782 dbus_message_unref(signal);
1783 }
1784
1785 void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
1786 struct userdata *u = (struct userdata *) _u;
1787 uint32_t *xs, channel, r_channel;
1788 double *ys, preamp;
1789 unsigned x_npoints, a_i;
1790 float *H;
1791 pa_bool_t points_good=TRUE;
1792 DBusMessage *reply = NULL;
1793 DBusMessageIter msg_iter;
1794 DBusError error;
1795
1796 pa_assert(conn);
1797 pa_assert(msg);
1798 pa_assert(u);
1799
1800 dbus_error_init(&error);
1801 if(!dbus_message_get_args(msg, &error,
1802 DBUS_TYPE_UINT32, &channel,
1803 DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
1804 DBUS_TYPE_INVALID)){
1805 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
1806 dbus_error_free(&error);
1807 return;
1808 }
1809 if(channel > u->channels){
1810 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
1811 dbus_error_free(&error);
1812 return;
1813 }
1814
1815 for(size_t i = 0; i < x_npoints; ++i){
1816 if(xs[i] >= FILTER_SIZE){
1817 points_good=FALSE;
1818 break;
1819 }
1820 }
1821
1822 if(x_npoints > FILTER_SIZE || !points_good){
1823 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs indices/length must be <= %ld!", FILTER_SIZE);
1824 dbus_error_free(&error);
1825 return;
1826 }
1827
1828 r_channel = channel == u->channels ? 0 : channel;
1829 ys = pa_xmalloc(x_npoints * sizeof(double));
1830 a_i = pa_aupdate_read_begin(u->a_H[r_channel]);
1831 H = u->Hs[r_channel][a_i];
1832 preamp = u->Xs[r_channel][a_i];
1833 for(uint32_t i = 0; i < x_npoints; ++i){
1834 ys[i] = H[xs[i]] * u->fft_size;
1835 }
1836 pa_aupdate_read_end(u->a_H[r_channel]);
1837
1838 pa_assert_se((reply = dbus_message_new_method_return(msg)));
1839 dbus_message_iter_init_append(reply, &msg_iter);
1840
1841 pa_dbus_append_basic_array(&msg_iter, DBUS_TYPE_DOUBLE, ys, x_npoints);
1842 pa_dbus_append_basic_variant(&msg_iter, DBUS_TYPE_DOUBLE, &preamp);
1843
1844 pa_assert_se(dbus_connection_send(conn, reply, NULL));
1845 dbus_message_unref(reply);
1846 pa_xfree(ys);
1847 }
1848
1849 static void get_filter(struct userdata *u, size_t channel, double **H_, double *preamp){
1850 float *H;
1851 unsigned a_i;
1852 size_t r_channel = channel == u->channels ? 0 : channel;
1853 *H_ = pa_xnew0(double, FILTER_SIZE);
1854 a_i = pa_aupdate_read_begin(u->a_H[r_channel]);
1855 H = u->Hs[r_channel][a_i];
1856 for(size_t i = 0;i < FILTER_SIZE; ++i){
1857 (*H_)[i] = H[i] * u->fft_size;
1858 }
1859 *preamp = u->Xs[r_channel][a_i];
1860
1861 pa_aupdate_read_end(u->a_H[r_channel]);
1862 }
1863
1864 void equalizer_handle_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
1865 struct userdata *u;
1866 unsigned n_coefs;
1867 uint32_t channel;
1868 double *H_, preamp;
1869 DBusMessage *reply = NULL;
1870 DBusMessageIter msg_iter;
1871 DBusError error;
1872 pa_assert_se(u = (struct userdata *) _u);
1873 pa_assert(conn);
1874 pa_assert(msg);
1875
1876 dbus_error_init(&error);
1877 if(!dbus_message_get_args(msg, &error,
1878 DBUS_TYPE_UINT32, &channel,
1879 DBUS_TYPE_INVALID)){
1880 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
1881 dbus_error_free(&error);
1882 return;
1883 }
1884 if(channel > u->channels){
1885 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
1886 dbus_error_free(&error);
1887 return;
1888 }
1889
1890 n_coefs = CHANNEL_PROFILE_SIZE;
1891 pa_assert(conn);
1892 pa_assert(msg);
1893 get_filter(u, channel, &H_, &preamp);
1894 pa_assert_se((reply = dbus_message_new_method_return(msg)));
1895 dbus_message_iter_init_append(reply, &msg_iter);
1896
1897 pa_dbus_append_basic_array(&msg_iter, DBUS_TYPE_DOUBLE, H_, n_coefs);
1898 pa_dbus_append_basic_variant(&msg_iter, DBUS_TYPE_DOUBLE, &preamp);
1899
1900 pa_assert_se(dbus_connection_send(conn, reply, NULL));
1901 dbus_message_unref(reply);
1902 pa_xfree(H_);
1903 }
1904
1905 static void set_filter(struct userdata *u, size_t channel, double *H_, double preamp){
1906 unsigned a_i;
1907 size_t r_channel = channel == u->channels ? 0 : channel;
1908 float *H;
1909 //all channels
1910 a_i = pa_aupdate_write_begin(u->a_H[r_channel]);
1911 u->Xs[r_channel][a_i] = (float) preamp;
1912 H = u->Hs[r_channel][a_i];
1913 for(size_t i = 0; i < FILTER_SIZE; ++i){
1914 H[i] = (float) H_[i];
1915 }
1916 fix_filter(H, u->fft_size);
1917 if(channel == u->channels){
1918 for(size_t c = 1; c < u->channels; ++c){
1919 unsigned b_i = pa_aupdate_write_begin(u->a_H[c]);
1920 u->Xs[c][b_i] = u->Xs[r_channel][a_i];
1921 memcpy(u->Hs[c][b_i], u->Hs[r_channel][a_i], FILTER_SIZE * sizeof(float));
1922 pa_aupdate_write_end(u->a_H[c]);
1923 }
1924 }
1925 pa_aupdate_write_end(u->a_H[r_channel]);
1926 }
1927
1928 void equalizer_handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
1929 struct userdata *u;
1930 double *H, preamp;
1931 uint32_t channel;
1932 unsigned _n_coefs;
1933 DBusMessage *signal = NULL;
1934 DBusError error;
1935 pa_assert_se(u = (struct userdata *) _u);
1936 pa_assert(conn);
1937 pa_assert(msg);
1938
1939 dbus_error_init(&error);
1940 if(!dbus_message_get_args(msg, &error,
1941 DBUS_TYPE_UINT32, &channel,
1942 DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &H, &_n_coefs,
1943 DBUS_TYPE_DOUBLE, &preamp,
1944 DBUS_TYPE_INVALID)){
1945 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
1946 dbus_error_free(&error);
1947 return;
1948 }
1949 if(channel > u->channels){
1950 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
1951 dbus_error_free(&error);
1952 return;
1953 }
1954 if(_n_coefs != FILTER_SIZE){
1955 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", FILTER_SIZE, _n_coefs);
1956 return;
1957 }
1958 set_filter(u, channel, H, preamp);
1959
1960 pa_dbus_send_empty_reply(conn, msg);
1961
1962 pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
1963 pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
1964 dbus_message_unref(signal);
1965 }
1966
1967 void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
1968 struct userdata *u = (struct userdata *) _u;
1969 char *name;
1970 uint32_t channel, r_channel;
1971 DBusMessage *signal = NULL;
1972 DBusError error;
1973 pa_assert(conn);
1974 pa_assert(msg);
1975 pa_assert(u);
1976 dbus_error_init(&error);
1977
1978 if(!dbus_message_get_args(msg, &error,
1979 DBUS_TYPE_UINT32, &channel,
1980 DBUS_TYPE_STRING, &name,
1981 DBUS_TYPE_INVALID)){
1982 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
1983 dbus_error_free(&error);
1984 return;
1985 }
1986 if(channel > u->channels){
1987 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
1988 dbus_error_free(&error);
1989 return;
1990 }
1991 r_channel = channel == u->channels ? 0 : channel;
1992 save_profile(u, r_channel, name);
1993 pa_dbus_send_empty_reply(conn, msg);
1994
1995 pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
1996 pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
1997 dbus_message_unref(signal);
1998 }
1999
2000 void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
2001 struct userdata *u = (struct userdata *) _u;
2002 char *name;
2003 DBusError error;
2004 uint32_t channel, r_channel;
2005 const char *err_msg = NULL;
2006 DBusMessage *signal = NULL;
2007
2008 pa_assert(conn);
2009 pa_assert(msg);
2010 pa_assert(u);
2011 dbus_error_init(&error);
2012
2013 if(!dbus_message_get_args(msg, &error,
2014 DBUS_TYPE_UINT32, &channel,
2015 DBUS_TYPE_STRING, &name,
2016 DBUS_TYPE_INVALID)){
2017 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
2018 dbus_error_free(&error);
2019 return;
2020 }
2021 if(channel > u->channels){
2022 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
2023 dbus_error_free(&error);
2024 return;
2025 }
2026 r_channel = channel == u->channels ? 0 : channel;
2027
2028 err_msg = load_profile(u, r_channel, name);
2029 if(err_msg != NULL){
2030 pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "error loading profile %s: %s", name, err_msg);
2031 dbus_error_free(&error);
2032 return;
2033 }
2034 if(channel == u->channels){
2035 for(uint32_t c = 1; c < u->channels; ++c){
2036 load_profile(u, c, name);
2037 }
2038 }
2039 pa_dbus_send_empty_reply(conn, msg);
2040
2041 pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
2042 pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
2043 dbus_message_unref(signal);
2044 }
2045
2046 void equalizer_handle_save_state(DBusConnection *conn, DBusMessage *msg, void *_u) {
2047 struct userdata *u = (struct userdata *) _u;
2048 pa_assert(conn);
2049 pa_assert(msg);
2050 pa_assert(u);
2051
2052 save_state(u);
2053 pa_dbus_send_empty_reply(conn, msg);
2054 }
2055
2056 void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, void *_u){
2057 struct userdata *u = (struct userdata *) _u;
2058 DBusError error;
2059 uint32_t channel, r_channel;
2060
2061 pa_assert(conn);
2062 pa_assert(msg);
2063 pa_assert(u);
2064 dbus_error_init(&error);
2065
2066 if(!dbus_message_get_args(msg, &error,
2067 DBUS_TYPE_UINT32, &channel,
2068 DBUS_TYPE_INVALID)){
2069 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
2070 dbus_error_free(&error);
2071 return;
2072 }
2073 if(channel > u->channels){
2074 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
2075 dbus_error_free(&error);
2076 return;
2077 }
2078 r_channel = channel == u->channels ? 0 : channel;
2079 pa_assert(u->base_profiles[r_channel]);
2080 pa_dbus_send_basic_value_reply(conn,msg, DBUS_TYPE_STRING, &u->base_profiles[r_channel]);
2081 }
2082
2083 void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
2084 uint32_t rev=1;
2085 pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
2086 }
2087
2088 void equalizer_get_n_channels(DBusConnection *conn, DBusMessage *msg, void *_u){
2089 struct userdata *u;
2090 uint32_t channels;
2091 pa_assert_se(u = (struct userdata *) _u);
2092 pa_assert(conn);
2093 pa_assert(msg);
2094
2095 channels = (uint32_t) u->channels;
2096 pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &channels);
2097 }
2098
2099 void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
2100 struct userdata *u;
2101 uint32_t n_coefs;
2102 pa_assert_se(u = (struct userdata *) _u);
2103 pa_assert(conn);
2104 pa_assert(msg);
2105
2106 n_coefs = (uint32_t) CHANNEL_PROFILE_SIZE;
2107 pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
2108 }
2109
2110 void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
2111 struct userdata *u;
2112 uint32_t rate;
2113 pa_assert_se(u = (struct userdata *) _u);
2114 pa_assert(conn);
2115 pa_assert(msg);
2116
2117 rate = (uint32_t) u->sink->sample_spec.rate;
2118 pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &rate);
2119 }
2120
2121 void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
2122 struct userdata *u;
2123 uint32_t fft_size;
2124 pa_assert_se(u = (struct userdata *) _u);
2125 pa_assert(conn);
2126 pa_assert(msg);
2127
2128 fft_size = (uint32_t) u->fft_size;
2129 pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
2130 }
2131
2132 void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
2133 struct userdata *u;
2134 DBusMessage *reply = NULL;
2135 DBusMessageIter msg_iter, dict_iter;
2136 uint32_t rev, n_coefs, rate, fft_size, channels;
2137 pa_assert_se(u = (struct userdata *) _u);
2138 pa_assert(msg);
2139
2140 rev = 1;
2141 n_coefs = (uint32_t) CHANNEL_PROFILE_SIZE;
2142 rate = (uint32_t) u->sink->sample_spec.rate;
2143 fft_size = (uint32_t) u->fft_size;
2144 channels = (uint32_t) u->channels;
2145
2146 pa_assert_se((reply = dbus_message_new_method_return(msg)));
2147 dbus_message_iter_init_append(reply, &msg_iter);
2148 pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
2149
2150 pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
2151 pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
2152 pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
2153 pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
2154 pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_CHANNELS].property_name, DBUS_TYPE_UINT32, &channels);
2155
2156 pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
2157 pa_assert_se(dbus_connection_send(conn, reply, NULL));
2158 dbus_message_unref(reply);
2159 }