lame 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/.gitignore +20 -0
  2. data/.rspec +3 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +181 -0
  8. data/Rakefile +6 -0
  9. data/docs/id3v2.4.0-structure.txt +731 -0
  10. data/docs/lame-3.99.5.h +1323 -0
  11. data/lame.gemspec +28 -0
  12. data/lib/lame.rb +31 -0
  13. data/lib/lame/buffer.rb +21 -0
  14. data/lib/lame/configuration.rb +228 -0
  15. data/lib/lame/decoder.rb +38 -0
  16. data/lib/lame/decoding/decoded_frame.rb +25 -0
  17. data/lib/lame/decoding/id3_tag_parser.rb +53 -0
  18. data/lib/lame/decoding/mp3_data_header_parser.rb +64 -0
  19. data/lib/lame/decoding/mpeg_audio_frame_finder.rb +46 -0
  20. data/lib/lame/decoding/mpeg_audio_frame_matcher.rb +98 -0
  21. data/lib/lame/decoding/single_frame_decoder.rb +51 -0
  22. data/lib/lame/decoding/stream_decoder.rb +37 -0
  23. data/lib/lame/delegation.rb +68 -0
  24. data/lib/lame/encoder.rb +73 -0
  25. data/lib/lame/encoding/encode_short_buffer.rb +26 -0
  26. data/lib/lame/encoding/flusher.rb +22 -0
  27. data/lib/lame/encoding/id3.rb +46 -0
  28. data/lib/lame/encoding/vbr_info.rb +22 -0
  29. data/lib/lame/error.rb +13 -0
  30. data/lib/lame/ffi.rb +20 -0
  31. data/lib/lame/ffi/decode_flags.rb +19 -0
  32. data/lib/lame/ffi/enums.rb +75 -0
  33. data/lib/lame/ffi/functions.rb +272 -0
  34. data/lib/lame/ffi/global_flags.rb +20 -0
  35. data/lib/lame/ffi/mp3_data.rb +37 -0
  36. data/lib/lame/ffi/version.rb +17 -0
  37. data/lib/lame/version.rb +3 -0
  38. data/spec/buffer_spec.rb +26 -0
  39. data/spec/configuration_spec.rb +391 -0
  40. data/spec/decoder_spec.rb +120 -0
  41. data/spec/decoding/decoded_frame_spec.rb +44 -0
  42. data/spec/decoding/id3_tag_parser_spec.rb +54 -0
  43. data/spec/decoding/mp3_data_header_parser_spec.rb +95 -0
  44. data/spec/decoding/mpeg_audio_frame_finder_spec.rb +50 -0
  45. data/spec/decoding/mpeg_audio_frame_matcher_spec.rb +179 -0
  46. data/spec/decoding/single_frame_decoder_spec.rb +104 -0
  47. data/spec/decoding/stream_decoder_spec.rb +43 -0
  48. data/spec/delegation_spec.rb +146 -0
  49. data/spec/encoder_spec.rb +279 -0
  50. data/spec/encoding/encode_short_buffer_spec.rb +72 -0
  51. data/spec/encoding/flusher_spec.rb +47 -0
  52. data/spec/encoding/id3_spec.rb +106 -0
  53. data/spec/encoding/vbr_info_spec.rb +47 -0
  54. data/spec/ffi/decode_flags_spec.rb +16 -0
  55. data/spec/ffi/encoding_spec.rb +223 -0
  56. data/spec/ffi/global_flags_spec.rb +542 -0
  57. data/spec/ffi/id3tag_spec.rb +135 -0
  58. data/spec/ffi/mp3_data_spec.rb +26 -0
  59. data/spec/files/dies-irae.wav +0 -0
  60. data/spec/integration/decoding_spec.rb +179 -0
  61. data/spec/integration/encoding_spec.rb +126 -0
  62. data/spec/integration/id3_tags_spec.rb +96 -0
  63. data/spec/spec_helper.rb +175 -0
  64. metadata +254 -0
@@ -0,0 +1,1323 @@
1
+ /*
2
+ * Interface to MP3 LAME encoding engine
3
+ *
4
+ * Copyright (c) 1999 Mark Taylor
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Library General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2 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
+ * Library General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Library General Public
17
+ * License along with this library; if not, write to the
18
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
+ * Boston, MA 02111-1307, USA.
20
+ */
21
+
22
+ /* $Id: lame.h,v 1.189.2.1 2012/01/08 23:49:58 robert Exp $ */
23
+
24
+ #ifndef LAME_LAME_H
25
+ #define LAME_LAME_H
26
+
27
+ /* for size_t typedef */
28
+ #include <stddef.h>
29
+ /* for va_list typedef */
30
+ #include <stdarg.h>
31
+ /* for FILE typedef, TODO: remove when removing lame_mp3_tags_fid */
32
+ #include <stdio.h>
33
+
34
+ #if defined(__cplusplus)
35
+ extern "C" {
36
+ #endif
37
+
38
+ typedef void (*lame_report_function)(const char *format, va_list ap);
39
+
40
+ #if defined(WIN32) || defined(_WIN32)
41
+ #undef CDECL
42
+ #define CDECL __cdecl
43
+ #else
44
+ #define CDECL
45
+ #endif
46
+
47
+ #define DEPRECATED_OR_OBSOLETE_CODE_REMOVED 1
48
+
49
+ typedef enum vbr_mode_e {
50
+ vbr_off=0,
51
+ vbr_mt, /* obsolete, same as vbr_mtrh */
52
+ vbr_rh,
53
+ vbr_abr,
54
+ vbr_mtrh,
55
+ vbr_max_indicator, /* Don't use this! It's used for sanity checks. */
56
+ vbr_default=vbr_mtrh /* change this to change the default VBR mode of LAME */
57
+ } vbr_mode;
58
+
59
+
60
+ /* MPEG modes */
61
+ typedef enum MPEG_mode_e {
62
+ STEREO = 0,
63
+ JOINT_STEREO,
64
+ DUAL_CHANNEL, /* LAME doesn't supports this! */
65
+ MONO,
66
+ NOT_SET,
67
+ MAX_INDICATOR /* Don't use this! It's used for sanity checks. */
68
+ } MPEG_mode;
69
+
70
+ /* Padding types */
71
+ typedef enum Padding_type_e {
72
+ PAD_NO = 0,
73
+ PAD_ALL,
74
+ PAD_ADJUST,
75
+ PAD_MAX_INDICATOR /* Don't use this! It's used for sanity checks. */
76
+ } Padding_type;
77
+
78
+
79
+
80
+ /*presets*/
81
+ typedef enum preset_mode_e {
82
+ /*values from 8 to 320 should be reserved for abr bitrates*/
83
+ /*for abr I'd suggest to directly use the targeted bitrate as a value*/
84
+ ABR_8 = 8,
85
+ ABR_320 = 320,
86
+
87
+ V9 = 410, /*Vx to match Lame and VBR_xx to match FhG*/
88
+ VBR_10 = 410,
89
+ V8 = 420,
90
+ VBR_20 = 420,
91
+ V7 = 430,
92
+ VBR_30 = 430,
93
+ V6 = 440,
94
+ VBR_40 = 440,
95
+ V5 = 450,
96
+ VBR_50 = 450,
97
+ V4 = 460,
98
+ VBR_60 = 460,
99
+ V3 = 470,
100
+ VBR_70 = 470,
101
+ V2 = 480,
102
+ VBR_80 = 480,
103
+ V1 = 490,
104
+ VBR_90 = 490,
105
+ V0 = 500,
106
+ VBR_100 = 500,
107
+
108
+
109
+
110
+ /*still there for compatibility*/
111
+ R3MIX = 1000,
112
+ STANDARD = 1001,
113
+ EXTREME = 1002,
114
+ INSANE = 1003,
115
+ STANDARD_FAST = 1004,
116
+ EXTREME_FAST = 1005,
117
+ MEDIUM = 1006,
118
+ MEDIUM_FAST = 1007
119
+ } preset_mode;
120
+
121
+
122
+ /*asm optimizations*/
123
+ typedef enum asm_optimizations_e {
124
+ MMX = 1,
125
+ AMD_3DNOW = 2,
126
+ SSE = 3
127
+ } asm_optimizations;
128
+
129
+
130
+ /* psychoacoustic model */
131
+ typedef enum Psy_model_e {
132
+ PSY_GPSYCHO = 1,
133
+ PSY_NSPSYTUNE = 2
134
+ } Psy_model;
135
+
136
+
137
+ /* buffer considerations */
138
+ typedef enum buffer_constraint_e {
139
+ MDB_DEFAULT=0,
140
+ MDB_STRICT_ISO=1,
141
+ MDB_MAXIMUM=2
142
+ } buffer_constraint;
143
+
144
+
145
+ struct lame_global_struct;
146
+ typedef struct lame_global_struct lame_global_flags;
147
+ typedef lame_global_flags *lame_t;
148
+
149
+
150
+
151
+
152
+ /***********************************************************************
153
+ *
154
+ * The LAME API
155
+ * These functions should be called, in this order, for each
156
+ * MP3 file to be encoded. See the file "API" for more documentation
157
+ *
158
+ ***********************************************************************/
159
+
160
+
161
+ /*
162
+ * REQUIRED:
163
+ * initialize the encoder. sets default for all encoder parameters,
164
+ * returns NULL if some malloc()'s failed
165
+ * otherwise returns pointer to structure needed for all future
166
+ * API calls.
167
+ */
168
+ lame_global_flags * CDECL lame_init(void);
169
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
170
+ #else
171
+ /* obsolete version */
172
+ int CDECL lame_init_old(lame_global_flags *);
173
+ #endif
174
+
175
+ /*
176
+ * OPTIONAL:
177
+ * set as needed to override defaults
178
+ */
179
+
180
+ /********************************************************************
181
+ * input stream description
182
+ ***********************************************************************/
183
+ /* number of samples. default = 2^32-1 */
184
+ int CDECL lame_set_num_samples(lame_global_flags *, unsigned long);
185
+ unsigned long CDECL lame_get_num_samples(const lame_global_flags *);
186
+
187
+ /* input sample rate in Hz. default = 44100hz */
188
+ int CDECL lame_set_in_samplerate(lame_global_flags *, int);
189
+ int CDECL lame_get_in_samplerate(const lame_global_flags *);
190
+
191
+ /* number of channels in input stream. default=2 */
192
+ int CDECL lame_set_num_channels(lame_global_flags *, int);
193
+ int CDECL lame_get_num_channels(const lame_global_flags *);
194
+
195
+ /*
196
+ scale the input by this amount before encoding. default=1
197
+ (not used by decoding routines)
198
+ */
199
+ int CDECL lame_set_scale(lame_global_flags *, float);
200
+ float CDECL lame_get_scale(const lame_global_flags *);
201
+
202
+ /*
203
+ scale the channel 0 (left) input by this amount before encoding. default=1
204
+ (not used by decoding routines)
205
+ */
206
+ int CDECL lame_set_scale_left(lame_global_flags *, float);
207
+ float CDECL lame_get_scale_left(const lame_global_flags *);
208
+
209
+ /*
210
+ scale the channel 1 (right) input by this amount before encoding. default=1
211
+ (not used by decoding routines)
212
+ */
213
+ int CDECL lame_set_scale_right(lame_global_flags *, float);
214
+ float CDECL lame_get_scale_right(const lame_global_flags *);
215
+
216
+ /*
217
+ output sample rate in Hz. default = 0, which means LAME picks best value
218
+ based on the amount of compression. MPEG only allows:
219
+ MPEG1 32, 44.1, 48khz
220
+ MPEG2 16, 22.05, 24
221
+ MPEG2.5 8, 11.025, 12
222
+ (not used by decoding routines)
223
+ */
224
+ int CDECL lame_set_out_samplerate(lame_global_flags *, int);
225
+ int CDECL lame_get_out_samplerate(const lame_global_flags *);
226
+
227
+
228
+ /********************************************************************
229
+ * general control parameters
230
+ ***********************************************************************/
231
+ /* 1=cause LAME to collect data for an MP3 frame analyzer. default=0 */
232
+ int CDECL lame_set_analysis(lame_global_flags *, int);
233
+ int CDECL lame_get_analysis(const lame_global_flags *);
234
+
235
+ /*
236
+ 1 = write a Xing VBR header frame.
237
+ default = 1
238
+ this variable must have been added by a Hungarian notation Windows programmer :-)
239
+ */
240
+ int CDECL lame_set_bWriteVbrTag(lame_global_flags *, int);
241
+ int CDECL lame_get_bWriteVbrTag(const lame_global_flags *);
242
+
243
+ /* 1=decode only. use lame/mpglib to convert mp3/ogg to wav. default=0 */
244
+ int CDECL lame_set_decode_only(lame_global_flags *, int);
245
+ int CDECL lame_get_decode_only(const lame_global_flags *);
246
+
247
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
248
+ #else
249
+ /* 1=encode a Vorbis .ogg file. default=0 */
250
+ /* DEPRECATED */
251
+ int CDECL lame_set_ogg(lame_global_flags *, int);
252
+ int CDECL lame_get_ogg(const lame_global_flags *);
253
+ #endif
254
+
255
+ /*
256
+ internal algorithm selection. True quality is determined by the bitrate
257
+ but this variable will effect quality by selecting expensive or cheap algorithms.
258
+ quality=0..9. 0=best (very slow). 9=worst.
259
+ recommended: 2 near-best quality, not too slow
260
+ 5 good quality, fast
261
+ 7 ok quality, really fast
262
+ */
263
+ int CDECL lame_set_quality(lame_global_flags *, int);
264
+ int CDECL lame_get_quality(const lame_global_flags *);
265
+
266
+ /*
267
+ mode = 0,1,2,3 = stereo, jstereo, dual channel (not supported), mono
268
+ default: lame picks based on compression ration and input channels
269
+ */
270
+ int CDECL lame_set_mode(lame_global_flags *, MPEG_mode);
271
+ MPEG_mode CDECL lame_get_mode(const lame_global_flags *);
272
+
273
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
274
+ #else
275
+ /*
276
+ mode_automs. Use a M/S mode with a switching threshold based on
277
+ compression ratio
278
+ DEPRECATED
279
+ */
280
+ int CDECL lame_set_mode_automs(lame_global_flags *, int);
281
+ int CDECL lame_get_mode_automs(const lame_global_flags *);
282
+ #endif
283
+
284
+ /*
285
+ force_ms. Force M/S for all frames. For testing only.
286
+ default = 0 (disabled)
287
+ */
288
+ int CDECL lame_set_force_ms(lame_global_flags *, int);
289
+ int CDECL lame_get_force_ms(const lame_global_flags *);
290
+
291
+ /* use free_format? default = 0 (disabled) */
292
+ int CDECL lame_set_free_format(lame_global_flags *, int);
293
+ int CDECL lame_get_free_format(const lame_global_flags *);
294
+
295
+ /* perform ReplayGain analysis? default = 0 (disabled) */
296
+ int CDECL lame_set_findReplayGain(lame_global_flags *, int);
297
+ int CDECL lame_get_findReplayGain(const lame_global_flags *);
298
+
299
+ /* decode on the fly. Search for the peak sample. If the ReplayGain
300
+ * analysis is enabled then perform the analysis on the decoded data
301
+ * stream. default = 0 (disabled)
302
+ * NOTE: if this option is set the build-in decoder should not be used */
303
+ int CDECL lame_set_decode_on_the_fly(lame_global_flags *, int);
304
+ int CDECL lame_get_decode_on_the_fly(const lame_global_flags *);
305
+
306
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
307
+ #else
308
+ /* DEPRECATED: now does the same as lame_set_findReplayGain()
309
+ default = 0 (disabled) */
310
+ int CDECL lame_set_ReplayGain_input(lame_global_flags *, int);
311
+ int CDECL lame_get_ReplayGain_input(const lame_global_flags *);
312
+
313
+ /* DEPRECATED: now does the same as
314
+ lame_set_decode_on_the_fly() && lame_set_findReplayGain()
315
+ default = 0 (disabled) */
316
+ int CDECL lame_set_ReplayGain_decode(lame_global_flags *, int);
317
+ int CDECL lame_get_ReplayGain_decode(const lame_global_flags *);
318
+
319
+ /* DEPRECATED: now does the same as lame_set_decode_on_the_fly()
320
+ default = 0 (disabled) */
321
+ int CDECL lame_set_findPeakSample(lame_global_flags *, int);
322
+ int CDECL lame_get_findPeakSample(const lame_global_flags *);
323
+ #endif
324
+
325
+ /* counters for gapless encoding */
326
+ int CDECL lame_set_nogap_total(lame_global_flags*, int);
327
+ int CDECL lame_get_nogap_total(const lame_global_flags*);
328
+
329
+ int CDECL lame_set_nogap_currentindex(lame_global_flags* , int);
330
+ int CDECL lame_get_nogap_currentindex(const lame_global_flags*);
331
+
332
+
333
+ /*
334
+ * OPTIONAL:
335
+ * Set printf like error/debug/message reporting functions.
336
+ * The second argument has to be a pointer to a function which looks like
337
+ * void my_debugf(const char *format, va_list ap)
338
+ * {
339
+ * (void) vfprintf(stdout, format, ap);
340
+ * }
341
+ * If you use NULL as the value of the pointer in the set function, the
342
+ * lame buildin function will be used (prints to stderr).
343
+ * To quiet any output you have to replace the body of the example function
344
+ * with just "return;" and use it in the set function.
345
+ */
346
+ int CDECL lame_set_errorf(lame_global_flags *, lame_report_function);
347
+ int CDECL lame_set_debugf(lame_global_flags *, lame_report_function);
348
+ int CDECL lame_set_msgf (lame_global_flags *, lame_report_function);
349
+
350
+
351
+
352
+ /* set one of brate compression ratio. default is compression ratio of 11. */
353
+ int CDECL lame_set_brate(lame_global_flags *, int);
354
+ int CDECL lame_get_brate(const lame_global_flags *);
355
+ int CDECL lame_set_compression_ratio(lame_global_flags *, float);
356
+ float CDECL lame_get_compression_ratio(const lame_global_flags *);
357
+
358
+
359
+ int CDECL lame_set_preset( lame_global_flags* gfp, int );
360
+ int CDECL lame_set_asm_optimizations( lame_global_flags* gfp, int, int );
361
+
362
+
363
+
364
+ /********************************************************************
365
+ * frame params
366
+ ***********************************************************************/
367
+ /* mark as copyright. default=0 */
368
+ int CDECL lame_set_copyright(lame_global_flags *, int);
369
+ int CDECL lame_get_copyright(const lame_global_flags *);
370
+
371
+ /* mark as original. default=1 */
372
+ int CDECL lame_set_original(lame_global_flags *, int);
373
+ int CDECL lame_get_original(const lame_global_flags *);
374
+
375
+ /* error_protection. Use 2 bytes from each frame for CRC checksum. default=0 */
376
+ int CDECL lame_set_error_protection(lame_global_flags *, int);
377
+ int CDECL lame_get_error_protection(const lame_global_flags *);
378
+
379
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
380
+ #else
381
+ /* padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default) */
382
+ int CDECL lame_set_padding_type(lame_global_flags *, Padding_type);
383
+ Padding_type CDECL lame_get_padding_type(const lame_global_flags *);
384
+ #endif
385
+
386
+ /* MP3 'private extension' bit Meaningless. default=0 */
387
+ int CDECL lame_set_extension(lame_global_flags *, int);
388
+ int CDECL lame_get_extension(const lame_global_flags *);
389
+
390
+ /* enforce strict ISO compliance. default=0 */
391
+ int CDECL lame_set_strict_ISO(lame_global_flags *, int);
392
+ int CDECL lame_get_strict_ISO(const lame_global_flags *);
393
+
394
+
395
+ /********************************************************************
396
+ * quantization/noise shaping
397
+ ***********************************************************************/
398
+
399
+ /* disable the bit reservoir. For testing only. default=0 */
400
+ int CDECL lame_set_disable_reservoir(lame_global_flags *, int);
401
+ int CDECL lame_get_disable_reservoir(const lame_global_flags *);
402
+
403
+ /* select a different "best quantization" function. default=0 */
404
+ int CDECL lame_set_quant_comp(lame_global_flags *, int);
405
+ int CDECL lame_get_quant_comp(const lame_global_flags *);
406
+ int CDECL lame_set_quant_comp_short(lame_global_flags *, int);
407
+ int CDECL lame_get_quant_comp_short(const lame_global_flags *);
408
+
409
+ int CDECL lame_set_experimentalX(lame_global_flags *, int); /* compatibility*/
410
+ int CDECL lame_get_experimentalX(const lame_global_flags *);
411
+
412
+ /* another experimental option. for testing only */
413
+ int CDECL lame_set_experimentalY(lame_global_flags *, int);
414
+ int CDECL lame_get_experimentalY(const lame_global_flags *);
415
+
416
+ /* another experimental option. for testing only */
417
+ int CDECL lame_set_experimentalZ(lame_global_flags *, int);
418
+ int CDECL lame_get_experimentalZ(const lame_global_flags *);
419
+
420
+ /* Naoki's psycho acoustic model. default=0 */
421
+ int CDECL lame_set_exp_nspsytune(lame_global_flags *, int);
422
+ int CDECL lame_get_exp_nspsytune(const lame_global_flags *);
423
+
424
+ void CDECL lame_set_msfix(lame_global_flags *, double);
425
+ float CDECL lame_get_msfix(const lame_global_flags *);
426
+
427
+
428
+ /********************************************************************
429
+ * VBR control
430
+ ***********************************************************************/
431
+ /* Types of VBR. default = vbr_off = CBR */
432
+ int CDECL lame_set_VBR(lame_global_flags *, vbr_mode);
433
+ vbr_mode CDECL lame_get_VBR(const lame_global_flags *);
434
+
435
+ /* VBR quality level. 0=highest 9=lowest */
436
+ int CDECL lame_set_VBR_q(lame_global_flags *, int);
437
+ int CDECL lame_get_VBR_q(const lame_global_flags *);
438
+
439
+ /* VBR quality level. 0=highest 9=lowest, Range [0,...,10[ */
440
+ int CDECL lame_set_VBR_quality(lame_global_flags *, float);
441
+ float CDECL lame_get_VBR_quality(const lame_global_flags *);
442
+
443
+ /* Ignored except for VBR=vbr_abr (ABR mode) */
444
+ int CDECL lame_set_VBR_mean_bitrate_kbps(lame_global_flags *, int);
445
+ int CDECL lame_get_VBR_mean_bitrate_kbps(const lame_global_flags *);
446
+
447
+ int CDECL lame_set_VBR_min_bitrate_kbps(lame_global_flags *, int);
448
+ int CDECL lame_get_VBR_min_bitrate_kbps(const lame_global_flags *);
449
+
450
+ int CDECL lame_set_VBR_max_bitrate_kbps(lame_global_flags *, int);
451
+ int CDECL lame_get_VBR_max_bitrate_kbps(const lame_global_flags *);
452
+
453
+ /*
454
+ 1=strictly enforce VBR_min_bitrate. Normally it will be violated for
455
+ analog silence
456
+ */
457
+ int CDECL lame_set_VBR_hard_min(lame_global_flags *, int);
458
+ int CDECL lame_get_VBR_hard_min(const lame_global_flags *);
459
+
460
+ /* for preset */
461
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
462
+ #else
463
+ int CDECL lame_set_preset_expopts(lame_global_flags *, int);
464
+ #endif
465
+
466
+ /********************************************************************
467
+ * Filtering control
468
+ ***********************************************************************/
469
+ /* freq in Hz to apply lowpass. Default = 0 = lame chooses. -1 = disabled */
470
+ int CDECL lame_set_lowpassfreq(lame_global_flags *, int);
471
+ int CDECL lame_get_lowpassfreq(const lame_global_flags *);
472
+ /* width of transition band, in Hz. Default = one polyphase filter band */
473
+ int CDECL lame_set_lowpasswidth(lame_global_flags *, int);
474
+ int CDECL lame_get_lowpasswidth(const lame_global_flags *);
475
+
476
+ /* freq in Hz to apply highpass. Default = 0 = lame chooses. -1 = disabled */
477
+ int CDECL lame_set_highpassfreq(lame_global_flags *, int);
478
+ int CDECL lame_get_highpassfreq(const lame_global_flags *);
479
+ /* width of transition band, in Hz. Default = one polyphase filter band */
480
+ int CDECL lame_set_highpasswidth(lame_global_flags *, int);
481
+ int CDECL lame_get_highpasswidth(const lame_global_flags *);
482
+
483
+
484
+ /********************************************************************
485
+ * psycho acoustics and other arguments which you should not change
486
+ * unless you know what you are doing
487
+ ***********************************************************************/
488
+
489
+ /* only use ATH for masking */
490
+ int CDECL lame_set_ATHonly(lame_global_flags *, int);
491
+ int CDECL lame_get_ATHonly(const lame_global_flags *);
492
+
493
+ /* only use ATH for short blocks */
494
+ int CDECL lame_set_ATHshort(lame_global_flags *, int);
495
+ int CDECL lame_get_ATHshort(const lame_global_flags *);
496
+
497
+ /* disable ATH */
498
+ int CDECL lame_set_noATH(lame_global_flags *, int);
499
+ int CDECL lame_get_noATH(const lame_global_flags *);
500
+
501
+ /* select ATH formula */
502
+ int CDECL lame_set_ATHtype(lame_global_flags *, int);
503
+ int CDECL lame_get_ATHtype(const lame_global_flags *);
504
+
505
+ /* lower ATH by this many db */
506
+ int CDECL lame_set_ATHlower(lame_global_flags *, float);
507
+ float CDECL lame_get_ATHlower(const lame_global_flags *);
508
+
509
+ /* select ATH adaptive adjustment type */
510
+ int CDECL lame_set_athaa_type( lame_global_flags *, int);
511
+ int CDECL lame_get_athaa_type( const lame_global_flags *);
512
+
513
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
514
+ #else
515
+ /* select the loudness approximation used by the ATH adaptive auto-leveling */
516
+ int CDECL lame_set_athaa_loudapprox( lame_global_flags *, int);
517
+ int CDECL lame_get_athaa_loudapprox( const lame_global_flags *);
518
+ #endif
519
+
520
+ /* adjust (in dB) the point below which adaptive ATH level adjustment occurs */
521
+ int CDECL lame_set_athaa_sensitivity( lame_global_flags *, float);
522
+ float CDECL lame_get_athaa_sensitivity( const lame_global_flags* );
523
+
524
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
525
+ #else
526
+ /* OBSOLETE: predictability limit (ISO tonality formula) */
527
+ int CDECL lame_set_cwlimit(lame_global_flags *, int);
528
+ int CDECL lame_get_cwlimit(const lame_global_flags *);
529
+ #endif
530
+
531
+ /*
532
+ allow blocktypes to differ between channels?
533
+ default: 0 for jstereo, 1 for stereo
534
+ */
535
+ int CDECL lame_set_allow_diff_short(lame_global_flags *, int);
536
+ int CDECL lame_get_allow_diff_short(const lame_global_flags *);
537
+
538
+ /* use temporal masking effect (default = 1) */
539
+ int CDECL lame_set_useTemporal(lame_global_flags *, int);
540
+ int CDECL lame_get_useTemporal(const lame_global_flags *);
541
+
542
+ /* use temporal masking effect (default = 1) */
543
+ int CDECL lame_set_interChRatio(lame_global_flags *, float);
544
+ float CDECL lame_get_interChRatio(const lame_global_flags *);
545
+
546
+ /* disable short blocks */
547
+ int CDECL lame_set_no_short_blocks(lame_global_flags *, int);
548
+ int CDECL lame_get_no_short_blocks(const lame_global_flags *);
549
+
550
+ /* force short blocks */
551
+ int CDECL lame_set_force_short_blocks(lame_global_flags *, int);
552
+ int CDECL lame_get_force_short_blocks(const lame_global_flags *);
553
+
554
+ /* Input PCM is emphased PCM (for instance from one of the rarely
555
+ emphased CDs), it is STRONGLY not recommended to use this, because
556
+ psycho does not take it into account, and last but not least many decoders
557
+ ignore these bits */
558
+ int CDECL lame_set_emphasis(lame_global_flags *, int);
559
+ int CDECL lame_get_emphasis(const lame_global_flags *);
560
+
561
+
562
+
563
+ /************************************************************************/
564
+ /* internal variables, cannot be set... */
565
+ /* provided because they may be of use to calling application */
566
+ /************************************************************************/
567
+ /* version 0=MPEG-2 1=MPEG-1 (2=MPEG-2.5) */
568
+ int CDECL lame_get_version(const lame_global_flags *);
569
+
570
+ /* encoder delay */
571
+ int CDECL lame_get_encoder_delay(const lame_global_flags *);
572
+
573
+ /*
574
+ padding appended to the input to make sure decoder can fully decode
575
+ all input. Note that this value can only be calculated during the
576
+ call to lame_encoder_flush(). Before lame_encoder_flush() has
577
+ been called, the value of encoder_padding = 0.
578
+ */
579
+ int CDECL lame_get_encoder_padding(const lame_global_flags *);
580
+
581
+ /* size of MPEG frame */
582
+ int CDECL lame_get_framesize(const lame_global_flags *);
583
+
584
+ /* number of PCM samples buffered, but not yet encoded to mp3 data. */
585
+ int CDECL lame_get_mf_samples_to_encode( const lame_global_flags* gfp );
586
+
587
+ /*
588
+ size (bytes) of mp3 data buffered, but not yet encoded.
589
+ this is the number of bytes which would be output by a call to
590
+ lame_encode_flush_nogap. NOTE: lame_encode_flush() will return
591
+ more bytes than this because it will encode the reamining buffered
592
+ PCM samples before flushing the mp3 buffers.
593
+ */
594
+ int CDECL lame_get_size_mp3buffer( const lame_global_flags* gfp );
595
+
596
+ /* number of frames encoded so far */
597
+ int CDECL lame_get_frameNum(const lame_global_flags *);
598
+
599
+ /*
600
+ lame's estimate of the total number of frames to be encoded
601
+ only valid if calling program set num_samples
602
+ */
603
+ int CDECL lame_get_totalframes(const lame_global_flags *);
604
+
605
+ /* RadioGain value. Multiplied by 10 and rounded to the nearest. */
606
+ int CDECL lame_get_RadioGain(const lame_global_flags *);
607
+
608
+ /* AudiophileGain value. Multipled by 10 and rounded to the nearest. */
609
+ int CDECL lame_get_AudiophileGain(const lame_global_flags *);
610
+
611
+ /* the peak sample */
612
+ float CDECL lame_get_PeakSample(const lame_global_flags *);
613
+
614
+ /* Gain change required for preventing clipping. The value is correct only if
615
+ peak sample searching was enabled. If negative then the waveform
616
+ already does not clip. The value is multiplied by 10 and rounded up. */
617
+ int CDECL lame_get_noclipGainChange(const lame_global_flags *);
618
+
619
+ /* user-specified scale factor required for preventing clipping. Value is
620
+ correct only if peak sample searching was enabled and no user-specified
621
+ scaling was performed. If negative then either the waveform already does
622
+ not clip or the value cannot be determined */
623
+ float CDECL lame_get_noclipScale(const lame_global_flags *);
624
+
625
+
626
+
627
+
628
+
629
+
630
+
631
+ /*
632
+ * REQUIRED:
633
+ * sets more internal configuration based on data provided above.
634
+ * returns -1 if something failed.
635
+ */
636
+ int CDECL lame_init_params(lame_global_flags *);
637
+
638
+
639
+ /*
640
+ * OPTIONAL:
641
+ * get the version number, in a string. of the form:
642
+ * "3.63 (beta)" or just "3.63".
643
+ */
644
+ const char* CDECL get_lame_version ( void );
645
+ const char* CDECL get_lame_short_version ( void );
646
+ const char* CDECL get_lame_very_short_version ( void );
647
+ const char* CDECL get_psy_version ( void );
648
+ const char* CDECL get_lame_url ( void );
649
+ const char* CDECL get_lame_os_bitness ( void );
650
+
651
+ /*
652
+ * OPTIONAL:
653
+ * get the version numbers in numerical form.
654
+ */
655
+ typedef struct {
656
+ /* generic LAME version */
657
+ int major;
658
+ int minor;
659
+ int alpha; /* 0 if not an alpha version */
660
+ int beta; /* 0 if not a beta version */
661
+
662
+ /* version of the psy model */
663
+ int psy_major;
664
+ int psy_minor;
665
+ int psy_alpha; /* 0 if not an alpha version */
666
+ int psy_beta; /* 0 if not a beta version */
667
+
668
+ /* compile time features */
669
+ const char *features; /* Don't make assumptions about the contents! */
670
+ } lame_version_t;
671
+ void CDECL get_lame_version_numerical(lame_version_t *);
672
+
673
+
674
+ /*
675
+ * OPTIONAL:
676
+ * print internal lame configuration to message handler
677
+ */
678
+ void CDECL lame_print_config(const lame_global_flags* gfp);
679
+
680
+ void CDECL lame_print_internals( const lame_global_flags *gfp);
681
+
682
+
683
+ /*
684
+ * input pcm data, output (maybe) mp3 frames.
685
+ * This routine handles all buffering, resampling and filtering for you.
686
+ *
687
+ * return code number of bytes output in mp3buf. Can be 0
688
+ * -1: mp3buf was too small
689
+ * -2: malloc() problem
690
+ * -3: lame_init_params() not called
691
+ * -4: psycho acoustic problems
692
+ *
693
+ * The required mp3buf_size can be computed from num_samples,
694
+ * samplerate and encoding rate, but here is a worst case estimate:
695
+ *
696
+ * mp3buf_size in bytes = 1.25*num_samples + 7200
697
+ *
698
+ * I think a tighter bound could be: (mt, March 2000)
699
+ * MPEG1:
700
+ * num_samples*(bitrate/8)/samplerate + 4*1152*(bitrate/8)/samplerate + 512
701
+ * MPEG2:
702
+ * num_samples*(bitrate/8)/samplerate + 4*576*(bitrate/8)/samplerate + 256
703
+ *
704
+ * but test first if you use that!
705
+ *
706
+ * set mp3buf_size = 0 and LAME will not check if mp3buf_size is
707
+ * large enough.
708
+ *
709
+ * NOTE:
710
+ * if gfp->num_channels=2, but gfp->mode = 3 (mono), the L & R channels
711
+ * will be averaged into the L channel before encoding only the L channel
712
+ * This will overwrite the data in buffer_l[] and buffer_r[].
713
+ *
714
+ */
715
+ int CDECL lame_encode_buffer (
716
+ lame_global_flags* gfp, /* global context handle */
717
+ const short int buffer_l [], /* PCM data for left channel */
718
+ const short int buffer_r [], /* PCM data for right channel */
719
+ const int nsamples, /* number of samples per channel */
720
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
721
+ const int mp3buf_size ); /* number of valid octets in this
722
+ stream */
723
+
724
+ /*
725
+ * as above, but input has L & R channel data interleaved.
726
+ * NOTE:
727
+ * num_samples = number of samples in the L (or R)
728
+ * channel, not the total number of samples in pcm[]
729
+ */
730
+ int CDECL lame_encode_buffer_interleaved(
731
+ lame_global_flags* gfp, /* global context handlei */
732
+ short int pcm[], /* PCM data for left and right
733
+ channel, interleaved */
734
+ int num_samples, /* number of samples per channel,
735
+ _not_ number of samples in
736
+ pcm[] */
737
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
738
+ int mp3buf_size ); /* number of valid octets in this
739
+ stream */
740
+
741
+
742
+ /* as lame_encode_buffer, but for 'float's.
743
+ * !! NOTE: !! data must still be scaled to be in the same range as
744
+ * short int, +/- 32768
745
+ */
746
+ int CDECL lame_encode_buffer_float(
747
+ lame_global_flags* gfp, /* global context handle */
748
+ const float pcm_l [], /* PCM data for left channel */
749
+ const float pcm_r [], /* PCM data for right channel */
750
+ const int nsamples, /* number of samples per channel */
751
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
752
+ const int mp3buf_size ); /* number of valid octets in this
753
+ stream */
754
+
755
+ /* as lame_encode_buffer, but for 'float's.
756
+ * !! NOTE: !! data must be scaled to +/- 1 full scale
757
+ */
758
+ int CDECL lame_encode_buffer_ieee_float(
759
+ lame_t gfp,
760
+ const float pcm_l [], /* PCM data for left channel */
761
+ const float pcm_r [], /* PCM data for right channel */
762
+ const int nsamples,
763
+ unsigned char * mp3buf,
764
+ const int mp3buf_size);
765
+ int CDECL lame_encode_buffer_interleaved_ieee_float(
766
+ lame_t gfp,
767
+ const float pcm[], /* PCM data for left and right
768
+ channel, interleaved */
769
+ const int nsamples,
770
+ unsigned char * mp3buf,
771
+ const int mp3buf_size);
772
+
773
+ /* as lame_encode_buffer, but for 'double's.
774
+ * !! NOTE: !! data must be scaled to +/- 1 full scale
775
+ */
776
+ int CDECL lame_encode_buffer_ieee_double(
777
+ lame_t gfp,
778
+ const double pcm_l [], /* PCM data for left channel */
779
+ const double pcm_r [], /* PCM data for right channel */
780
+ const int nsamples,
781
+ unsigned char * mp3buf,
782
+ const int mp3buf_size);
783
+ int CDECL lame_encode_buffer_interleaved_ieee_double(
784
+ lame_t gfp,
785
+ const double pcm[], /* PCM data for left and right
786
+ channel, interleaved */
787
+ const int nsamples,
788
+ unsigned char * mp3buf,
789
+ const int mp3buf_size);
790
+
791
+ /* as lame_encode_buffer, but for long's
792
+ * !! NOTE: !! data must still be scaled to be in the same range as
793
+ * short int, +/- 32768
794
+ *
795
+ * This scaling was a mistake (doesn't allow one to exploit full
796
+ * precision of type 'long'. Use lame_encode_buffer_long2() instead.
797
+ *
798
+ */
799
+ int CDECL lame_encode_buffer_long(
800
+ lame_global_flags* gfp, /* global context handle */
801
+ const long buffer_l [], /* PCM data for left channel */
802
+ const long buffer_r [], /* PCM data for right channel */
803
+ const int nsamples, /* number of samples per channel */
804
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
805
+ const int mp3buf_size ); /* number of valid octets in this
806
+ stream */
807
+
808
+ /* Same as lame_encode_buffer_long(), but with correct scaling.
809
+ * !! NOTE: !! data must still be scaled to be in the same range as
810
+ * type 'long'. Data should be in the range: +/- 2^(8*size(long)-1)
811
+ *
812
+ */
813
+ int CDECL lame_encode_buffer_long2(
814
+ lame_global_flags* gfp, /* global context handle */
815
+ const long buffer_l [], /* PCM data for left channel */
816
+ const long buffer_r [], /* PCM data for right channel */
817
+ const int nsamples, /* number of samples per channel */
818
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
819
+ const int mp3buf_size ); /* number of valid octets in this
820
+ stream */
821
+
822
+ /* as lame_encode_buffer, but for int's
823
+ * !! NOTE: !! input should be scaled to the maximum range of 'int'
824
+ * If int is 4 bytes, then the values should range from
825
+ * +/- 2147483648.
826
+ *
827
+ * This routine does not (and cannot, without loosing precision) use
828
+ * the same scaling as the rest of the lame_encode_buffer() routines.
829
+ *
830
+ */
831
+ int CDECL lame_encode_buffer_int(
832
+ lame_global_flags* gfp, /* global context handle */
833
+ const int buffer_l [], /* PCM data for left channel */
834
+ const int buffer_r [], /* PCM data for right channel */
835
+ const int nsamples, /* number of samples per channel */
836
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
837
+ const int mp3buf_size ); /* number of valid octets in this
838
+ stream */
839
+
840
+
841
+
842
+
843
+
844
+ /*
845
+ * REQUIRED:
846
+ * lame_encode_flush will flush the intenal PCM buffers, padding with
847
+ * 0's to make sure the final frame is complete, and then flush
848
+ * the internal MP3 buffers, and thus may return a
849
+ * final few mp3 frames. 'mp3buf' should be at least 7200 bytes long
850
+ * to hold all possible emitted data.
851
+ *
852
+ * will also write id3v1 tags (if any) into the bitstream
853
+ *
854
+ * return code = number of bytes output to mp3buf. Can be 0
855
+ */
856
+ int CDECL lame_encode_flush(
857
+ lame_global_flags * gfp, /* global context handle */
858
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
859
+ int size); /* number of valid octets in this stream */
860
+
861
+ /*
862
+ * OPTIONAL:
863
+ * lame_encode_flush_nogap will flush the internal mp3 buffers and pad
864
+ * the last frame with ancillary data so it is a complete mp3 frame.
865
+ *
866
+ * 'mp3buf' should be at least 7200 bytes long
867
+ * to hold all possible emitted data.
868
+ *
869
+ * After a call to this routine, the outputed mp3 data is complete, but
870
+ * you may continue to encode new PCM samples and write future mp3 data
871
+ * to a different file. The two mp3 files will play back with no gaps
872
+ * if they are concatenated together.
873
+ *
874
+ * This routine will NOT write id3v1 tags into the bitstream.
875
+ *
876
+ * return code = number of bytes output to mp3buf. Can be 0
877
+ */
878
+ int CDECL lame_encode_flush_nogap(
879
+ lame_global_flags * gfp, /* global context handle */
880
+ unsigned char* mp3buf, /* pointer to encoded MP3 stream */
881
+ int size); /* number of valid octets in this stream */
882
+
883
+ /*
884
+ * OPTIONAL:
885
+ * Normally, this is called by lame_init_params(). It writes id3v2 and
886
+ * Xing headers into the front of the bitstream, and sets frame counters
887
+ * and bitrate histogram data to 0. You can also call this after
888
+ * lame_encode_flush_nogap().
889
+ */
890
+ int CDECL lame_init_bitstream(
891
+ lame_global_flags * gfp); /* global context handle */
892
+
893
+
894
+
895
+ /*
896
+ * OPTIONAL: some simple statistics
897
+ * a bitrate histogram to visualize the distribution of used frame sizes
898
+ * a stereo mode histogram to visualize the distribution of used stereo
899
+ * modes, useful in joint-stereo mode only
900
+ * 0: LR left-right encoded
901
+ * 1: LR-I left-right and intensity encoded (currently not supported)
902
+ * 2: MS mid-side encoded
903
+ * 3: MS-I mid-side and intensity encoded (currently not supported)
904
+ *
905
+ * attention: don't call them after lame_encode_finish
906
+ * suggested: lame_encode_flush -> lame_*_hist -> lame_close
907
+ */
908
+
909
+ void CDECL lame_bitrate_hist(
910
+ const lame_global_flags * gfp,
911
+ int bitrate_count[14] );
912
+ void CDECL lame_bitrate_kbps(
913
+ const lame_global_flags * gfp,
914
+ int bitrate_kbps [14] );
915
+ void CDECL lame_stereo_mode_hist(
916
+ const lame_global_flags * gfp,
917
+ int stereo_mode_count[4] );
918
+
919
+ void CDECL lame_bitrate_stereo_mode_hist (
920
+ const lame_global_flags * gfp,
921
+ int bitrate_stmode_count[14][4] );
922
+
923
+ void CDECL lame_block_type_hist (
924
+ const lame_global_flags * gfp,
925
+ int btype_count[6] );
926
+
927
+ void CDECL lame_bitrate_block_type_hist (
928
+ const lame_global_flags * gfp,
929
+ int bitrate_btype_count[14][6] );
930
+
931
+ #if (DEPRECATED_OR_OBSOLETE_CODE_REMOVED && 0)
932
+ #else
933
+ /*
934
+ * OPTIONAL:
935
+ * lame_mp3_tags_fid will rewrite a Xing VBR tag to the mp3 file with file
936
+ * pointer fid. These calls perform forward and backwards seeks, so make
937
+ * sure fid is a real file. Make sure lame_encode_flush has been called,
938
+ * and all mp3 data has been written to the file before calling this
939
+ * function.
940
+ * NOTE:
941
+ * if VBR tags are turned off by the user, or turned off by LAME because
942
+ * the output is not a regular file, this call does nothing
943
+ * NOTE:
944
+ * LAME wants to read from the file to skip an optional ID3v2 tag, so
945
+ * make sure you opened the file for writing and reading.
946
+ * NOTE:
947
+ * You can call lame_get_lametag_frame instead, if you want to insert
948
+ * the lametag yourself.
949
+ */
950
+ void CDECL lame_mp3_tags_fid(lame_global_flags *, FILE* fid);
951
+ #endif
952
+
953
+ /*
954
+ * OPTIONAL:
955
+ * lame_get_lametag_frame copies the final LAME-tag into 'buffer'.
956
+ * The function returns the number of bytes copied into buffer, or
957
+ * the required buffer size, if the provided buffer is too small.
958
+ * Function failed, if the return value is larger than 'size'!
959
+ * Make sure lame_encode flush has been called before calling this function.
960
+ * NOTE:
961
+ * if VBR tags are turned off by the user, or turned off by LAME,
962
+ * this call does nothing and returns 0.
963
+ * NOTE:
964
+ * LAME inserted an empty frame in the beginning of mp3 audio data,
965
+ * which you have to replace by the final LAME-tag frame after encoding.
966
+ * In case there is no ID3v2 tag, usually this frame will be the very first
967
+ * data in your mp3 file. If you put some other leading data into your
968
+ * file, you'll have to do some bookkeeping about where to write this buffer.
969
+ */
970
+ size_t CDECL lame_get_lametag_frame(
971
+ const lame_global_flags *, unsigned char* buffer, size_t size);
972
+
973
+ /*
974
+ * REQUIRED:
975
+ * final call to free all remaining buffers
976
+ */
977
+ int CDECL lame_close (lame_global_flags *);
978
+
979
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
980
+ #else
981
+ /*
982
+ * OBSOLETE:
983
+ * lame_encode_finish combines lame_encode_flush() and lame_close() in
984
+ * one call. However, once this call is made, the statistics routines
985
+ * will no longer work because the data will have been cleared, and
986
+ * lame_mp3_tags_fid() cannot be called to add data to the VBR header
987
+ */
988
+ int CDECL lame_encode_finish(
989
+ lame_global_flags* gfp,
990
+ unsigned char* mp3buf,
991
+ int size );
992
+ #endif
993
+
994
+
995
+
996
+
997
+
998
+
999
+ /*********************************************************************
1000
+ *
1001
+ * decoding
1002
+ *
1003
+ * a simple interface to mpglib, part of mpg123, is also included if
1004
+ * libmp3lame is compiled with HAVE_MPGLIB
1005
+ *
1006
+ *********************************************************************/
1007
+
1008
+ struct hip_global_struct;
1009
+ typedef struct hip_global_struct hip_global_flags;
1010
+ typedef hip_global_flags *hip_t;
1011
+
1012
+
1013
+ typedef struct {
1014
+ int header_parsed; /* 1 if header was parsed and following data was
1015
+ computed */
1016
+ int stereo; /* number of channels */
1017
+ int samplerate; /* sample rate */
1018
+ int bitrate; /* bitrate */
1019
+ int mode; /* mp3 frame type */
1020
+ int mode_ext; /* mp3 frame type */
1021
+ int framesize; /* number of samples per mp3 frame */
1022
+
1023
+ /* this data is only computed if mpglib detects a Xing VBR header */
1024
+ unsigned long nsamp; /* number of samples in mp3 file. */
1025
+ int totalframes; /* total number of frames in mp3 file */
1026
+
1027
+ /* this data is not currently computed by the mpglib routines */
1028
+ int framenum; /* frames decoded counter */
1029
+ } mp3data_struct;
1030
+
1031
+ /* required call to initialize decoder */
1032
+ hip_t CDECL hip_decode_init(void);
1033
+
1034
+ /* cleanup call to exit decoder */
1035
+ int CDECL hip_decode_exit(hip_t gfp);
1036
+
1037
+ /* HIP reporting functions */
1038
+ void CDECL hip_set_errorf(hip_t gfp, lame_report_function f);
1039
+ void CDECL hip_set_debugf(hip_t gfp, lame_report_function f);
1040
+ void CDECL hip_set_msgf (hip_t gfp, lame_report_function f);
1041
+
1042
+ /*********************************************************************
1043
+ * input 1 mp3 frame, output (maybe) pcm data.
1044
+ *
1045
+ * nout = hip_decode(hip, mp3buf,len,pcm_l,pcm_r);
1046
+ *
1047
+ * input:
1048
+ * len : number of bytes of mp3 data in mp3buf
1049
+ * mp3buf[len] : mp3 data to be decoded
1050
+ *
1051
+ * output:
1052
+ * nout: -1 : decoding error
1053
+ * 0 : need more data before we can complete the decode
1054
+ * >0 : returned 'nout' samples worth of data in pcm_l,pcm_r
1055
+ * pcm_l[nout] : left channel data
1056
+ * pcm_r[nout] : right channel data
1057
+ *
1058
+ *********************************************************************/
1059
+ int CDECL hip_decode( hip_t gfp
1060
+ , unsigned char * mp3buf
1061
+ , size_t len
1062
+ , short pcm_l[]
1063
+ , short pcm_r[]
1064
+ );
1065
+
1066
+ /* same as hip_decode, and also returns mp3 header data */
1067
+ int CDECL hip_decode_headers( hip_t gfp
1068
+ , unsigned char* mp3buf
1069
+ , size_t len
1070
+ , short pcm_l[]
1071
+ , short pcm_r[]
1072
+ , mp3data_struct* mp3data
1073
+ );
1074
+
1075
+ /* same as hip_decode, but returns at most one frame */
1076
+ int CDECL hip_decode1( hip_t gfp
1077
+ , unsigned char* mp3buf
1078
+ , size_t len
1079
+ , short pcm_l[]
1080
+ , short pcm_r[]
1081
+ );
1082
+
1083
+ /* same as hip_decode1, but returns at most one frame and mp3 header data */
1084
+ int CDECL hip_decode1_headers( hip_t gfp
1085
+ , unsigned char* mp3buf
1086
+ , size_t len
1087
+ , short pcm_l[]
1088
+ , short pcm_r[]
1089
+ , mp3data_struct* mp3data
1090
+ );
1091
+
1092
+ /* same as hip_decode1_headers, but also returns enc_delay and enc_padding
1093
+ from VBR Info tag, (-1 if no info tag was found) */
1094
+ int CDECL hip_decode1_headersB( hip_t gfp
1095
+ , unsigned char* mp3buf
1096
+ , size_t len
1097
+ , short pcm_l[]
1098
+ , short pcm_r[]
1099
+ , mp3data_struct* mp3data
1100
+ , int *enc_delay
1101
+ , int *enc_padding
1102
+ );
1103
+
1104
+
1105
+
1106
+ /* OBSOLETE:
1107
+ * lame_decode... functions are there to keep old code working
1108
+ * but it is strongly recommended to replace calls by hip_decode...
1109
+ * function calls, see above.
1110
+ */
1111
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
1112
+ #else
1113
+ int CDECL lame_decode_init(void);
1114
+ int CDECL lame_decode(
1115
+ unsigned char * mp3buf,
1116
+ int len,
1117
+ short pcm_l[],
1118
+ short pcm_r[] );
1119
+ int CDECL lame_decode_headers(
1120
+ unsigned char* mp3buf,
1121
+ int len,
1122
+ short pcm_l[],
1123
+ short pcm_r[],
1124
+ mp3data_struct* mp3data );
1125
+ int CDECL lame_decode1(
1126
+ unsigned char* mp3buf,
1127
+ int len,
1128
+ short pcm_l[],
1129
+ short pcm_r[] );
1130
+ int CDECL lame_decode1_headers(
1131
+ unsigned char* mp3buf,
1132
+ int len,
1133
+ short pcm_l[],
1134
+ short pcm_r[],
1135
+ mp3data_struct* mp3data );
1136
+ int CDECL lame_decode1_headersB(
1137
+ unsigned char* mp3buf,
1138
+ int len,
1139
+ short pcm_l[],
1140
+ short pcm_r[],
1141
+ mp3data_struct* mp3data,
1142
+ int *enc_delay,
1143
+ int *enc_padding );
1144
+ int CDECL lame_decode_exit(void);
1145
+
1146
+ #endif /* obsolete lame_decode API calls */
1147
+
1148
+
1149
+ /*********************************************************************
1150
+ *
1151
+ * id3tag stuff
1152
+ *
1153
+ *********************************************************************/
1154
+
1155
+ /*
1156
+ * id3tag.h -- Interface to write ID3 version 1 and 2 tags.
1157
+ *
1158
+ * Copyright (C) 2000 Don Melton.
1159
+ *
1160
+ * This library is free software; you can redistribute it and/or
1161
+ * modify it under the terms of the GNU Library General Public
1162
+ * License as published by the Free Software Foundation; either
1163
+ * version 2 of the License, or (at your option) any later version.
1164
+ *
1165
+ * This library is distributed in the hope that it will be useful,
1166
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1167
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1168
+ * Library General Public License for more details.
1169
+ *
1170
+ * You should have received a copy of the GNU Library General Public
1171
+ * License along with this library; if not, write to the Free Software
1172
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
1173
+ */
1174
+
1175
+ /* utility to obtain alphabetically sorted list of genre names with numbers */
1176
+ void CDECL id3tag_genre_list(
1177
+ void (*handler)(int, const char *, void *),
1178
+ void* cookie);
1179
+
1180
+ void CDECL id3tag_init (lame_t gfp);
1181
+
1182
+ /* force addition of version 2 tag */
1183
+ void CDECL id3tag_add_v2 (lame_t gfp);
1184
+
1185
+ /* add only a version 1 tag */
1186
+ void CDECL id3tag_v1_only (lame_t gfp);
1187
+
1188
+ /* add only a version 2 tag */
1189
+ void CDECL id3tag_v2_only (lame_t gfp);
1190
+
1191
+ /* pad version 1 tag with spaces instead of nulls */
1192
+ void CDECL id3tag_space_v1 (lame_t gfp);
1193
+
1194
+ /* pad version 2 tag with extra 128 bytes */
1195
+ void CDECL id3tag_pad_v2 (lame_t gfp);
1196
+
1197
+ /* pad version 2 tag with extra n bytes */
1198
+ void CDECL id3tag_set_pad (lame_t gfp, size_t n);
1199
+
1200
+ void CDECL id3tag_set_title(lame_t gfp, const char* title);
1201
+ void CDECL id3tag_set_artist(lame_t gfp, const char* artist);
1202
+ void CDECL id3tag_set_album(lame_t gfp, const char* album);
1203
+ void CDECL id3tag_set_year(lame_t gfp, const char* year);
1204
+ void CDECL id3tag_set_comment(lame_t gfp, const char* comment);
1205
+
1206
+ /* return -1 result if track number is out of ID3v1 range
1207
+ and ignored for ID3v1 */
1208
+ int CDECL id3tag_set_track(lame_t gfp, const char* track);
1209
+
1210
+ /* return non-zero result if genre name or number is invalid
1211
+ result 0: OK
1212
+ result -1: genre number out of range
1213
+ result -2: no valid ID3v1 genre name, mapped to ID3v1 'Other'
1214
+ but taken as-is for ID3v2 genre tag */
1215
+ int CDECL id3tag_set_genre(lame_t gfp, const char* genre);
1216
+
1217
+ /* return non-zero result if field name is invalid */
1218
+ int CDECL id3tag_set_fieldvalue(lame_t gfp, const char* fieldvalue);
1219
+
1220
+ /* return non-zero result if image type is invalid */
1221
+ int CDECL id3tag_set_albumart(lame_t gfp, const char* image, size_t size);
1222
+
1223
+ /* lame_get_id3v1_tag copies ID3v1 tag into buffer.
1224
+ * Function returns number of bytes copied into buffer, or number
1225
+ * of bytes rquired if buffer 'size' is too small.
1226
+ * Function fails, if returned value is larger than 'size'.
1227
+ * NOTE:
1228
+ * This functions does nothing, if user/LAME disabled ID3v1 tag.
1229
+ */
1230
+ size_t CDECL lame_get_id3v1_tag(lame_t gfp, unsigned char* buffer, size_t size);
1231
+
1232
+ /* lame_get_id3v2_tag copies ID3v2 tag into buffer.
1233
+ * Function returns number of bytes copied into buffer, or number
1234
+ * of bytes rquired if buffer 'size' is too small.
1235
+ * Function fails, if returned value is larger than 'size'.
1236
+ * NOTE:
1237
+ * This functions does nothing, if user/LAME disabled ID3v2 tag.
1238
+ */
1239
+ size_t CDECL lame_get_id3v2_tag(lame_t gfp, unsigned char* buffer, size_t size);
1240
+
1241
+ /* normaly lame_init_param writes ID3v2 tags into the audio stream
1242
+ * Call lame_set_write_id3tag_automatic(gfp, 0) before lame_init_param
1243
+ * to turn off this behaviour and get ID3v2 tag with above function
1244
+ * write it yourself into your file.
1245
+ */
1246
+ void CDECL lame_set_write_id3tag_automatic(lame_global_flags * gfp, int);
1247
+ int CDECL lame_get_write_id3tag_automatic(lame_global_flags const* gfp);
1248
+
1249
+ /* experimental */
1250
+ int CDECL id3tag_set_textinfo_latin1(lame_t gfp, char const *id, char const *text);
1251
+
1252
+ /* experimental */
1253
+ int CDECL id3tag_set_comment_latin1(lame_t gfp, char const *lang, char const *desc, char const *text);
1254
+
1255
+ #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
1256
+ #else
1257
+ /* experimental */
1258
+ int CDECL id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text);
1259
+
1260
+ /* experimental */
1261
+ int CDECL id3tag_set_comment_ucs2(lame_t gfp, char const *lang,
1262
+ unsigned short const *desc, unsigned short const *text);
1263
+
1264
+ /* experimental */
1265
+ int CDECL id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue);
1266
+ #endif
1267
+
1268
+ /* experimental */
1269
+ int CDECL id3tag_set_fieldvalue_utf16(lame_t gfp, const unsigned short *fieldvalue);
1270
+
1271
+ /* experimental */
1272
+ int CDECL id3tag_set_textinfo_utf16(lame_t gfp, char const *id, unsigned short const *text);
1273
+
1274
+ /* experimental */
1275
+ int CDECL id3tag_set_comment_utf16(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text);
1276
+
1277
+
1278
+ /***********************************************************************
1279
+ *
1280
+ * list of valid bitrates [kbps] & sample frequencies [Hz].
1281
+ * first index: 0: MPEG-2 values (sample frequencies 16...24 kHz)
1282
+ * 1: MPEG-1 values (sample frequencies 32...48 kHz)
1283
+ * 2: MPEG-2.5 values (sample frequencies 8...12 kHz)
1284
+ ***********************************************************************/
1285
+
1286
+ extern const int bitrate_table [3][16];
1287
+ extern const int samplerate_table [3][ 4];
1288
+
1289
+ /* access functions for use in DLL, global vars are not exported */
1290
+ int CDECL lame_get_bitrate(int mpeg_version, int table_index);
1291
+ int CDECL lame_get_samplerate(int mpeg_version, int table_index);
1292
+
1293
+
1294
+ /* maximum size of albumart image (128KB), which affects LAME_MAXMP3BUFFER
1295
+ as well since lame_encode_buffer() also returns ID3v2 tag data */
1296
+ #define LAME_MAXALBUMART (128 * 1024)
1297
+
1298
+ /* maximum size of mp3buffer needed if you encode at most 1152 samples for
1299
+ each call to lame_encode_buffer. see lame_encode_buffer() below
1300
+ (LAME_MAXMP3BUFFER is now obsolete) */
1301
+ #define LAME_MAXMP3BUFFER (16384 + LAME_MAXALBUMART)
1302
+
1303
+
1304
+ typedef enum {
1305
+ LAME_OKAY = 0,
1306
+ LAME_NOERROR = 0,
1307
+ LAME_GENERICERROR = -1,
1308
+ LAME_NOMEM = -10,
1309
+ LAME_BADBITRATE = -11,
1310
+ LAME_BADSAMPFREQ = -12,
1311
+ LAME_INTERNALERROR = -13,
1312
+
1313
+ FRONTEND_READERROR = -80,
1314
+ FRONTEND_WRITEERROR = -81,
1315
+ FRONTEND_FILETOOLARGE = -82
1316
+
1317
+ } lame_errorcodes_t;
1318
+
1319
+ #if defined(__cplusplus)
1320
+ }
1321
+ #endif
1322
+ #endif /* LAME_LAME_H */
1323
+