/*  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/>.
*/

#ifndef Phonon_QT7_AudioConnection_H
#define Phonon_QT7_AudioConnection_H

#include <QtCore/QObject>
#include "backendheader.h"

#include <AudioToolbox/AudioToolbox.h>
#include <AudioUnit/AudioUnit.h>

QT_BEGIN_NAMESPACE

namespace Phonon
{
namespace QT7
{
    class MediaNode;
    class AudioNode;
    class AudioGraph;

    class AudioConnection {
    public:
        AudioConnection();
        AudioConnection(MediaNode *sink);
        AudioConnection(MediaNode *source, int output, MediaNode *sink, int input);

        AudioConnection(AudioNode *sink);
        AudioConnection(AudioNode *source, int output, AudioNode *sink, int input);

        ~AudioConnection();

        bool connect(AudioGraph *graph);
        bool disconnect(AudioGraph *graph);

        bool updateStreamSpecification();
        bool isBetween(MediaNode *source, MediaNode *sink);
        bool isValid();
        bool isSinkOnly();
        void freeMemoryAllocations();
        void invalidate();
        
        MediaNode *m_source;
        AudioNode *m_sourceAudioNode;
        int m_sourceOutputBus;

        MediaNode *m_sink;
        AudioNode *m_sinkAudioNode;
        int m_sinkInputBus;

        AudioChannelLayout *m_sourceChannelLayout;
    	UInt32 m_sourceChannelLayoutSize;

        AudioChannelLayout *m_sinkChannelLayout;
    	UInt32 m_sinkChannelLayoutSize;

        AudioStreamBasicDescription m_sourceStreamDescription;
        AudioStreamBasicDescription m_sinkStreamDescription;

        bool m_hasSourceSpecification;
        bool m_hasSinkSpecification;
        bool m_connected;
    };

}} // namespace Phonon::QT7

QT_END_NAMESPACE

#endif // Phonon_QT7_AudioConnection_H
