Source: audioserver.h


Annotated List
Files
Globals
Hierarchy
Index
// ##########################################################################
// ####                                                                  ####
// ####                      RTP Audio Server Project                    ####
// ####                    ============================                  ####
// ####                                                                  ####
// #### Audio Server                                                     ####
// ####                                                                  ####
// #### Version 1.00  --  February 04, 2001                              ####
// ####                                                                  ####
// #### Copyright (C) 1999  Thomas Dreibholz                             ####
// ####               2000  Universität Bonn, Abt. IV                    ####
// ####               2001  EMail: Dreibholz@bigfoot.com                 ####
// ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
// ####                                                                  ####
// ##########################################################################


#ifndef AUDIOSERVER_H
#define AUDIOSERVER_H


#include "system.h"
#include "multiaudioreader.h"
#include "socket.h"
#include "audioencoderrepository.h"
#include "rtpsender.h"
#include "rtcppacket.h"
#include "rtcpreceiver.h"
#include "rtcpabstractserver.h"
#include "extendedtransportinfo.h"
#include "congestionmanagerclient.h"

#include "audioclientapppacket.h"
#include "QoS/qosmanager.h"


#include <multimap.h>
#include <algo.h>


namespace Coral {


/**
  * This class is an audio server based on RTCPAbstractServer
  *
  * @short   Audio Server
  * @author  Thomas Dreibholz (Dreibholz@bigfoot.com)
  * @version 1.0
  */
class AudioServer : public         RTCPAbstractServer,
                    virtual public QoSManagerInterface
{
   // ====== Definitions ====================================================
   private:
   struct User {
      RTCPAbstractServer::Client* Client;
      RTPSender                   Sender;
      Socket                      SenderSocket;
      InternetFlow                Flow;
      AudioEncoderRepository      Repository;
      MultiAudioReader            Reader;
      String                      MediaName;
      integer                     StreamIdentifier;
      card64                      BandwidthLimit;
      card16                      LastSequenceNumber;
      card16                      PosChgSeqNumber;
      bool                        UserLimitPause;
      bool                        ManagerLimitPause;
      bool                        ClientPause;
   };


   // ====== Constructor/Destructor =========================================
   public:
   /**
     * Constructor for new AudioServer.
     *
     * @param qosManager QoSManager object.
     * @param maxPacketSize Maximum packet size.
     * @param congestionManager CongestionManagerClient object.
     */
   AudioServer(QoSManager*              qosManager,
               const cardinal           maxPacketSize     = 1500,
               CongestionManagerClient* congestionManager = NULL);

   /**
     * Destructor.
     */
   ~AudioServer();


   // ====== Status functions ===============================================
   /**
     * Get client SSRC.
     *
     * @return Client SSRC.
     */
   card32 getOurSSRC() const;

   /**
     * Get loss scalibility setting.
     *
     * @return true, if loss scalability is on; false otherwise.
     */
   inline bool getLossScalability() const;

   /**
     * Set loss scalibility setting.
     *
     * @param on true, if to set loss scalability on; false otherwise.
     */
   inline void setLossScalability(const bool on);


   // ====== Packet size ====================================================
   /**
     * Get maximum packet size.
     *
     * @return Maximum packet size.
     */
   inline cardinal getMaxPacketSize() const;

   /**
     * Set maximum packet size.
     *
     * @param size Maximum packet size.
     * @return Maximum packet size set.
     */
   inline cardinal setMaxPacketSize(const cardinal size);


   // ====== RTCPAbstractServer implementation ==============================
   /**
     * outOfMemoryWarning() implementation of RTCPAbstractServer.
     */
   void outOfMemoryWarning();

   /**
     * newClient() implementation of RTCPAbstractServer.
     *
     * @see RTCPAbstractServer#newClient
     */     
   void* newClient(Client* client, const char* cname);

   /**
     * deleteClient() implementation of RTCPAbstractServer.
     *
     * @see RTCPAbstractServer#deleteClient
     */     
   void deleteClient(Client* client, const DeleteReason reason);

   /**
     * checkClient() implementation of RTCPAbstractServer.
     *
     * @see RTCPAbstractServer#checkClient
     */
   bool checkClient(const Client* client);

   /**
     * appMessage() implementation of RTCPAbstractServer.
     *
     * @see RTCPAbstractServer#appMessage
     */     
   void appMessage(const Client*  client,
                   const char*    name,
                   const void*    data,
                   const cardinal dataLength);

   /**
     * sdesMessage() implementation of RTCPAbstractServer.
     *
     * @see RTCPAbstractServer#sdesMessage
     */     
   void sdesMessage(const Client*  client,
                    const card8    type,
                    const char*    data,
                    const cardinal length);

   /**
     * receiverReport() implementation of RTCPAbstractServer.
     *
     * @see RTCPAbstractServer#receiverReport
     */     
   void receiverReport(const Client*                   client,
                       const RTCPReceptionReportBlock* report,
                       const cardinal                  layer);


   // ====== QoS-Manager interface ==========================================
   /**
     * adaptTransportInfo() implementation of QoSManagerInterface.
     */
   void adaptTransportInfo(card32 streamIdentifier, ExtendedTransportInfo ti); 


   // ====== Execute user command ===========================================   
   /**
     * Execute commands given in AudioClientAppPacket.
     *
     * @param client Client.
     * @param user User.
     * @param app AudioClientApp message.
     */
   void userCommand(const Client*               client,
                    User*                       user,
                    const AudioClientAppPacket* app);

   /**
     * Update QoS/congestion management.
     *
     * @param client Client to do congestion for.
     * @param user User data.
     */
   void managementUpdate(const Client* client, User* user);


   // ====== Private data ===================================================
   private:
   QoSManager*                    QoSMgr;
   CongestionManagerClient*       CongestionMgr;
   multimap<const cardinal,User*> UserSet;
   Synchronizable                 UserSetSync;
   cardinal                       MaxPacketSize;
   card32                         OurSSRC;
   bool                           LossScalability;
};


}


#include "audioserver.icc"


#endif

Generated by: viper@odin on Sun Feb 4 18:54:51 2001, using kdoc 2.0a22.