152a38012Sejakowatz/***********************************************************************
252a38012Sejakowatz * AUTHOR: Marcus Overhagen
352a38012Sejakowatz *   FILE: TimedEventQueue.cpp
452a38012Sejakowatz *  DESCR: used by BMediaEventLooper
552a38012Sejakowatz ***********************************************************************/
652a38012Sejakowatz
752a38012Sejakowatz#include <TimedEventQueue.h>
852a38012Sejakowatz#include <string.h>
952a38012Sejakowatz#include "TimedEventQueuePrivate.h"
10b84955d4SBarrett#include "MediaDebug.h"
1152a38012Sejakowatz
1252a38012Sejakowatz/*************************************************************
1352a38012Sejakowatz * struct media_timed_event
1452a38012Sejakowatz *************************************************************/
1552a38012Sejakowatz
1652a38012Sejakowatzmedia_timed_event::media_timed_event()
1752a38012Sejakowatz{
1852a38012Sejakowatz	CALLED();
1952a38012Sejakowatz	memset(this, 0, sizeof(*this));
2052a38012Sejakowatz}
2152a38012Sejakowatz
2252a38012Sejakowatz
2352a38012Sejakowatzmedia_timed_event::media_timed_event(bigtime_t inTime,
2452a38012Sejakowatz									 int32 inType)
2552a38012Sejakowatz{
2652a38012Sejakowatz	CALLED();
2752a38012Sejakowatz	memset(this, 0, sizeof(*this));
2852a38012Sejakowatz	event_time = inTime;
2952a38012Sejakowatz	type = inType;
3052a38012Sejakowatz}
3152a38012Sejakowatz
3252a38012Sejakowatz
3352a38012Sejakowatzmedia_timed_event::media_timed_event(bigtime_t inTime,
3452a38012Sejakowatz									 int32 inType,
3552a38012Sejakowatz									 void *inPointer,
3652a38012Sejakowatz									 uint32 inCleanup)
3752a38012Sejakowatz{
3852a38012Sejakowatz	CALLED();
3952a38012Sejakowatz	memset(this, 0, sizeof(*this));
4052a38012Sejakowatz	event_time = inTime;
4152a38012Sejakowatz	type = inType;
4252a38012Sejakowatz	pointer = inPointer;
4352a38012Sejakowatz	cleanup = inCleanup;
4452a38012Sejakowatz}
4552a38012Sejakowatz
4652a38012Sejakowatz
4752a38012Sejakowatzmedia_timed_event::media_timed_event(bigtime_t inTime,
4852a38012Sejakowatz									 int32 inType,
4952a38012Sejakowatz									 void *inPointer,
5052a38012Sejakowatz									 uint32 inCleanup,
5152a38012Sejakowatz									 int32 inData,
5252a38012Sejakowatz									 int64 inBigdata,
5352a38012Sejakowatz									 char *inUserData,
5452a38012Sejakowatz									 size_t dataSize)
5552a38012Sejakowatz{
5652a38012Sejakowatz	CALLED();
5752a38012Sejakowatz	memset(this, 0, sizeof(*this));
5852a38012Sejakowatz	event_time = inTime;
5952a38012Sejakowatz	type = inType;
6052a38012Sejakowatz	pointer = inPointer;
6152a38012Sejakowatz	cleanup = inCleanup;
6252a38012Sejakowatz	data = inData;
6352a38012Sejakowatz	bigdata = inBigdata;
6452a38012Sejakowatz	memcpy(user_data,inUserData,min_c(sizeof(media_timed_event::user_data),dataSize));
6552a38012Sejakowatz}
6652a38012Sejakowatz
6752a38012Sejakowatz
6852a38012Sejakowatzmedia_timed_event::media_timed_event(const media_timed_event &clone)
6952a38012Sejakowatz{
7052a38012Sejakowatz	CALLED();
7152a38012Sejakowatz	*this = clone;
7252a38012Sejakowatz}
7352a38012Sejakowatz
7452a38012Sejakowatz
7552a38012Sejakowatzvoid
7652a38012Sejakowatzmedia_timed_event::operator=(const media_timed_event &clone)
7752a38012Sejakowatz{
7852a38012Sejakowatz	CALLED();
7952a38012Sejakowatz	memcpy(this, &clone, sizeof(*this));
8052a38012Sejakowatz}
8152a38012Sejakowatz
8252a38012Sejakowatz
8352a38012Sejakowatzmedia_timed_event::~media_timed_event()
8452a38012Sejakowatz{
8552a38012Sejakowatz	CALLED();
8652a38012Sejakowatz}
8752a38012Sejakowatz
8852a38012Sejakowatz/*************************************************************
8952a38012Sejakowatz * global operators
9052a38012Sejakowatz *************************************************************/
9152a38012Sejakowatz
9252a38012Sejakowatzbool operator==(const media_timed_event & a, const media_timed_event & b)
9352a38012Sejakowatz{
9452a38012Sejakowatz	CALLED();
9552a38012Sejakowatz	return (0 == memcmp(&a,&b,sizeof(media_timed_event)));
9652a38012Sejakowatz}
9752a38012Sejakowatz
9852a38012Sejakowatzbool operator!=(const media_timed_event & a, const media_timed_event & b)
9952a38012Sejakowatz{
10052a38012Sejakowatz	CALLED();
10152a38012Sejakowatz	return (0 != memcmp(&a,&b,sizeof(media_timed_event)));
10252a38012Sejakowatz}
10352a38012Sejakowatz
10452a38012Sejakowatzbool operator<(const media_timed_event & a, const media_timed_event & b)
10552a38012Sejakowatz{
10652a38012Sejakowatz	CALLED();
10752a38012Sejakowatz	return a.event_time < b.event_time;
10852a38012Sejakowatz}
10952a38012Sejakowatz
11052a38012Sejakowatzbool operator>(const media_timed_event & a, const media_timed_event &b)
11152a38012Sejakowatz{
11252a38012Sejakowatz	CALLED();
11352a38012Sejakowatz	return a.event_time > b.event_time;
11452a38012Sejakowatz}
11552a38012Sejakowatz
11652a38012Sejakowatz
11752a38012Sejakowatz/*************************************************************
11852a38012Sejakowatz * public BTimedEventQueue
11952a38012Sejakowatz *************************************************************/
12052a38012Sejakowatz
12152a38012Sejakowatz
12252a38012Sejakowatzvoid *
12352a38012SejakowatzBTimedEventQueue::operator new(size_t s)
12452a38012Sejakowatz{
12552a38012Sejakowatz	CALLED();
12652a38012Sejakowatz	return ::operator new(s);
12752a38012Sejakowatz}
12852a38012Sejakowatz
12952a38012Sejakowatz
13052a38012Sejakowatzvoid
13152a38012SejakowatzBTimedEventQueue::operator delete(void *p, size_t s)
13252a38012Sejakowatz{
13352a38012Sejakowatz	CALLED();
13452a38012Sejakowatz	return ::operator delete(p);
13552a38012Sejakowatz}
13652a38012Sejakowatz
13752a38012Sejakowatz
13852a38012SejakowatzBTimedEventQueue::BTimedEventQueue() :
13952a38012Sejakowatz	fImp(new _event_queue_imp)
14052a38012Sejakowatz{
14152a38012Sejakowatz	CALLED();
14252a38012Sejakowatz}
14352a38012Sejakowatz
14452a38012Sejakowatz
14552a38012SejakowatzBTimedEventQueue::~BTimedEventQueue()
14652a38012Sejakowatz{
14752a38012Sejakowatz	CALLED();
14852a38012Sejakowatz	delete fImp;
14952a38012Sejakowatz}
15052a38012Sejakowatz
15152a38012Sejakowatz
15252a38012Sejakowatzstatus_t
15352a38012SejakowatzBTimedEventQueue::AddEvent(const media_timed_event &event)
15452a38012Sejakowatz{
15552a38012Sejakowatz	CALLED();
15652a38012Sejakowatz	return fImp->AddEvent(event);
15752a38012Sejakowatz}
15852a38012Sejakowatz
15952a38012Sejakowatz
16052a38012Sejakowatzstatus_t
16152a38012SejakowatzBTimedEventQueue::RemoveEvent(const media_timed_event *event)
16252a38012Sejakowatz{
16352a38012Sejakowatz	CALLED();
16452a38012Sejakowatz	return fImp->RemoveEvent(event);
16552a38012Sejakowatz}
16652a38012Sejakowatz
16752a38012Sejakowatz
16852a38012Sejakowatzstatus_t
16952a38012SejakowatzBTimedEventQueue::RemoveFirstEvent(media_timed_event *outEvent)
17052a38012Sejakowatz{
17152a38012Sejakowatz	CALLED();
17252a38012Sejakowatz	return fImp->RemoveFirstEvent(outEvent);
17352a38012Sejakowatz}
17452a38012Sejakowatz
17552a38012Sejakowatz
17652a38012Sejakowatzbool
17752a38012SejakowatzBTimedEventQueue::HasEvents() const
17852a38012Sejakowatz{
17952a38012Sejakowatz	CALLED();
18052a38012Sejakowatz	return fImp->HasEvents();
18152a38012Sejakowatz}
18252a38012Sejakowatz
18352a38012Sejakowatz
18452a38012Sejakowatzint32
18552a38012SejakowatzBTimedEventQueue::EventCount() const
18652a38012Sejakowatz{
18752a38012Sejakowatz	CALLED();
18852a38012Sejakowatz	return fImp->EventCount();
18952a38012Sejakowatz}
19052a38012Sejakowatz
19152a38012Sejakowatz
19252a38012Sejakowatzconst media_timed_event *
19352a38012SejakowatzBTimedEventQueue::FirstEvent() const
19452a38012Sejakowatz{
19552a38012Sejakowatz	CALLED();
19652a38012Sejakowatz	return fImp->FirstEvent();
19752a38012Sejakowatz}
19852a38012Sejakowatz
19952a38012Sejakowatz
20052a38012Sejakowatzbigtime_t
20152a38012SejakowatzBTimedEventQueue::FirstEventTime() const
20252a38012Sejakowatz{
20352a38012Sejakowatz	CALLED();
20452a38012Sejakowatz	return fImp->FirstEventTime();
20552a38012Sejakowatz}
20652a38012Sejakowatz
20752a38012Sejakowatz
20852a38012Sejakowatzconst media_timed_event *
20952a38012SejakowatzBTimedEventQueue::LastEvent() const
21052a38012Sejakowatz{
21152a38012Sejakowatz	CALLED();
21252a38012Sejakowatz	return fImp->LastEvent();
21352a38012Sejakowatz}
21452a38012Sejakowatz
21552a38012Sejakowatz
21652a38012Sejakowatzbigtime_t
21752a38012SejakowatzBTimedEventQueue::LastEventTime() const
21852a38012Sejakowatz{
21952a38012Sejakowatz	CALLED();
22052a38012Sejakowatz	return fImp->LastEventTime();
22152a38012Sejakowatz}
22252a38012Sejakowatz
22352a38012Sejakowatz
22452a38012Sejakowatzconst media_timed_event *
22552a38012SejakowatzBTimedEventQueue::FindFirstMatch(bigtime_t eventTime,
22652a38012Sejakowatz								 time_direction direction,
22752a38012Sejakowatz								 bool inclusive,
22852a38012Sejakowatz								 int32 eventType)
22952a38012Sejakowatz{
23052a38012Sejakowatz	CALLED();
23152a38012Sejakowatz	return fImp->FindFirstMatch(eventTime, direction, inclusive, eventType);
23252a38012Sejakowatz}
23352a38012Sejakowatz
23452a38012Sejakowatz
23552a38012Sejakowatzstatus_t
23652a38012SejakowatzBTimedEventQueue::DoForEach(for_each_hook hook,
23752a38012Sejakowatz							void *context,
23852a38012Sejakowatz							bigtime_t eventTime,
23952a38012Sejakowatz							time_direction direction,
24052a38012Sejakowatz							bool inclusive,
24152a38012Sejakowatz							int32 eventType)
24252a38012Sejakowatz{
24352a38012Sejakowatz	CALLED();
24452a38012Sejakowatz	return fImp->DoForEach(hook, context, eventTime, direction, inclusive, eventType);
24552a38012Sejakowatz}
24652a38012Sejakowatz
24752a38012Sejakowatz
24852a38012Sejakowatzvoid
24952a38012SejakowatzBTimedEventQueue::SetCleanupHook(cleanup_hook hook,
25052a38012Sejakowatz								 void *context)
25152a38012Sejakowatz{
25252a38012Sejakowatz	CALLED();
25352a38012Sejakowatz	fImp->SetCleanupHook(hook, context);
25452a38012Sejakowatz}
25552a38012Sejakowatz
25652a38012Sejakowatz
25752a38012Sejakowatzstatus_t
25852a38012SejakowatzBTimedEventQueue::FlushEvents(bigtime_t eventTime,
25952a38012Sejakowatz							  time_direction direction,
26052a38012Sejakowatz							  bool inclusive,
26152a38012Sejakowatz							  int32 eventType)
26252a38012Sejakowatz{
26352a38012Sejakowatz	CALLED();
26452a38012Sejakowatz	return fImp->FlushEvents(eventTime, direction, inclusive, eventType);
26552a38012Sejakowatz}
26652a38012Sejakowatz
26752a38012Sejakowatz/*************************************************************
26852a38012Sejakowatz * private BTimedEventQueue
26952a38012Sejakowatz *************************************************************/
27052a38012Sejakowatz
27152a38012Sejakowatz/*
27252a38012Sejakowatz// unimplemented
27352a38012SejakowatzBTimedEventQueue::BTimedEventQueue(const BTimedEventQueue &other)
27452a38012SejakowatzBTimedEventQueue &BTimedEventQueue::operator=(const BTimedEventQueue &other)
27552a38012Sejakowatz*/
27652a38012Sejakowatz
27752a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_0(void *, ...) { return B_ERROR; }
27852a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_1(void *, ...) { return B_ERROR; }
27952a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_2(void *, ...) { return B_ERROR; }
28052a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_3(void *, ...) { return B_ERROR; }
28152a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_4(void *, ...) { return B_ERROR; }
28252a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_5(void *, ...) { return B_ERROR; }
28352a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_6(void *, ...) { return B_ERROR; }
28452a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_7(void *, ...) { return B_ERROR; }
28552a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_8(void *, ...) { return B_ERROR; }
28652a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_9(void *, ...) { return B_ERROR; }
28752a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_10(void *, ...) { return B_ERROR; }
28852a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_11(void *, ...) { return B_ERROR; }
28952a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_12(void *, ...) { return B_ERROR; }
29052a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_13(void *, ...) { return B_ERROR; }
29152a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_14(void *, ...) { return B_ERROR; }
29252a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_15(void *, ...) { return B_ERROR; }
29352a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_16(void *, ...) { return B_ERROR; }
29452a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_17(void *, ...) { return B_ERROR; }
29552a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_18(void *, ...) { return B_ERROR; }
29652a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_19(void *, ...) { return B_ERROR; }
29752a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_20(void *, ...) { return B_ERROR; }
29852a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_21(void *, ...) { return B_ERROR; }
29952a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_22(void *, ...) { return B_ERROR; }
30052a38012Sejakowatzstatus_t BTimedEventQueue::_Reserved_BTimedEventQueue_23(void *, ...) { return B_ERROR; }
301