src/3rdparty/phonon/qt7/audioconnection.mm
changeset 0 1918ee327afb
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /*  This file is part of the KDE project.
       
     2 
       
     3     Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 
       
     5     This library is free software: you can redistribute it and/or modify
       
     6     it under the terms of the GNU Lesser General Public License as published by
       
     7     the Free Software Foundation, either version 2.1 or 3 of the License.
       
     8 
       
     9     This library is distributed in the hope that it will be useful,
       
    10     but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    12     GNU Lesser General Public License for more details.
       
    13 
       
    14     You should have received a copy of the GNU Lesser General Public License
       
    15     along with this library.  If not, see <http://www.gnu.org/licenses/>.
       
    16 */
       
    17 
       
    18 #include "audioconnection.h"
       
    19 #include "medianode.h"
       
    20 #include "audionode.h"
       
    21 #include "audiograph.h"
       
    22 
       
    23 QT_BEGIN_NAMESPACE
       
    24 
       
    25 namespace Phonon
       
    26 {
       
    27 namespace QT7
       
    28 {
       
    29 
       
    30     AudioConnection::AudioConnection()
       
    31         :   m_source(0), m_sourceAudioNode(0), m_sourceOutputBus(0),
       
    32             m_sink(0), m_sinkAudioNode(0), m_sinkInputBus(0),
       
    33             m_sourceChannelLayout(0), m_sinkChannelLayout(0),
       
    34             m_hasSourceSpecification(false), m_hasSinkSpecification(false), m_connected(false)
       
    35     {}
       
    36 
       
    37     AudioConnection::AudioConnection(MediaNode *source, int output, MediaNode *sink, int input)
       
    38         : m_source(source), m_sourceAudioNode(source->m_audioNode), m_sourceOutputBus(output),
       
    39         m_sink(sink), m_sinkAudioNode(sink->m_audioNode), m_sinkInputBus(input),
       
    40         m_sourceChannelLayout(0), m_sinkChannelLayout(0),
       
    41         m_hasSourceSpecification(false), m_hasSinkSpecification(false), m_connected(false)
       
    42     {}
       
    43 
       
    44     AudioConnection::AudioConnection(MediaNode *sink)
       
    45         : m_source(0), m_sourceAudioNode(0), m_sourceOutputBus(0),
       
    46         m_sink(sink), m_sinkAudioNode(sink->m_audioNode), m_sinkInputBus(0),
       
    47         m_sourceChannelLayout(0), m_sinkChannelLayout(0), m_connected(false)
       
    48     {}
       
    49 
       
    50     AudioConnection::AudioConnection(AudioNode *source, int output, AudioNode *sink, int input)
       
    51         : m_source(0), m_sourceAudioNode(source), m_sourceOutputBus(output),
       
    52         m_sink(0), m_sinkAudioNode(sink), m_sinkInputBus(input),
       
    53         m_sourceChannelLayout(0), m_sinkChannelLayout(0),
       
    54         m_hasSourceSpecification(false), m_hasSinkSpecification(false), m_connected(false)
       
    55     {}
       
    56 
       
    57     AudioConnection::AudioConnection(AudioNode *sink)
       
    58         : m_source(0), m_sourceAudioNode(0), m_sourceOutputBus(0),
       
    59         m_sink(0), m_sinkAudioNode(sink), m_sinkInputBus(0),
       
    60         m_sourceChannelLayout(0), m_sinkChannelLayout(0), m_connected(false)
       
    61     {}
       
    62 
       
    63     AudioConnection::~AudioConnection()
       
    64     {
       
    65         freeMemoryAllocations();
       
    66     }
       
    67 
       
    68     void AudioConnection::freeMemoryAllocations()
       
    69     {
       
    70         if (m_sinkChannelLayout && m_sourceChannelLayout != m_sinkChannelLayout)
       
    71             free(m_sinkChannelLayout);
       
    72         if (m_sourceChannelLayout)
       
    73             free(m_sourceChannelLayout);
       
    74         m_sinkChannelLayout = 0;
       
    75         m_sourceChannelLayout = 0;
       
    76     }
       
    77 
       
    78     bool AudioConnection::updateStreamSpecification()
       
    79     {
       
    80         m_hasSourceSpecification = false;
       
    81         m_hasSinkSpecification = false;
       
    82         freeMemoryAllocations();
       
    83 
       
    84         bool updateOk;
       
    85         if (m_sourceAudioNode){
       
    86             updateOk = m_sourceAudioNode->fillInStreamSpecification(this, AudioNode::Source);
       
    87             if (!updateOk)
       
    88                 return false;
       
    89             updateOk = m_sourceAudioNode->setStreamSpecification(this, AudioNode::Source);
       
    90             if (!updateOk)
       
    91                 return false;
       
    92         }
       
    93         updateOk = m_sinkAudioNode->fillInStreamSpecification(this, AudioNode::Sink);
       
    94         if (!updateOk)
       
    95             return false;
       
    96         updateOk = m_sinkAudioNode->setStreamSpecification(this, AudioNode::Sink);
       
    97         if (!updateOk)
       
    98             return false;
       
    99         return true;
       
   100     }
       
   101 
       
   102     bool AudioConnection::connect(AudioGraph *graph)
       
   103     {
       
   104         if (m_connected || !m_sourceAudioNode)
       
   105             return true;
       
   106 
       
   107         DEBUG_AUDIO_GRAPH("Connection" << int(this) << "connect"
       
   108         << int(m_sourceAudioNode) << m_sourceOutputBus << "->"
       
   109         << int(m_sinkAudioNode) << m_sinkInputBus)
       
   110 
       
   111         AUNode sourceOut = m_sourceAudioNode->getOutputAUNode();
       
   112         AUNode sinkIn = m_sinkAudioNode->getInputAUNode();
       
   113         OSStatus err = AUGraphConnectNodeInput(graph->audioGraphRef(), sourceOut, m_sourceOutputBus, sinkIn, m_sinkInputBus);
       
   114         m_connected = (err == noErr) ? true : false;
       
   115         return m_connected;
       
   116     }
       
   117 
       
   118     bool AudioConnection::disconnect(AudioGraph *graph)
       
   119     {
       
   120         if (!m_connected || !m_sourceAudioNode)
       
   121             return true;
       
   122 
       
   123         DEBUG_AUDIO_GRAPH("Connection" << int(this) << "disconnect"
       
   124         << int(m_sourceAudioNode) << m_sourceOutputBus << "->"
       
   125         << int(m_sinkAudioNode) << m_sinkInputBus)
       
   126 
       
   127         AUNode sinkIn = m_sinkAudioNode->getInputAUNode();
       
   128 	    AUGraphDisconnectNodeInput(graph->audioGraphRef(), sinkIn, m_sinkInputBus);
       
   129         m_connected = false;
       
   130         return true;
       
   131     }
       
   132 
       
   133     void AudioConnection::invalidate()
       
   134     {
       
   135         m_connected = false;
       
   136     }
       
   137 
       
   138     bool AudioConnection::isBetween(MediaNode *source, MediaNode *sink){
       
   139         return (source == m_source) && (sink == m_sink);
       
   140     }
       
   141 
       
   142     bool AudioConnection::isValid(){
       
   143         return (m_sourceAudioNode != 0);
       
   144     }
       
   145 
       
   146     bool AudioConnection::isSinkOnly(){
       
   147         return (m_sourceAudioNode == 0) && (m_sinkAudioNode != 0);
       
   148     }
       
   149 
       
   150 }} //namespace Phonon::QT7
       
   151 
       
   152 QT_END_NAMESPACE