diff options
Diffstat (limited to 'src/3rdparty/phonon/qt7/audioconnection.mm')
-rw-r--r-- | src/3rdparty/phonon/qt7/audioconnection.mm | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/3rdparty/phonon/qt7/audioconnection.mm b/src/3rdparty/phonon/qt7/audioconnection.mm new file mode 100644 index 0000000..39b8b30 --- /dev/null +++ b/src/3rdparty/phonon/qt7/audioconnection.mm @@ -0,0 +1,152 @@ +/* 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 "audioconnection.h" +#include "medianode.h" +#include "audionode.h" +#include "audiograph.h" + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace QT7 +{ + + AudioConnection::AudioConnection() + : m_source(0), m_sourceAudioNode(0), m_sourceOutputBus(0), + m_sink(0), m_sinkAudioNode(0), m_sinkInputBus(0), + m_sourceChannelLayout(0), m_sinkChannelLayout(0), + m_hasSourceSpecification(false), m_hasSinkSpecification(false), m_connected(false) + {} + + AudioConnection::AudioConnection(MediaNode *source, int output, MediaNode *sink, int input) + : m_source(source), m_sourceAudioNode(source->m_audioNode), m_sourceOutputBus(output), + m_sink(sink), m_sinkAudioNode(sink->m_audioNode), m_sinkInputBus(input), + m_sourceChannelLayout(0), m_sinkChannelLayout(0), + m_hasSourceSpecification(false), m_hasSinkSpecification(false), m_connected(false) + {} + + AudioConnection::AudioConnection(MediaNode *sink) + : m_source(0), m_sourceAudioNode(0), m_sourceOutputBus(0), + m_sink(sink), m_sinkAudioNode(sink->m_audioNode), m_sinkInputBus(0), + m_sourceChannelLayout(0), m_sinkChannelLayout(0), m_connected(false) + {} + + AudioConnection::AudioConnection(AudioNode *source, int output, AudioNode *sink, int input) + : m_source(0), m_sourceAudioNode(source), m_sourceOutputBus(output), + m_sink(0), m_sinkAudioNode(sink), m_sinkInputBus(input), + m_sourceChannelLayout(0), m_sinkChannelLayout(0), + m_hasSourceSpecification(false), m_hasSinkSpecification(false), m_connected(false) + {} + + AudioConnection::AudioConnection(AudioNode *sink) + : m_source(0), m_sourceAudioNode(0), m_sourceOutputBus(0), + m_sink(0), m_sinkAudioNode(sink), m_sinkInputBus(0), + m_sourceChannelLayout(0), m_sinkChannelLayout(0), m_connected(false) + {} + + AudioConnection::~AudioConnection() + { + freeMemoryAllocations(); + } + + void AudioConnection::freeMemoryAllocations() + { + if (m_sinkChannelLayout && m_sourceChannelLayout != m_sinkChannelLayout) + free(m_sinkChannelLayout); + if (m_sourceChannelLayout) + free(m_sourceChannelLayout); + m_sinkChannelLayout = 0; + m_sourceChannelLayout = 0; + } + + bool AudioConnection::updateStreamSpecification() + { + m_hasSourceSpecification = false; + m_hasSinkSpecification = false; + freeMemoryAllocations(); + + bool updateOk; + if (m_sourceAudioNode){ + updateOk = m_sourceAudioNode->fillInStreamSpecification(this, AudioNode::Source); + if (!updateOk) + return false; + updateOk = m_sourceAudioNode->setStreamSpecification(this, AudioNode::Source); + if (!updateOk) + return false; + } + updateOk = m_sinkAudioNode->fillInStreamSpecification(this, AudioNode::Sink); + if (!updateOk) + return false; + updateOk = m_sinkAudioNode->setStreamSpecification(this, AudioNode::Sink); + if (!updateOk) + return false; + return true; + } + + bool AudioConnection::connect(AudioGraph *graph) + { + if (m_connected || !m_sourceAudioNode) + return true; + + DEBUG_AUDIO_GRAPH("Connection" << int(this) << "connect" + << int(m_sourceAudioNode) << m_sourceOutputBus << "->" + << int(m_sinkAudioNode) << m_sinkInputBus) + + AUNode sourceOut = m_sourceAudioNode->getOutputAUNode(); + AUNode sinkIn = m_sinkAudioNode->getInputAUNode(); + OSStatus err = AUGraphConnectNodeInput(graph->audioGraphRef(), sourceOut, m_sourceOutputBus, sinkIn, m_sinkInputBus); + m_connected = (err == noErr) ? true : false; + return m_connected; + } + + bool AudioConnection::disconnect(AudioGraph *graph) + { + if (!m_connected || !m_sourceAudioNode) + return true; + + DEBUG_AUDIO_GRAPH("Connection" << int(this) << "disconnect" + << int(m_sourceAudioNode) << m_sourceOutputBus << "->" + << int(m_sinkAudioNode) << m_sinkInputBus) + + AUNode sinkIn = m_sinkAudioNode->getInputAUNode(); + AUGraphDisconnectNodeInput(graph->audioGraphRef(), sinkIn, m_sinkInputBus); + m_connected = false; + return true; + } + + void AudioConnection::invalidate() + { + m_connected = false; + } + + bool AudioConnection::isBetween(MediaNode *source, MediaNode *sink){ + return (source == m_source) && (sink == m_sink); + } + + bool AudioConnection::isValid(){ + return (m_sourceAudioNode != 0); + } + + bool AudioConnection::isSinkOnly(){ + return (m_sourceAudioNode == 0) && (m_sinkAudioNode != 0); + } + +}} //namespace Phonon::QT7 + +QT_END_NAMESPACE |