diff options
Diffstat (limited to 'src/3rdparty/phonon/ds9/audiooutput.cpp')
-rw-r--r-- | src/3rdparty/phonon/ds9/audiooutput.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/3rdparty/phonon/ds9/audiooutput.cpp b/src/3rdparty/phonon/ds9/audiooutput.cpp new file mode 100644 index 0000000..fcc062c --- /dev/null +++ b/src/3rdparty/phonon/ds9/audiooutput.cpp @@ -0,0 +1,111 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "audiooutput.h" +#include "mediaobject.h" + +#include <QtCore/qmath.h> + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ + namespace DS9 + { + AudioOutput::AudioOutput(Backend *back, QObject *parent) + : BackendNode(parent), m_currentIndex(0), m_crossfadeProgress(1.), + m_device(-1), m_backend(back), m_volume(0.) + { + } + + AudioOutput::~AudioOutput() + { + } + + int AudioOutput::outputDevice() const + { + return m_device; + } + + static const qreal log10over20 = qreal(0.1151292546497022842); // ln(10) / 20 + + void AudioOutput::setVolume(qreal newVolume) + { + for(int i = 0; i < FILTER_COUNT; ++i) { + ComPointer<IBasicAudio> audio(m_filters[i], IID_IBasicAudio); + if (audio) { + const qreal currentVolume = newVolume * (m_currentIndex == i ? m_crossfadeProgress : 1-m_crossfadeProgress); + const qreal newDbVolume = (qMax(0., 1.-::log(::pow(currentVolume, -log10over20)))-1.) * 10000; + audio->put_Volume(qRound(newDbVolume)); + } + } + + if (m_volume != newVolume) { + m_volume = newVolume; + emit volumeChanged(newVolume); + } + } + + void AudioOutput::setCrossFadingProgress(short currentIndex, qreal progress) + { + m_crossfadeProgress = progress; + m_currentIndex = currentIndex; + setVolume(m_volume); + } + + bool AudioOutput::setOutputDevice(const AudioOutputDevice & newDevice) + { + //stub implementation + return setOutputDevice(newDevice.index()); + } + + qreal AudioOutput::volume() const + { + return m_volume; + } + + bool AudioOutput::setOutputDevice(int newDevice) + { + if (newDevice == m_device) { + return true; + } + + //free the previous one if it was already set + for(int i = 0; i < FILTER_COUNT; ++i) { + const Filter &oldFilter = m_filters[i]; + + Filter newFilter = m_backend->getAudioOutputFilter(newDevice); + + if (m_mediaObject && oldFilter && newFilter) { + m_mediaObject->switchFilters(i, oldFilter, newFilter); + } + + m_filters[i] = newFilter; + + + } + + m_device = newDevice; + setVolume(m_volume); + return true; + } + } +} + +QT_END_NAMESPACE + +#include "moc_audiooutput.cpp" |