source: trunk/src/3rdparty/phonon/qt7/audioconnection.mm

Last change on this file was 2, checked in by Dmitry A. Kuminov, 17 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 5.4 KB
Line 
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
23QT_BEGIN_NAMESPACE
24
25namespace Phonon
26{
27namespace 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
152QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.