audio_math.h

Go to the documentation of this file.
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 }

Generated on Fri Apr 25 18:49:36 2008 for foobar2000 SDK by  doxygen 1.5.5