foobar2000 SDK  2015-01-14
audio_math.cpp
Go to the documentation of this file.
1 #include "pfc.h"
2 
3 #ifndef _WIN32 // on Win32 these reside in shared.dll
4 
6 {
7  audio_sample peak = 0;
8  t_size num = p_num;
9  for(;num;num--)
10  {
11  audio_sample temp = (audio_sample)fabs(*(p_src++));
12  if (temp>peak) peak = temp;
13  }
14  return peak;
15 }
16 
17 
18 
19 
20 static void noopt_convert_to_32bit(const audio_sample * p_source,t_size p_count,t_int32 * p_output,float p_scale)
21 {
22  t_size num = p_count;
23  for(;num;--num)
24  {
25  t_int64 val = audio_math::rint64( *(p_source++) * p_scale );
26  if (val < -(t_int64)0x80000000) val = -(t_int64)0x80000000;
27  else if (val > 0x7FFFFFFF) val = 0x7FFFFFFF;
28  *(p_output++) = (t_int32) val;
29  }
30 }
31 
32 inline static void noopt_convert_to_16bit(const audio_sample * p_source,t_size p_count,t_int16 * p_output,float p_scale) {
33  for(t_size n=0;n<p_count;n++) {
34  *(p_output++) = (t_int16) pfc::clip_t(audio_math::rint32(*(p_source++)*p_scale),-0x8000,0x7FFF);
35  }
36 }
37 
38 inline static void noopt_convert_from_int16(const t_int16 * p_source,t_size p_count,audio_sample * p_output,float p_scale)
39 {
40  t_size num = p_count;
41  for(;num;num--)
42  *(p_output++) = (audio_sample)*(p_source++) * p_scale;
43 }
44 
45 
46 
47 inline static void noopt_convert_from_int32(const t_int32 * p_source,t_size p_count,audio_sample * p_output,float p_scale)
48 {
49  t_size num = p_count;
50  for(;num;num--)
51  *(p_output++) = (audio_sample)*(p_source++) * p_scale;
52 }
53 
54 inline static void noopt_scale(const audio_sample * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale)
55 {
56  for(t_size n=0;n<p_count;n++)
57  p_output[n] = p_source[n] * p_scale;
58 }
59 
60 
61 namespace audio_math {
62 
63  void scale(const audio_sample * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale)
64  {
65  noopt_scale(p_source,p_count,p_output,p_scale);
66  }
67 
68  void convert_to_int16(const audio_sample * p_source,t_size p_count,t_int16 * p_output,audio_sample p_scale)
69  {
70  audio_sample scale = (audio_sample)(p_scale * 0x8000);
71  noopt_convert_to_16bit(p_source,p_count,p_output,scale);
72  }
73 
75  {
76  //todo?
77  convert_to_int16(p_source,p_count,p_output,p_scale);
78  return p_scale * calculate_peak(p_source,p_count);
79  }
80 
81  void convert_from_int16(const t_int16 * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale)
82  {
83  audio_sample scale = (audio_sample) ( p_scale / (double) 0x8000 );
84  noopt_convert_from_int16(p_source,p_count,p_output,scale);
85  }
86 
87  void convert_to_int32(const audio_sample * p_source,t_size p_count,t_int32 * p_output,audio_sample p_scale)
88  {
89  audio_sample scale = (audio_sample)(p_scale * 0x80000000);
90  {
91  noopt_convert_to_32bit(p_source,p_count,p_output,scale);
92  }
93  }
94 
96  {
97  convert_to_int32(p_source,p_count,p_output,p_scale);
98  return p_scale * calculate_peak(p_source,p_count);
99  }
100 
101  void convert_from_int32(const t_int32 * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale)
102  {
103  audio_sample scale = (audio_sample) ( p_scale / (double) 0x80000000 );
104  noopt_convert_from_int32(p_source,p_count,p_output,scale);
105  }
106 
107 
108  audio_sample calculate_peak(const audio_sample * p_source,t_size p_count)
109  {
110  return noopt_calculate_peak(p_source,p_count);
111  }
112 
113  void kill_denormal(audio_sample * p_buffer,t_size p_count) {
114 #if audio_sample_size == 32
115  t_uint32 * ptr = reinterpret_cast<t_uint32*>(p_buffer);
116  for(;p_count;p_count--)
117  {
118  t_uint32 t = *ptr;
119  if ((t & 0x007FFFFF) && !(t & 0x7F800000)) *ptr=0;
120  ptr++;
121  }
122 #elif audio_sample_size == 64
123  t_uint64 * ptr = reinterpret_cast<t_uint64*>(p_buffer);
124  for(;p_count;p_count--)
125  {
126  t_uint64 t = *ptr;
127  if ((t & 0x000FFFFFFFFFFFFF) && !(t & 0x7FF0000000000000)) *ptr=0;
128  ptr++;
129  }
130 #else
131 #error unsupported
132 #endif
133  }
134 
135  void add_offset(audio_sample * p_buffer,audio_sample p_delta,t_size p_count) {
136  for(t_size n=0;n<p_count;n++) {
137  p_buffer[n] += p_delta;
138  }
139  }
140 
141 }
142 
143 #endif // _WIN32
audio_sample SHARED_EXPORT convert_to_int16_calculate_peak(const audio_sample *p_source, t_size p_count, t_int16 *p_output, audio_sample p_scale)
Definition: audio_math.cpp:74
uint64_t t_uint64
Definition: int_types.h:3
static void noopt_convert_from_int16(const t_int16 *p_source, t_size p_count, audio_sample *p_output, float p_scale)
Definition: audio_math.cpp:38
int16_t t_int16
Definition: int_types.h:6
void SHARED_EXPORT convert_to_int32(const audio_sample *p_source, t_size p_count, t_int32 *p_output, audio_sample p_scale)
Definition: audio_math.cpp:87
int32_t t_int32
Definition: int_types.h:4
static t_int64 rint64(audio_sample val)
Definition: audio_sample.h:44
size_t t_size
Definition: int_types.h:48
void kill_denormal(audio_sample *p_buffer, t_size p_count)
Definition: audio_math.cpp:113
static void noopt_scale(const audio_sample *p_source, t_size p_count, audio_sample *p_output, audio_sample p_scale)
Definition: audio_math.cpp:54
static void noopt_convert_to_16bit(const audio_sample *p_source, t_size p_count, t_int16 *p_output, float p_scale)
Definition: audio_math.cpp:32
void SHARED_EXPORT scale(const audio_sample *p_source, t_size p_count, audio_sample *p_output, audio_sample p_scale)
p_source/p_output can point to same buffer
Definition: audio_math.cpp:63
T clip_t(const T &p_item, const T &p_min, const T &p_max)
Definition: primitives.h:565
float audio_sample
Definition: audio_sample.h:6
audio_sample SHARED_EXPORT convert_to_int32_calculate_peak(const audio_sample *p_source, t_size p_count, t_int32 *p_output, audio_sample p_scale)
Definition: audio_math.cpp:95
void SHARED_EXPORT add_offset(audio_sample *p_buffer, audio_sample p_delta, t_size p_count)
Definition: audio_math.cpp:135
audio_sample SHARED_EXPORT calculate_peak(const audio_sample *p_source, t_size p_count)
Definition: audio_math.cpp:108
static t_int32 rint32(audio_sample val)
Definition: audio_sample.h:52
void SHARED_EXPORT convert_from_int32(const t_int32 *p_source, t_size p_count, audio_sample *p_output, audio_sample p_scale)
Definition: audio_math.cpp:101
void SHARED_EXPORT convert_to_int16(const audio_sample *p_source, t_size p_count, t_int16 *p_output, audio_sample p_scale)
Definition: audio_math.cpp:68
static void noopt_convert_to_32bit(const audio_sample *p_source, t_size p_count, t_int32 *p_output, float p_scale)
Definition: audio_math.cpp:20
static void noopt_convert_from_int32(const t_int32 *p_source, t_size p_count, audio_sample *p_output, float p_scale)
Definition: audio_math.cpp:47
void SHARED_EXPORT convert_from_int16(const t_int16 *p_source, t_size p_count, audio_sample *p_output, audio_sample p_scale)
Definition: audio_math.cpp:81
static audio_sample noopt_calculate_peak(const audio_sample *p_src, t_size p_num)
Definition: audio_math.cpp:5
uint32_t t_uint32
Definition: int_types.h:5
int64_t t_int64
Definition: int_types.h:2