Added speex_ctl call to set codec parameters (e.g. enable/disable
[speexdsp.git] / libspeex / modes.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: modes.c
3
4    Describes the different modes of the codec
5
6    This library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10    
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this library; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20 */
21
22 #include <stdlib.h>
23 #include "modes.h"
24 #include "ltp.h"
25 #include "quant_lsp.h"
26 #include "cb_search.h"
27 #include "sb_celp.h"
28 #include "nb_celp.h"
29 #include "post_filter.h"
30
31 /* Extern declarations for all codebooks we use here */
32 extern float gain_cdbk_nb[];
33 extern float hexc_table[];
34 extern float exc_5_256_table[];
35 extern float exc_5_64_table[];
36
37 /* Post-filter parameters for narrowband */
38 pf_params pf_params_nb = {
39    0.1,      /* formant enhancement factor */
40    0.6       /* pitch enhancement factor */
41 };
42
43 /* Post-filter parameters for wideband */
44 pf_params pf_params_sb = {
45    0.04,     /* formant enhancement factor */
46    0.4       /* pitch enhancement factor */
47 };
48
49 /* Parameters for Long-Term Prediction (LTP)*/
50 ltp_params ltp_params_nb = {
51    gain_cdbk_nb,
52    7,
53    7
54 };
55
56 /* Split-VQ innovation parameters */
57 split_cb_params split_cb_nb = {
58    5,               /*subvect_size*/
59    8,               /*nb_subvect*/
60    exc_5_64_table, /*shape_cb*/
61    6,               /*shape_bits*/
62 };
63
64 split_cb_params split_cb_sb = {
65    5,               /*subvect_size*/
66    8,              /*nb_subvect*/
67    exc_5_256_table,    /*shape_cb*/
68    8,               /*shape_bits*/
69 };
70
71 static split_cb_params split_cb_high = {
72    8,               /*subvect_size*/
73    5,               /*nb_subvect*/
74    hexc_table,       /*shape_cb*/
75    8,               /*shape_bits*/
76 };
77
78 /* Default mode for narrowband */
79 SpeexNBMode nb_mode = {
80    160,    /*frameSize*/
81    40,     /*subframeSize*/
82    320,    /*windowSize*/
83    10,     /*lpcSize*/
84    640,    /*bufSize*/
85    17,     /*pitchStart*/
86    144,    /*pitchEnd*/
87    0.9,    /*gamma1*/
88    0.6,    /*gamma2*/
89    .005,   /*lag_factor*/
90    1.0001, /*lpc_floor*/
91    0.0,    /*preemph*/
92    /*LSP quantization*/
93    lsp_quant_nb,
94    lsp_unquant_nb,
95    /*Pitch quantization*/
96    pitch_search_3tap,
97    pitch_unquant_3tap,
98    &ltp_params_nb,
99    /*Innovation quantization*/
100    split_cb_search_nogain2,
101    split_cb_nogain_unquant,
102    &split_cb_nb,
103    nb_post_filter,
104    &pf_params_nb
105 };
106
107 /* Narrowband mode used for split-band wideband CELP*/
108 static SpeexNBMode low_sb_mode = {
109    160,    /*frameSize*/
110    40,     /*subframeSize*/
111    320,    /*windowSize*/
112    10,     /*lpcSize*/
113    640,    /*bufSize*/
114    17,     /*pitchStart*/
115    144,    /*pitchEnd*/
116    .9,    /*gamma1*/
117    0.6,    /*gamma2*/
118    .002,   /*lag_factor*/
119    1.00005, /*lpc_floor*/
120    0.0,    /*preemph*/
121    /*LSP quantization*/
122    lsp_quant_nb,
123    lsp_unquant_nb,
124    /*Pitch quantization*/
125    pitch_search_3tap,
126    pitch_unquant_3tap,
127    &ltp_params_nb,
128    /*Innovation quantization*/
129    split_cb_search_nogain2,
130    split_cb_nogain_unquant,
131    &split_cb_sb,
132    nb_post_filter,
133    &pf_params_nb
134 };
135
136 SpeexMode low_wb_mode = {
137    &low_sb_mode,
138    &nb_encoder_init,
139    &nb_encoder_destroy,
140    &nb_encode,
141    &nb_decoder_init,
142    &nb_decoder_destroy,
143    &nb_decode,
144    &nb_ctl,
145    160
146 };
147
148 SpeexMode speex_nb_mode = {
149    &nb_mode,
150    &nb_encoder_init,
151    &nb_encoder_destroy,
152    &nb_encode,
153    &nb_decoder_init,
154    &nb_decoder_destroy,
155    &nb_decode,
156    &nb_ctl,
157    160
158 };
159
160 /* Split-band wideband CELP mode*/
161 static SpeexSBMode sb_wb_mode = {
162    &low_wb_mode,
163    160,    /*frameSize*/
164    40,     /*subframeSize*/
165    320,    /*windowSize*/
166    8,     /*lpcSize*/
167    640,    /*bufSize*/
168    .9,    /*gamma1*/
169    0.6,    /*gamma2*/
170    .002,   /*lag_factor*/
171    1.0001, /*lpc_floor*/
172    0.0,    /*preemph*/
173    /*LSP quantization*/
174    lsp_quant_high,
175    lsp_unquant_high,
176    /*Innovation quantization*/
177    split_cb_search_nogain2,
178    split_cb_nogain_unquant,
179    &split_cb_high
180 };
181
182
183 SpeexMode speex_wb_mode = {
184    &sb_wb_mode,
185    &sb_encoder_init,
186    &sb_encoder_destroy,
187    &sb_encode,
188    &sb_decoder_init,
189    &sb_decoder_destroy,
190    &sb_decode,
191    &sb_ctl,
192    320
193 };
194
195
196
197
198 void *speex_encoder_init(SpeexMode *mode)
199 {
200    return mode->enc_init(mode);
201 }
202
203 void *speex_decoder_init(SpeexMode *mode)
204 {
205    return mode->dec_init(mode);
206 }
207
208 void speex_encoder_destroy(void *state)
209 {
210    (*((SpeexMode**)state))->enc_destroy(state);
211 }
212
213 void speex_encode(void *state, float *in, SpeexBits *bits)
214 {
215    (*((SpeexMode**)state))->enc(state, in, bits);
216 }
217
218 void speex_decoder_destroy(void *state)
219 {
220    (*((SpeexMode**)state))->dec_destroy(state);
221 }
222
223 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
224 {
225    (*((SpeexMode**)state))->dec(state, bits, out, lost);
226 }
227
228
229 void speex_ctl(void *state, int request, void *ptr)
230 {
231    (*((SpeexMode**)state))->ctl(state, request, ptr);
232 }