7568
|
1 #ifndef __aop_h__
|
|
2 #define __aop_h__
|
|
3
|
|
4 struct af_instance_s;
|
|
5
|
|
6 // Audio data chunk
|
|
7 typedef struct af_data_s
|
|
8 {
|
|
9 void* audio; // data buffer
|
|
10 int len; // buffer length
|
|
11 int rate; // sample rate
|
|
12 int nch; // number of channels
|
|
13 int format; // format
|
|
14 int bps; // bytes per sample
|
|
15 } af_data_t;
|
|
16
|
|
17 // Fraction, used to calculate buffer lengths
|
|
18 typedef struct frac_s
|
|
19 {
|
|
20 int n; // Numerator
|
|
21 int d; // Denominator
|
|
22 } frac_t;
|
|
23
|
|
24 /* Audio filter information not specific for current instance, but for
|
|
25 a specific filter */
|
|
26 typedef struct af_info_s
|
|
27 {
|
|
28 const char *info;
|
|
29 const char *name;
|
|
30 const char *author;
|
|
31 const char *comment;
|
|
32 int (*open)(struct af_instance_s* vf);
|
|
33 } af_info_t;
|
|
34
|
|
35 // Linked list of audio filters
|
|
36 typedef struct af_instance_s
|
|
37 {
|
|
38 af_info_t* info;
|
|
39 int (*control)(struct af_instance_s* af, int cmd, void* arg);
|
|
40 void (*uninit)(struct af_instance_s* af);
|
|
41 af_data_t* (*play)(struct af_instance_s* af, af_data_t* data);
|
|
42 void* setup; // setup data for this specific instance and filter
|
|
43 af_data_t* data; // configuration for outgoing data stream
|
|
44 struct af_instance_s* next;
|
|
45 struct af_instance_s* prev;
|
|
46 frac_t mul; /* length multiplier: how much does this instance change
|
|
47 the length of the buffer. */
|
|
48 }af_instance_t;
|
|
49
|
|
50 /*********************************************
|
|
51 // Control parameters
|
|
52 */
|
|
53
|
|
54 /* The control system is divided into 3 levels
|
|
55 mandatory calls - all filters must answer to all of these
|
|
56 optional calls - are optional
|
|
57 filter specific calls - applies only to some filters
|
|
58 */
|
|
59
|
|
60 #define AF_CONTROL_MANDATORY_BASE 0
|
|
61 #define AF_CONTROL_OPTIONAL_BASE 100
|
|
62 #define AF_CONTROL_FILTER_SPECIFIC_BASE 200
|
|
63
|
|
64 // MANDATORY CALLS
|
|
65
|
|
66 /* Reinitialize filter. The optional argument contains the new
|
|
67 configuration in form of a af_data_t struct. If the filter does not
|
|
68 support the new format the struct should be changed and AF_FALSE
|
|
69 should be returned. If the incoming and outgoing data streams are
|
|
70 identical the filter can return AF_DETACH. This will remove the
|
|
71 filter. */
|
|
72 #define AF_CONTROL_REINIT 1 + AF_CONTROL_MANDATORY_BASE
|
|
73
|
|
74 // OPTIONAL CALLS
|
|
75
|
|
76
|
|
77 // FILTER SPECIFIC CALLS
|
|
78
|
|
79 // Set output rate in resample
|
|
80 #define AF_CONTROL_RESAMPLE 1 + AF_CONTROL_FILTER_SPECIFIC_BASE
|
|
81 // Set output format in format
|
|
82 #define AF_CONTROL_FORMAT 2 + AF_CONTROL_FILTER_SPECIFIC_BASE
|
|
83 // Set number of output channels in channels
|
|
84 #define AF_CONTROL_CHANNELS 3 + AF_CONTROL_FILTER_SPECIFIC_BASE
|
|
85 // Set delay length in delay
|
|
86 #define AF_CONTROL_SET_DELAY_LEN 4 + AF_CONTROL_FILTER_SPECIFIC_BASE
|
|
87 /*********************************************
|
|
88 // Return values
|
|
89 */
|
|
90
|
|
91 #define AF_DETACH 2
|
|
92 #define AF_OK 1
|
|
93 #define AF_TRUE 1
|
|
94 #define AF_FALSE 0
|
|
95 #define AF_UNKNOWN -1
|
|
96 #define AF_ERROR -2
|
|
97 #define AF_NA -3
|
|
98
|
|
99
|
|
100 /*********************************************
|
|
101 // Command line configuration switches
|
|
102 */
|
|
103 typedef struct af_cfg_s{
|
|
104 int rate;
|
|
105 int format;
|
|
106 int bps;
|
|
107 int force;
|
|
108 char** list;
|
|
109 }af_cfg_t;
|
|
110
|
|
111
|
|
112 // Export functions
|
|
113
|
|
114 /* Init read configuration and create filter list accordingly. In and
|
|
115 out contains the format of the current movie and the formate of the
|
|
116 prefered output respectively */
|
|
117 int af_init(af_data_t* in, af_data_t* out);
|
|
118 // Uninit and remove all filters
|
|
119 void af_uninit();
|
|
120 // Filter data chunk through the filters in the list
|
|
121 af_data_t* af_play(af_data_t* data);
|
|
122 /* Calculate how long the output from the filters will be given the
|
|
123 input length "len" */
|
|
124 int af_outputlen(int len);
|
|
125 /* Calculate how long the input to the filters should be to produce a
|
|
126 certain output length, i.e. the return value of this function is
|
|
127 the input length required to produce the output length "len". */
|
|
128 int af_inputlen(int len);
|
|
129
|
|
130
|
|
131
|
|
132 // Helper functions and macros used inside the audio filters
|
|
133
|
|
134 /* Helper function called by the macro with the same name only to be
|
|
135 called from inside filters */
|
|
136 int af_resize_local_buffer(af_instance_t* af, af_data_t* data);
|
|
137
|
|
138 /* Helper function used to calculate the exact buffer length needed
|
|
139 when buffers are resized */
|
|
140 int af_lencalc(frac_t mul, int len);
|
|
141
|
|
142 /* Memory reallocation macro: if a local buffer is used (i.e. if the
|
|
143 filter doesn't operate on the incoming buffer this macro must be
|
|
144 called to ensure the buffer is big enough. */
|
|
145 #define RESIZE_LOCAL_BUFFER(a,d)\
|
|
146 ((af->data->len < af_lencalc(af->mul,data->len))?af_resize_local_buffer(af,data):AF_OK)
|
|
147
|
|
148 #ifndef min
|
|
149 #define min(a,b)(((a)>(b))?(b):(a))
|
|
150 #endif
|
|
151
|
|
152 #ifndef max
|
|
153 #define max(a,b)(((a)>(b))?(a):(b))
|
|
154 #endif
|
|
155
|
|
156 #ifndef AUDIO_FILTER
|
|
157 extern af_cfg_t af_cfg;
|
|
158 #endif /* AUDIO_FILTER */
|
|
159
|
|
160 #endif
|