libcfe  0.12.1
some useful C-functions
transform_pcm.c
Go to the documentation of this file.
1 #include "config.h"
2 #include "transform_pcm.h"
3 
4 #include <stdint.h>
5 #include <math.h>
6 
7 #define UNUSED(x) (void)(x)
8 
9 #ifndef MIN
10 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
11 #endif
12 
13 #ifndef MAX
14 # define MAX(a,b) (((a) > (b)) ? (a) : (b))
15 #endif
16 
17 inline signed short int pcm_float_to_int(float f)
18 {
19  return (signed short int)(MIN(MAX(floorf(f * 32767.f + .5f), -32768), 32767));
20 }
21 
22 inline signed short int pcm_int16_to_int(int i)
23 {
24  return (signed short int)(MIN(MAX(i, -32768), 32767));
25 }
26 
27 /*
28 input channel order: used for: mono stereo 2.1 4.0 5.0 5.1 6.1 7.1
29 float *pcm_fl 1: front left/left stereo X X X X X X X
30 float *pcm_fr 2: front right/right stereo X X X X X X X
31 float *pcm_fc 3: (front)center/mono X X X X X X
32 float *pcm_rc 4: rear center X
33 float *pcm_sl 5: side left X X
34 float *pcm_sr 6: side right X X
35 float *pcm_rl 7: rear left X X X X
36 float *pcm_rr 8: rear right X X X X
37 float *pcm_lfe 9: LFE X X X
38 
39 output channel order:
40 signed int16_t *pcmout_l 1: left stereo
41 signed int16_t *pcmout_r 2: right stereo
42 */
43 
44 int transform_to_stereo(long int samples, int channels, float *pcm_fl, float *pcm_fr, float *pcm_fc, float *pcm_rc, float *pcm_sl, float *pcm_sr, float *pcm_rl, float *pcm_rr, float *pcm_lfe, signed short int *pcmout_l, signed short int *pcmout_r)
45 {
46  UNUSED(pcm_fc);
47  UNUSED(pcm_rc);
48  UNUSED(pcm_sl);
49  UNUSED(pcm_sr);
50  UNUSED(pcm_rl);
51  UNUSED(pcm_rr);
52  UNUSED(pcm_lfe);
53  long int s;
54 
55  for(s = 0; s < samples; s++)
56  {
57  switch(channels)
58  {
59  case 1:
60  pcmout_l[s] = pcmout_r[s] = pcm_float_to_int(pcm_fc[s]);
61  break;
62  case 2:
63  default:
64  pcmout_l[s] = pcm_float_to_int(pcm_fl[s]);
65  pcmout_r[s] = pcm_float_to_int(pcm_fr[s]);
66  break;
67  }
68  }
69  return s + 1;
70 }
signed short int pcm_float_to_int(float f)
Definition: transform_pcm.c:17
signed short int pcm_int16_to_int(int i)
Definition: transform_pcm.c:22
#define UNUSED(x)
Used to indicate that a function does not use a certain parameter.
Definition: transform_pcm.c:7
#define MAX(a, b)
Definition: transform_pcm.c:14
#define f
#define MIN(a, b)
Definition: transform_pcm.c:10
int transform_to_stereo(long int samples, int channels, float *pcm_fl, float *pcm_fr, float *pcm_fc, float *pcm_rc, float *pcm_sl, float *pcm_sr, float *pcm_rl, float *pcm_rr, float *pcm_lfe, signed short int *pcmout_l, signed short int *pcmout_r)
Definition: transform_pcm.c:44