defuze.me  Client
audioeffectvolume.cpp
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 }