/***************************************************************************
                          streaming.h  -  description
                             -------------------
    begin                : Sun Sept 3 2006
    copyright            : (C) 2006 by Martin Witte
    email                : witte@kawo1.rwth-aachen.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef _KRADIO_STREAMING_H
#define _KRADIO_STREAMING_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "../../src/include/plugins.h"
#include "../../src/include/soundformat.h"
#include "../../src/include/soundstreamclient_interfaces.h"

#include <tqobject.h>
#include <tqdict.h>

class StreamingJob;

class StreamingDevice : public TQObject,
                        public PluginBase,
                        public ISoundStreamClient
{
TQ_OBJECT
  

public:
    StreamingDevice (const TQString &name);
    virtual ~StreamingDevice ();

    virtual bool   connectI(Interface *i);
    virtual bool   disconnectI(Interface *i);

    bool getPlaybackStreamOptions(const TQString &channel, TQString &url, SoundFormat &sf, size_t &buffer_size) const;
    bool getCaptureStreamOptions (const TQString &channel, TQString &url, SoundFormat &sf, size_t &buffer_size) const;

    void resetPlaybackStreams(bool notification_enabled = true);
    void resetCaptureStreams(bool notification_enabled = true);
    void addPlaybackStream(const TQString &url, const SoundFormat &sf, size_t buffer_size, bool notification_enabled = true);
    void addCaptureStream (const TQString &url, const SoundFormat &sf, size_t buffer_size, bool notification_enabled = true);

    // PluginBase

public:
    virtual void   saveState (TDEConfig *) const;
    virtual void   restoreState (TDEConfig *);

    virtual TQString pluginClassName() const { return "StreamingDevice"; }

    virtual const TQString &name() const { return PluginBase::name(); }
    virtual       TQString &name()       { return PluginBase::name(); }

    virtual ConfigPageInfo  createConfigurationPage();
    virtual AboutPageInfo   createAboutPage();

    // ISoundStreamClient: direct device access

RECEIVERS:
    void noticeConnectedI (ISoundStreamServer *s, bool pointer_valid);
    bool preparePlayback(SoundStreamID id, const TQString &channel, bool active_mode, bool start_immediately);
    bool prepareCapture(SoundStreamID id,  const TQString &channel);
    bool releasePlayback(SoundStreamID id);
    bool releaseCapture(SoundStreamID id);

ANSWERS:
    bool supportsPlayback() const;
    bool supportsCapture()  const;

    TQString getSoundStreamClientDescription() const;

    // ISoundStreamClient: mixer access

protected:

ANSWERS:
    const TQStringList &getPlaybackChannels() const;
    const TQStringList &getCaptureChannels() const;

    // ISoundStreamClient: generic broadcasts

RECEIVERS:
    bool startPlayback(SoundStreamID id);
    bool pausePlayback(SoundStreamID id);
    bool stopPlayback(SoundStreamID id);
    bool isPlaybackRunning(SoundStreamID id, bool &b) const;

    bool startCaptureWithFormat(SoundStreamID      id,
                                const SoundFormat &proposed_format,
                                SoundFormat       &real_format,
                                bool               force_format);
    bool stopCapture(SoundStreamID id);
    bool isCaptureRunning(SoundStreamID id, bool &b, SoundFormat &sf) const;

    bool noticeSoundStreamClosed(SoundStreamID id);
    bool noticeSoundStreamRedirected(SoundStreamID oldID, SoundStreamID newID);

    bool noticeReadyForPlaybackData(SoundStreamID id, size_t size);

    bool noticeSoundStreamData(SoundStreamID id,
                               const SoundFormat &,
                               const char *data, size_t size, size_t &consumed_size,
                               const SoundMetaData &md
                              );

public slots:

    void   logStreamError(const KURL &url, const TQString &s);
    void   logStreamWarning(const KURL &url, const TQString &s);

signals:

    void   sigUpdateConfig();

protected:

    TQStringList     m_PlaybackChannelList,
                    m_CaptureChannelList;

    TQDict<StreamingJob>
                    m_PlaybackChannels,
                    m_CaptureChannels;

    TQMap<SoundStreamID, TQString>
                    m_AllPlaybackStreams,
                    m_AllCaptureStreams,
                    m_EnabledPlaybackStreams,
                    m_EnabledCaptureStreams;
};



#endif
