00001 #include <math.h>
00002
00003 #ifdef _M_X64
00004 #include <xmmintrin.h>
00005 #include <emmintrin.h>
00006 #endif
00007
00008
00009 #define audio_sample_size 32
00010
00011 #if audio_sample_size == 32
00012 typedef float audio_sample;
00013 #define audio_sample_asm dword
00014 #elif audio_sample_size == 64
00015 typedef double audio_sample;
00016 #define audio_sample_asm qword
00017 #else
00018 #error wrong audio_sample_size
00019 #endif
00020
00021 #define audio_sample_bytes (audio_sample_size/8)
00022
00023 namespace audio_math
00024 {
00026 void SHARED_EXPORT scale(const audio_sample * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale);
00027 void SHARED_EXPORT convert_to_int16(const audio_sample * p_source,t_size p_count,t_int16 * p_output,audio_sample p_scale);
00028 void SHARED_EXPORT convert_to_int32(const audio_sample * p_source,t_size p_count,t_int32 * p_output,audio_sample p_scale);
00029 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);
00030 void SHARED_EXPORT convert_from_int16(const t_int16 * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale);
00031 void SHARED_EXPORT convert_from_int32(const t_int32 * p_source,t_size p_count,audio_sample * p_output,audio_sample p_scale);
00032 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);
00033 audio_sample SHARED_EXPORT calculate_peak(const audio_sample * p_source,t_size p_count);
00034 void SHARED_EXPORT remove_denormals(audio_sample * p_buffer,t_size p_count);
00035 void SHARED_EXPORT add_offset(audio_sample * p_buffer,audio_sample p_delta,t_size p_count);
00036
00037
00038 inline t_uint64 time_to_samples(double p_time,t_uint32 p_sample_rate) {
00039 return (t_uint64)floor((double)p_sample_rate * p_time + 0.5);
00040 }
00041
00042 inline double samples_to_time(t_uint64 p_samples,t_uint32 p_sample_rate) {
00043 PFC_ASSERT(p_sample_rate > 0);
00044 return (double) p_samples / (double) p_sample_rate;
00045 }
00046
00047
00048 #ifdef _M_IX86
00049 inline static t_int64 rint64(audio_sample val) {
00050 t_int64 rv;
00051 _asm {
00052 fld val;
00053 fistp rv;
00054 }
00055 return rv;
00056 }
00057 inline static t_int32 rint32(audio_sample val) {
00058 t_int32 rv;
00059 _asm {
00060 fld val;
00061 fistp rv;
00062 }
00063 return rv;
00064 }
00065 #elif defined(_M_X64)
00066 inline static t_int64 rint64(audio_sample val) {return (t_int64)floor(val+0.5);}
00067 static inline t_int32 rint32(float p_val) {
00068 return (t_int32)_mm_cvtss_si32(_mm_load_ss(&p_val));
00069 }
00070 #else
00071 inline static t_int64 rint64(audio_sample val) {return (t_int64)floor(val+0.5);}
00072 inline static t_int32 rint32(audio_sample val) {return (t_int32)floor(val+0.5);}
00073 #endif
00074
00075
00076 inline audio_sample gain_to_scale(double p_gain) {return (audio_sample) pow(10.0,p_gain / 20.0);}
00077
00078 }