/* 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 "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