defuze.me
Client
|
00001 /************************************************************************** 00002 ** defuze.me Epitech Innovative Project 00003 ** 00004 ** Copyright 2010-2011 00005 ** Athena Calmettes - Jocelyn De La Rosa - Francois Gaillard 00006 ** Adrien Jarthon - Alexandre Moore - Luc Peres - Arnaud Sellier 00007 ** 00008 ** All rights reserved. 00009 **************************************************************************/ 00010 00011 #include "audioeffectvolume.hpp" 00012 #include "audioeffectvolumewidget.hpp" 00013 #include "math.h" 00014 #include <QDebug> 00015 00016 using namespace Audio; 00017 00018 const double wema_up = 1/20.; 00019 const double wema_down = 1/10000.; 00020 00021 AudioEffectVolume::AudioEffectVolume() 00022 { 00023 _volume = _oldVolume = 100; 00024 widget = 0; 00025 l_level = r_level = 0; 00026 } 00027 00028 int& AudioEffectVolume::volume() 00029 { 00030 return _volume; 00031 } 00032 00033 void AudioEffectVolume::setVolume(int value) 00034 { 00035 _volume = value; 00036 if (_oldVolume != _volume) 00037 { 00038 _oldVolume = _volume; 00039 emit setMixerWidgetVolume(value); 00040 } 00041 } 00042 00043 double AudioEffectVolume::levelToDB(double level) 00044 { 00045 return 10 * log10(level*1.414/32768.); 00046 } 00047 00048 double AudioEffectVolume::levelToRatio(double level) 00049 { 00050 return (level/32768.); 00051 } 00052 00053 void AudioEffectVolume::apply(short *data, int len) 00054 { 00055 double *level; 00056 double mult = (_volume / 100.); 00057 00058 for(int i = 0; i < (len / 2); i++) 00059 { 00060 data[i] *= mult; 00061 00062 level = (i & 1 ? &r_level : &l_level); 00063 if (abs(data[i]) > *level) 00064 { 00065 (*level) = (abs(data[i]) * wema_up + (*level) * (1.-wema_up)); 00066 } 00067 else 00068 { 00069 (*level) = (abs(data[i]) * wema_down + (*level) * (1.-wema_down)); 00070 } 00071 if (((i&0xFF) == 1) && widget) 00072 static_cast<AudioEffectVolumeWidget*>(widget)->setLevels(levelToRatio(l_level), levelToRatio(r_level)); 00073 } 00074 } 00075 00076 AudioEffectWidget* AudioEffectVolume::getWidget() 00077 { 00078 if (!widget) 00079 { 00080 widget = new AudioEffectVolumeWidget(this); 00081 connect(this, SIGNAL(setMixerWidgetVolume(int)), static_cast<AudioEffectVolumeWidget*>(widget), SLOT(setVolume(int))); 00082 } 00083 return widget; 00084 }