/* * Copyright 2009, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _TIMED_EVENT_QUEUE_H #define _TIMED_EVENT_QUEUE_H #include struct _event_queue_imp; struct media_timed_event { media_timed_event(); media_timed_event(bigtime_t inTime, int32 inType); media_timed_event(bigtime_t inTime, int32 inType, void*inPointer, uint32 inCleanup); media_timed_event( bigtime_t inTime, int32 inType, void* inPointer, uint32 inCleanup, int32 inData, int64 inBigdata, const char* inUserData, size_t dataSize = 0); media_timed_event( const media_timed_event& other); ~media_timed_event(); // TODO: Should this not return "media_timed_event&" ?! void operator=(const media_timed_event& other); bigtime_t event_time; int32 type; void* pointer; uint32 cleanup; int32 data; int64 bigdata; char user_data[64]; uint32 _reserved_media_timed_event_[8]; }; bool operator==(const media_timed_event& a, const media_timed_event& b); bool operator!=(const media_timed_event& a, const media_timed_event& b); bool operator<(const media_timed_event& a, const media_timed_event& b); bool operator>(const media_timed_event& a, const media_timed_event&b); /*! A priority queue for holding media_timed_events. Sorts by increasing time, so events near the front of the queue are to occur earlier. */ class BTimedEventQueue { public: enum event_type { B_NO_EVENT = -1, // Pushing this type will always fail. B_ANY_EVENT = 0, // Pushing this type will always fail. B_START, B_STOP, B_SEEK, B_WARP, B_TIMER, B_HANDLE_BUFFER, B_DATA_STATUS, B_HARDWARE, B_PARAMETER, // User defined events are greater than this value. B_USER_EVENT = 0x4000 }; enum cleanup_flag { B_NO_CLEANUP = 0, B_RECYCLE_BUFFER, // Specifies to recycle buffers handled by // BTimedEventQueue. B_EXPIRE_TIMER, // Specifies to call TimerExpired() on the // event->data. B_USER_CLEANUP = 0x4000 }; enum time_direction { B_ALWAYS = -1, B_BEFORE_TIME = 0, B_AT_TIME, B_AFTER_TIME }; void* operator new(size_t size); void operator delete(void* ptr, size_t size); BTimedEventQueue(); virtual ~BTimedEventQueue(); status_t AddEvent(const media_timed_event& event); status_t RemoveEvent(const media_timed_event* event); status_t RemoveFirstEvent( media_timed_event* _event = NULL); bool HasEvents() const; int32 EventCount() const; const media_timed_event* FirstEvent() const; bigtime_t FirstEventTime() const; const media_timed_event* LastEvent() const; bigtime_t LastEventTime() const; const media_timed_event* FindFirstMatch(bigtime_t eventTime, time_direction direction, bool inclusive = true, int32 eventType = B_ANY_EVENT); // Queue manipulation // Call DoForEach to perform a function on each event in the queue. // Return an appropriate status defining an action to take for that event. // DoForEach is an atomic operation ensuring the consistency of the queue // during the call. enum queue_action { B_DONE = -1, B_NO_ACTION = 0, B_REMOVE_EVENT, B_RESORT_QUEUE }; typedef queue_action (*for_each_hook)(media_timed_event* event, void* context); status_t DoForEach(for_each_hook hook, void* context, bigtime_t eventTime = 0, time_direction direction = B_ALWAYS, bool inclusive = true, int32 eventType = B_ANY_EVENT); // Flushing events // The cleanup hook is called when events are flushed from the queue and // the cleanup is not B_NO_CLEANUP or B_RECYCLE_BUFFER. typedef void (*cleanup_hook)(const media_timed_event* event, void* context); void SetCleanupHook(cleanup_hook hook, void* context); status_t FlushEvents(bigtime_t eventTime, time_direction direction, bool inclusive = true, int32 eventType = B_ANY_EVENT); private: // FBC padding and forbidden methods BTimedEventQueue( const BTimedEventQueue& other); BTimedEventQueue& operator=(const BTimedEventQueue& other); virtual status_t _Reserved_BTimedEventQueue_0(void*, ...); virtual status_t _Reserved_BTimedEventQueue_1(void*, ...); virtual status_t _Reserved_BTimedEventQueue_2(void*, ...); virtual status_t _Reserved_BTimedEventQueue_3(void*, ...); virtual status_t _Reserved_BTimedEventQueue_4(void*, ...); virtual status_t _Reserved_BTimedEventQueue_5(void*, ...); virtual status_t _Reserved_BTimedEventQueue_6(void*, ...); virtual status_t _Reserved_BTimedEventQueue_7(void*, ...); virtual status_t _Reserved_BTimedEventQueue_8(void*, ...); virtual status_t _Reserved_BTimedEventQueue_9(void*, ...); virtual status_t _Reserved_BTimedEventQueue_10(void*, ...); virtual status_t _Reserved_BTimedEventQueue_11(void*, ...); virtual status_t _Reserved_BTimedEventQueue_12(void*, ...); virtual status_t _Reserved_BTimedEventQueue_13(void*, ...); virtual status_t _Reserved_BTimedEventQueue_14(void*, ...); virtual status_t _Reserved_BTimedEventQueue_15(void*, ...); virtual status_t _Reserved_BTimedEventQueue_16(void*, ...); virtual status_t _Reserved_BTimedEventQueue_17(void*, ...); virtual status_t _Reserved_BTimedEventQueue_18(void*, ...); virtual status_t _Reserved_BTimedEventQueue_19(void*, ...); virtual status_t _Reserved_BTimedEventQueue_20(void*, ...); virtual status_t _Reserved_BTimedEventQueue_21(void*, ...); virtual status_t _Reserved_BTimedEventQueue_22(void*, ...); virtual status_t _Reserved_BTimedEventQueue_23(void*, ...); private: _event_queue_imp* fImp; uint32 _reserved_timed_event_queue_[6]; }; #endif