/* 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 . */ #include "audiooutput.h" #include "mediaobject.h" #include 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 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"