diff -r 000000000000 -r 1918ee327afb src/3rdparty/phonon/qt7/audiooutput.mm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/qt7/audiooutput.mm Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,168 @@ +/* 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 "audiograph.h" +#include "audiodevice.h" +#include "mediaobject.h" + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace QT7 +{ + +AudioOutputAudioPart::AudioOutputAudioPart() : AudioNode(1, 0) +{ + m_audioDevice = AudioDevice::defaultDevice(AudioDevice::Out); + m_volume = 1; +} + +ComponentDescription AudioOutputAudioPart::getAudioNodeDescription() const +{ + ComponentDescription description; + description.componentType = kAudioUnitType_Output; + description.componentSubType = kAudioUnitSubType_DefaultOutput; + description.componentManufacturer = kAudioUnitManufacturer_Apple; + description.componentFlags = 0; + description.componentFlagsMask = 0; + return description; +} + +void AudioOutputAudioPart::initializeAudioUnit() +{ + setAudioDevice(m_audioDevice); + setVolume(m_volume); +} + +void AudioOutputAudioPart::setAudioDevice(AudioDeviceID device) +{ + m_audioDevice = device; + if (!m_audioDevice) + return; + if (!m_audioUnit) + return; + bool ok = AudioDevice::setDevice(m_audioUnit, m_audioDevice, AudioDevice::Out); + if (!ok) + emit audioDeviceFailed(); +} + +void AudioOutputAudioPart::setVolume(float volume) +{ + if (volume < 0) + m_volume = 0; + if (volume > 1) + m_volume = 1; + else + m_volume = volume; + + if (m_audioUnit){ + float db = volume;//20.0 * log10(volume); // convert to db + OSStatus err = AudioUnitSetParameter(m_audioUnit, kHALOutputParam_Volume, kAudioUnitScope_Input, 0, db, 0); + BACKEND_ASSERT2(err == noErr, "Could not set volume on output audio unit.", FATAL_ERROR) + emit volumeChanged(qreal(db)); + } +} + +float AudioOutputAudioPart::volume() +{ + return m_volume; +} + +//////////////////////////////////////////////////////////////////////////////////////// + +AudioOutput::AudioOutput(QObject *parent) : MediaNode(AudioSink, parent) +{ + m_audioOutput = new AudioOutputAudioPart(); + setAudioNode(m_audioOutput); + connect(m_audioOutput, SIGNAL(volumeChanged(qreal)), this, SIGNAL(volumeChanged(qreal))); + connect(m_audioOutput, SIGNAL(audioDeviceFailed()), this, SIGNAL(audioDeviceFailed())); + m_redirectToMovie = false; +} + +AudioOutput::~AudioOutput() +{ +} + +void AudioOutput::setVolume(qreal volume) +{ + IMPLEMENTED; + m_audioOutput->setVolume(float(volume)); + if (m_owningMediaObject) + m_owningMediaObject->setVolumeOnMovie(volume); + + emit volumeChanged(m_audioOutput->volume()); +} + +qreal AudioOutput::volume() const +{ + IMPLEMENTED; + return qreal(m_audioOutput->volume()); +} + +bool AudioOutput::setOutputDevice(int device) +{ + IMPLEMENTED; + if (device == -1) + return false; + + if (m_owningMediaObject){ + bool ok = m_owningMediaObject->setAudioDeviceOnMovie(device); + if (!ok) + return false; + } + + if (m_audioGraph){ + MediaNodeEvent event1(MediaNodeEvent::AboutToRestartAudioStream, this); + m_audioGraph->notify(&event1); + } + + m_audioOutput->setAudioDevice(device); + + if (m_audioGraph){ + MediaNodeEvent event2(MediaNodeEvent::RestartAudioStreamRequest, this); + m_audioGraph->notify(&event2); + } + return true; +} + +int AudioOutput::outputDevice() const +{ + IMPLEMENTED; + return m_audioOutput->m_audioDevice; +} + +void AudioOutput::mediaNodeEvent(const MediaNodeEvent *event) +{ + switch (event->type()){ + case MediaNodeEvent::SetMediaObject: + if (static_cast(event->data())){ + setVolume(volume()); + setOutputDevice(outputDevice()); + } + break; + default: + break; + } +} + +}} //namespace Phonon::QT7 + +QT_END_NAMESPACE + +#include "moc_audiooutput.cpp"