📄 conference.h
字号:
PINDEX totalVideoFramesReceived;
#endif
};
////////////////////////////////////////////////////
template <class KeyType>
class MCUNumberMapType : public std::map<int, KeyType>
{
public:
typedef std::map<int, KeyType> Ancestor;
int GetNumber(const KeyType & id)
{
PWaitAndSignal m(mutex);
int mcuNumber = 1;
if (Ancestor::size() != 0) {
mcuNumber = 1 + Ancestor::begin()->first;
while (Ancestor::find(mcuNumber) != Ancestor::end())
++mcuNumber;
}
Ancestor::insert(std::pair<int, KeyType>(mcuNumber, id));
return mcuNumber;
}
void RemoveNumber(int mcuNumber)
{ PWaitAndSignal m(mutex); Ancestor::erase(mcuNumber); }
protected:
PMutex mutex;
};
////////////////////////////////////////////////////
class ConferenceMonitorInfo;
/**
* this class describes a conference or "room"
*/
class Conference : public PObject
{
PCLASSINFO(Conference, PObject);
public:
typedef std::map<void *, ConferenceMember *> MemberList;
Conference(ConferenceManager & manager,
const OpalGloballyUniqueID & _guid,
const PString & _number,
const PString & _name,
int _mcuNumber
#if OPENMCU_VIDEO
,MCUVideoMixer * _videoMixer = NULL
#endif
);
~Conference();
PMutex & GetMutex()
{ return memberListMutex; }
ConferenceManager & GetManager()
{ return manager; }
/**
* add the specified member to the conference
*/
BOOL AddMember(ConferenceMember * member);
/**
* remove the specifed member from the conference.
* Note that this function does not actually delete the conference member
* as sometimes a conference member needs to remove itself from a conference
*
* @return if TRUE, the conference is now empty
*/
BOOL RemoveMember(ConferenceMember * member);
MemberList & GetMemberList()
{ return memberList; }
int GetMemberCount() const
{ PWaitAndSignal m(memberListMutex); return (int)memberList.size(); }
int GetVisibleMemberCount() const;
virtual PString GetName() const
{ return name; }
virtual PString GetNumber() const
{ return number; }
OpalGloballyUniqueID GetID() const
{ return guid; }
virtual BOOL IsVisible() const
{ return TRUE; }
PTime GetStartTime() const
{ return startTime; }
PINDEX GetMaxMemberCount() const
{ return maxMemberCount; }
int GetMCUNumber() const
{ return mcuNumber; }
virtual BOOL BeforeMemberJoining(ConferenceMember *);
virtual void OnMemberJoining(ConferenceMember *);
virtual void OnMemberLeaving(ConferenceMember *);
virtual void ReadMemberAudio(ConferenceMember * member, void * buffer, PINDEX amount);
virtual void WriteMemberAudioLevel(ConferenceMember * member, unsigned audioLevel);
#if OPENMCU_VIDEO
virtual void ReadMemberVideo(ConferenceMember * member, void * buffer, int width, int height, PINDEX & amount);
virtual BOOL WriteMemberVideo(ConferenceMember * member, const void * buffer, int width, int height, PINDEX amount);
virtual BOOL UseSameVideoForAllMembers()
{ return videoMixer != NULL; }
virtual MCUVideoMixer * GetVideoMixer() const
{ return videoMixer; }
#endif
void AddMonitorEvent(ConferenceMonitorInfo * info);
protected:
ConferenceManager & manager;
PMutex memberListMutex;
MemberList memberList;
PINDEX maxMemberCount;
OpalGloballyUniqueID guid;
PString number;
PString name;
int mcuNumber;
PTime startTime;
MCUNumberMapType<ConferenceMemberId> terminalNumberMap;
BOOL mcuMonitorRunning;
#if OPENMCU_VIDEO
MCUVideoMixer * videoMixer;
#endif
};
////////////////////////////////////////////////////
class ConferenceMonitorInfo : public PObject
{
PCLASSINFO(ConferenceMonitorInfo, PObject);
public:
ConferenceMonitorInfo(const OpalGloballyUniqueID & _guid, const PTime & endTime)
: guid(_guid), timeToPerform(endTime) { }
OpalGloballyUniqueID guid;
PTime timeToPerform;
virtual BOOL Perform(Conference &) = 0;
};
class ConferenceTimeLimitInfo : public ConferenceMonitorInfo
{
public:
ConferenceTimeLimitInfo(const OpalGloballyUniqueID & guid, const PTime & endTime)
: ConferenceMonitorInfo(guid, endTime)
{ }
BOOL Perform(Conference & conference);
};
class ConferenceRepeatingInfo : public ConferenceMonitorInfo
{
public:
ConferenceRepeatingInfo(const OpalGloballyUniqueID & guid, const PTimeInterval & _repeatTime)
: ConferenceMonitorInfo(guid, PTime() + _repeatTime), repeatTime(_repeatTime)
{ }
BOOL Perform(Conference & conference);
protected:
PTimeInterval repeatTime;
};
class ConferenceMCUCheckInfo : public ConferenceRepeatingInfo
{
public:
ConferenceMCUCheckInfo(const OpalGloballyUniqueID & guid, const PTimeInterval & _repeatTime)
: ConferenceRepeatingInfo(guid, _repeatTime)
{ }
BOOL Perform(Conference & conference);
};
class ConferenceMonitor : public PThread
{
PCLASSINFO(ConferenceMonitor, PThread);
public:
ConferenceMonitor(ConferenceManager & _manager)
: PThread(10000, NoAutoDeleteThread), manager(_manager)
{ Resume(); }
void Main();
void AddMonitorEvent(ConferenceMonitorInfo * info);
void RemoveForConference(const OpalGloballyUniqueID & guid);
typedef std::vector<ConferenceMonitorInfo *> MonitorInfoList;
BOOL running;
protected:
ConferenceManager & manager;
PMutex mutex;
MonitorInfoList monitorList;
};
////////////////////////////////////////////////////
typedef std::map<OpalGloballyUniqueID, Conference *> ConferenceListType;
class ConferenceManager : public PObject
{
PCLASSINFO(ConferenceManager, PObject);
public:
ConferenceManager();
~ConferenceManager();
/**
* Make a new conference with the specified conference ID, number and name
*/
Conference * MakeAndLockConference(
const OpalGloballyUniqueID & conferenceID,
const PString & number,
const PString & name
);
/**
* Make a new conference with the specified number and name, and use a new conference ID
*/
Conference * MakeAndLockConference(
const PString & number,
const PString & name
);
Conference * MakeAndLockConference(
const PString & number
)
{ return MakeAndLockConference(number, PString::Empty()); }
void UnlockConference()
{ conferenceListMutex.Signal(); }
/**
* return true if a conference with the specified ID exists
*/
BOOL HasConference(
const OpalGloballyUniqueID & conferenceID,
PString & room
);
BOOL HasConference(
const OpalGloballyUniqueID & conferenceID
)
{ PString r; return HasConference(conferenceID, r); }
/**
* return true if a conference with the specified number exists
*/
BOOL HasConference(
const PString & number,
OpalGloballyUniqueID & conferenceID
);
BOOL HasConference(
const PString & number
)
{ OpalGloballyUniqueID i; return HasConference(number, i); }
/**
* Remove and delete the specified conference
*/
void RemoveConference(const OpalGloballyUniqueID & confId);
/**
* Remove the specified member from the specified conference.
* The member will will deleted, and if the conference is empty after the removal,
* it is deleted too
*/
void RemoveMember(const OpalGloballyUniqueID & confId, ConferenceMember * toRemove);
PMutex & GetConferenceListMutex()
{ return conferenceListMutex; }
ConferenceListType & GetConferenceList()
{ return conferenceList; }
virtual void OnCreateConference(Conference *);
virtual void OnDestroyConference(Conference *)
{ }
virtual BOOL BeforeMemberJoining(Conference *, ConferenceMember *)
{ return TRUE; }
virtual void OnMemberJoining(Conference *, ConferenceMember *)
{ }
virtual void OnMemberLeaving(Conference *, ConferenceMember *)
{ }
PINDEX GetMaxConferenceCount() const
{ return maxConferenceCount; }
void AddMonitorEvent(ConferenceMonitorInfo * info);
protected:
virtual Conference * CreateConference(const OpalGloballyUniqueID & _guid,
const PString & _number,
const PString & _name,
int mcuNumber);
PMutex conferenceListMutex;
ConferenceListType conferenceList;
PINDEX maxConferenceCount;
MCUNumberMapType<OpalGloballyUniqueID> mcuNumberMap;
ConferenceMonitor * monitor;
};
#endif // _OpenMCU_CONFERENCE_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -