33
33
VolumeFaderEffect::VolumeFaderEffect(Backend *backend, QObject *parent)
34
34
: Effect(backend, parent, AudioSource | AudioSink)
35
35
, m_fadeCurve(Phonon::VolumeFaderEffect::Fade3Decibel)
38
36
, m_fadeFromVolume(0)
39
37
, m_fadeToVolume(0)
41
39
m_effectElement = gst_element_factory_make ("volume", NULL);
42
40
if (m_effectElement)
42
m_fadeTimeline = new QTimeLine(1000, this);
43
connect(m_fadeTimeline, SIGNAL(valueChanged(qreal)), this, SLOT(slotSetVolume(qreal)));
46
46
VolumeFaderEffect::~VolumeFaderEffect()
49
killTimer(m_fadeTimer);
52
50
GstElement* VolumeFaderEffect::createEffectBin()
62
60
gst_bin_add(GST_BIN(audioBin), m_effectElement);
65
GstPad *srcPad= gst_element_get_pad (m_effectElement, "src");
63
GstPad *srcPad= gst_element_get_static_pad (m_effectElement, "src");
66
64
gst_element_add_pad (audioBin, gst_ghost_pad_new ("src", srcPad));
67
65
gst_object_unref (srcPad);
70
gst_element_link_many(queue, mconv, m_effectElement, (const char*)NULL);
71
GstPad *sinkpad = gst_element_get_pad (queue, "sink");
68
gst_element_link_many(queue, mconv, m_effectElement, NULL);
69
GstPad *sinkpad = gst_element_get_static_pad (queue, "sink");
72
70
gst_element_add_pad (audioBin, gst_ghost_pad_new ("sink", sinkpad));
73
71
gst_object_unref (sinkpad);
77
75
float VolumeFaderEffect::volume() const
80
78
if (m_effectElement)
81
g_object_get(G_OBJECT(m_effectElement), "volume", &val, (const char*)NULL);
79
g_object_get(G_OBJECT(m_effectElement), "volume", &val, NULL);
85
void VolumeFaderEffect::setVolume(float volume)
83
void VolumeFaderEffect::slotSetVolume(qreal volume)
87
g_object_set(G_OBJECT(m_effectElement), "volume", volume, (const char*)NULL);
85
float gstVolume = m_fadeFromVolume + (volume * (m_fadeToVolume - m_fadeFromVolume));
90
89
Phonon::VolumeFaderEffect::FadeCurve VolumeFaderEffect::fadeCurve() const
92
91
return m_fadeCurve;
95
void VolumeFaderEffect::setFadeCurve(Phonon::VolumeFaderEffect::FadeCurve fadeCurve)
94
void VolumeFaderEffect::setFadeCurve(Phonon::VolumeFaderEffect::FadeCurve pFadeCurve)
97
m_fadeCurve = fadeCurve;
96
m_fadeCurve = pFadeCurve;
97
QEasingCurve fadeCurve;
99
case Phonon::VolumeFaderEffect::Fade3Decibel:
100
fadeCurve = QEasingCurve::InQuad;
102
case Phonon::VolumeFaderEffect::Fade6Decibel:
103
fadeCurve = QEasingCurve::Linear;
105
case Phonon::VolumeFaderEffect::Fade9Decibel:
106
fadeCurve = QEasingCurve::OutCubic;
108
case Phonon::VolumeFaderEffect::Fade12Decibel:
109
fadeCurve = QEasingCurve::OutQuart;
112
m_fadeTimeline->setEasingCurve(fadeCurve);
100
115
void VolumeFaderEffect::fadeTo(float targetVolume, int fadeTime)
102
117
m_fadeToVolume = targetVolume;
103
m_fadeDuration = fadeTime;
104
m_fadeFromVolume = volume();
105
m_fadeStartTime.start();
108
killTimer(m_fadeTimer);
109
m_fadeTimer = startTimer(30);
112
void VolumeFaderEffect::updateFade()
114
double currVal = 0.0;
115
float step = float(m_fadeStartTime.elapsed()) / float(m_fadeDuration);
119
killTimer(m_fadeTimer);
123
// This is a very loose and interpretation of the API
124
// But in fact when fading between arbitrary values, the decibel values make no sense
125
// Note : seems like we will change the API to re-use names from QTimeline for this
126
switch (fadeCurve()) {
127
case Phonon::VolumeFaderEffect::Fade3Decibel: // Slow in the beginning
128
currVal = step * step;
130
case Phonon::VolumeFaderEffect::Fade6Decibel: // Linear fade
133
case Phonon::VolumeFaderEffect::Fade9Decibel: // Fast in the beginning / Linear
134
currVal = step * 0.5 + (1.0-(1.0-step)*(1.0-step)) * 0.5;
136
case Phonon::VolumeFaderEffect::Fade12Decibel: // Fast in the beginning
137
currVal = 1.0 - (1.0-step) * (1.0-step);
142
const double volume = (1.0 - currVal) * m_fadeFromVolume + currVal * m_fadeToVolume;
146
bool VolumeFaderEffect::event(QEvent *event)
148
switch (event->type()){
151
QTimerEvent *timerEvent = static_cast<QTimerEvent *>(event);
152
if (timerEvent->timerId() == m_fadeTimer)
159
return QObject::event(event);
118
g_object_get(G_OBJECT(m_effectElement), "volume", &m_fadeFromVolume, NULL);
120
// Don't call QTimeLine::setDuration() with zero.
121
// It is not supported and breaks fading.
123
setVolume(targetVolume);
127
m_fadeTimeline->setDuration(fadeTime);
128
m_fadeTimeline->start();
131
void VolumeFaderEffect::setVolume(float v)
133
g_object_set(G_OBJECT(m_effectElement), "volume", (gdouble)v, NULL);
134
qDebug() << "Fading to" << v;
162
137
}} //namespace Phonon::Gstreamer