/*  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_AUDIOGRAPH_H
#define Phonon_QT7_AUDIOGRAPH_H

#include <AudioToolbox/AudioToolbox.h>
#include <AudioUnit/AudioUnit.h>

#include <QtCore/qnamespace.h>
#include "audioconnection.h"
#include "medianode.h"

QT_BEGIN_NAMESPACE

namespace Phonon
{
namespace QT7
{
    class AudioGraph : public MediaNode
    {
        public:
            AudioGraph(MediaNode *root);
            virtual ~AudioGraph();
            AUGraph audioGraphRef();
            void startAllOverFromScratch();

            bool openAndInit();
            void start();
            void tryStartGraph();
            void stop();
            void prepare();
            void rebuildGraph();
            void update();
            bool isRunning();
            void setPaused(bool pause);
            bool graphCannotPlay();
            void rebuildGraphIfNeeded();
            void updateStreamSpecifications();
            void setStatusCannotPlay();
            MediaNode *root();
            void notify(const MediaNodeEvent *event, bool propagate = true);

        private:
            friend class MediaNode;
            friend class AudioNode;

            void deleteGraph();
            bool updateStreamSpecificationRecursive(AudioConnection *connection);
            void createAndConnectAuNodesRecursive(AudioConnection *connection);
            bool createAudioUnitsRecursive(AudioConnection *connection);

            void connectLate(AudioConnection *connection);
            void disconnectLate(AudioConnection *connection);

            int nodeCount();

            bool m_initialized;
            bool m_startedLogically;
            bool m_rebuildLater;
            bool m_graphCannotPlay;
            bool m_paused;

            AUGraph m_audioGraphRef;
            MediaNode *m_root;
    };

}} // namespace Phonon::QT7

QT_END_NAMESPACE

#endif // Phonon_QT7_AUDIOGRAPH_H
