foobar2000 SDK  2015-01-14
audio_sample.h
Go to the documentation of this file.
1 #include <math.h>
2 
3 #define audio_sample_size 32
4 
5 #if audio_sample_size == 32
6 typedef float audio_sample;
7 #define audio_sample_asm dword
8 #elif audio_sample_size == 64
9 typedef double audio_sample;
10 #define audio_sample_asm qword
11 #else
12 #error wrong audio_sample_size
13 #endif
14 
15 #define audio_sample_bytes (audio_sample_size/8)
16 
17 namespace audio_math {
18 
19 #ifndef _WIN32 // these are provided by shared.dll on Windows
20  void scale(const audio_sample * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale);
22  void convert_to_int16(const audio_sample * p_source,t_size p_count,t_int16 * p_output,audio_sample p_scale);
23  void convert_to_int32(const audio_sample * p_source,t_size p_count,t_int32 * p_output,audio_sample p_scale);
24  audio_sample convert_to_int16_calculate_peak(const audio_sample * p_source,t_size p_count,t_int16 * p_output,audio_sample p_scale);
25  void convert_from_int16(const t_int16 * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale);
26  void convert_from_int32(const t_int32 * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale);
27  audio_sample convert_to_int32_calculate_peak(const audio_sample * p_source,t_size p_count,t_int32 * p_output,audio_sample p_scale);
28  audio_sample calculate_peak(const audio_sample * p_source,t_size p_count);
29  void remove_denormals(audio_sample * p_buffer,t_size p_count);
30  void add_offset(audio_sample * p_buffer,audio_sample p_delta,t_size p_count);
31 #endif
32 
33  inline t_uint64 time_to_samples(double p_time,t_uint32 p_sample_rate) {
34  return (t_uint64)floor((double)p_sample_rate * p_time + 0.5);
35  }
36 
37  inline double samples_to_time(t_uint64 p_samples,t_uint32 p_sample_rate) {
38  PFC_ASSERT(p_sample_rate > 0);
39  return (double) p_samples / (double) p_sample_rate;
40  }
41 
42 
43 #if defined(_MSC_VER) && defined(_M_IX86)
44  inline static t_int64 rint64(audio_sample val) {
45  t_int64 rv;
46  _asm {
47  fld val;
48  fistp rv;
49  }
50  return rv;
51  }
52  inline static t_int32 rint32(audio_sample val) {
53  t_int32 rv;
54  _asm {
55  fld val;
56  fistp rv;
57  }
58  return rv;
59  }
60 #elif defined(_MSC_VER) && defined(_M_X64)
61  inline static t_int64 rint64(audio_sample val) {return (t_int64)floor(val+0.5);}
62  static inline t_int32 rint32(float p_val) {
63  return (t_int32)_mm_cvtss_si32(_mm_load_ss(&p_val));
64  }
65 #else
66  inline static t_int64 rint64(audio_sample val) {return (t_int64)floor(val+0.5);}
67  inline static t_int32 rint32(audio_sample val) {return (t_int32)floor(val+0.5);}
68 #endif
69 
70 
71  inline audio_sample gain_to_scale(double p_gain) {return (audio_sample) pow(10.0,p_gain / 20.0);}
72  inline double scale_to_gain(double scale) {return 20.0*log10(scale);}
73 
74 
75  static const audio_sample float16scale = 65536.f;
76 
77  audio_sample decodeFloat24ptr(const void * sourcePtr);
78  audio_sample decodeFloat24ptrbs(const void * sourcePtr);
79  audio_sample decodeFloat16(uint16_t source);
80 }
audio_sample decodeFloat24ptrbs(const void *sourcePtr)
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
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
audio_sample decodeFloat16(uint16_t source)
double samples_to_time(t_uint64 p_samples, t_uint32 p_sample_rate)
Definition: audio_sample.h:37
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
audio_sample decodeFloat24ptr(const void *sourcePtr)
Definition: audio_sample.cpp:4
double scale_to_gain(double scale)
Definition: audio_sample.h:72
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
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 const audio_sample float16scale
Definition: audio_sample.h:75
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
t_uint64 time_to_samples(double p_time, t_uint32 p_sample_rate)
Definition: audio_sample.h:33
audio_sample gain_to_scale(double p_gain)
Definition: audio_sample.h:71
uint32_t t_uint32
Definition: int_types.h:5
int64_t t_int64
Definition: int_types.h:2
void SHARED_EXPORT remove_denormals(audio_sample *p_buffer, t_size p_count)