summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/phonon/qt7/audioconnection.mm
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2009-03-23 10:18:55 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2009-03-23 10:18:55 +0100
commite5fcad302d86d316390c6b0f62759a067313e8a9 (patch)
treec2afbf6f1066b6ce261f14341cf6d310e5595bc1 /src/3rdparty/phonon/qt7/audioconnection.mm
Long live Qt 4.5!
Diffstat (limited to 'src/3rdparty/phonon/qt7/audioconnection.mm')
-rw-r--r--src/3rdparty/phonon/qt7/audioconnection.mm152
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 0000000000..39b8b3062c
--- /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