Mercurial > mplayer.hg
comparison libaf/af_karaoke.c @ 18470:0ea3c732d72d
New karaoke af
author | reynaldo |
---|---|
date | Sat, 13 May 2006 08:46:31 +0000 |
parents | |
children | de155823ef82 |
comparison
equal
deleted
inserted
replaced
18469:241102f92b13 | 18470:0ea3c732d72d |
---|---|
1 /* | |
2 (c)2006 MPlayer / Reynaldo H. Verdejo Pinochet | |
3 Based on code by Alex Beregszaszi for his 'center' filter | |
4 | |
5 License: GPL | |
6 | |
7 Simple voice removal filter | |
8 */ | |
9 | |
10 #include <stdio.h> | |
11 #include <stdlib.h> | |
12 #include <string.h> | |
13 | |
14 #include "af.h" | |
15 | |
16 // Data for specific instances of this filter | |
17 | |
18 // Initialization and runtime control | |
19 static int control(struct af_instance_s* af, int cmd, void* arg) | |
20 { | |
21 switch(cmd){ | |
22 case AF_CONTROL_REINIT: | |
23 af->data->rate = ((af_data_t*)arg)->rate; | |
24 af->data->nch = ((af_data_t*)arg)->nch; | |
25 af->data->format= AF_FORMAT_FLOAT_NE; | |
26 af->data->bps = 4; | |
27 return af_test_output(af,(af_data_t*)arg); | |
28 } | |
29 return AF_UNKNOWN; | |
30 } | |
31 | |
32 // Deallocate memory | |
33 static void uninit(struct af_instance_s* af) | |
34 { | |
35 if(af->data) | |
36 free(af->data); | |
37 } | |
38 | |
39 // Filter data through filter | |
40 static af_data_t* play(struct af_instance_s* af, af_data_t* data) | |
41 { | |
42 af_data_t* c = data; // Current working data | |
43 float* a = c->audio; // Audio data | |
44 int len = c->len/4; // Number of samples in current audio block | |
45 int nch = c->nch; // Number of channels | |
46 register int i; | |
47 | |
48 /* | |
49 FIXME1 add a low band pass filter to avoid supressing | |
50 centered bass/drums | |
51 FIXME2 better calculated* atenuation factor | |
52 */ | |
53 | |
54 for(i=0;i<len;i+=nch) | |
55 { | |
56 a[i] = (a[i] - a[i+1]) * 0.7; | |
57 a[i+1]=a[i]; | |
58 } | |
59 | |
60 return c; | |
61 } | |
62 | |
63 // Allocate memory and set function pointers | |
64 static int open(af_instance_t* af){ | |
65 af->control = control; | |
66 af->uninit = uninit; | |
67 af->play = play; | |
68 af->mul.n = 1; | |
69 af->mul.d = 1; | |
70 af->data = calloc(1,sizeof(af_data_t)); | |
71 | |
72 if(af->data == NULL) | |
73 return AF_ERROR; | |
74 | |
75 return AF_OK; | |
76 } | |
77 | |
78 // Description of this filter | |
79 af_info_t af_info_karaoke = { | |
80 "Simple karaoke/voice-removal audio filter", | |
81 "karaoke", | |
82 "Reynaldo H. Verdejo Pinochet", | |
83 "", | |
84 AF_FLAGS_NOT_REENTRANT, | |
85 open | |
86 }; |