root/headers/os/media/TimedEventQueue.h
/*
 * Copyright 2009-2024, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _TIMED_EVENT_QUEUE_H
#define _TIMED_EVENT_QUEUE_H


#include <MediaDefs.h>


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();

                        void                            operator=(const media_timed_event& other);

public:
                        bigtime_t                       event_time;
                        int32                           type;
                        void*                           pointer;
                        uint32                          cleanup;
                        int32                           data;
                        int64                           bigdata;
                        char                            user_data[64];

private:
                        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);


namespace BPrivate {
        class TimedEventQueueData;
};

class BTimedEventQueue {
public:
                        enum event_type {
                                B_NO_EVENT = -1,
                                B_ANY_EVENT = 0,

                                B_START,
                                B_STOP,
                                B_SEEK,
                                B_WARP,
                                B_TIMER,
                                B_HANDLE_BUFFER,
                                B_DATA_STATUS,
                                B_HARDWARE,
                                B_PARAMETER,

                                B_USER_EVENT = 0x4000
                        };

                        enum cleanup_flag {
                                B_NO_CLEANUP = 0,
                                B_RECYCLE_BUFFER,
                                B_EXPIRE_TIMER,
                                B_USER_CLEANUP = 0x4000
                        };

                        enum time_direction {
                                B_ALWAYS = -1,
                                B_BEFORE_TIME = 0,
                                B_AT_TIME,
                                B_AFTER_TIME
                        };

public:
                        void*                           operator new(size_t size);
                        void                            operator delete(void* ptr, size_t size);

                                                                BTimedEventQueue();
        virtual                                         ~BTimedEventQueue();

                        typedef void (*cleanup_hook)(const media_timed_event* event,
                                void* context);
                        void                            SetCleanupHook(cleanup_hook hook,
                                                                        void* context);

                        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);

                        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);

                        status_t                        FlushEvents(bigtime_t eventTime,
                                                                        time_direction direction,
                                                                        bool inclusive = true,
                                                                        int32 eventType = B_ANY_EVENT);

private:
        // FBC padding and forbidden methods
        virtual void                            _ReservedTimedEventQueue0();
        virtual void                            _ReservedTimedEventQueue1();
        virtual void                            _ReservedTimedEventQueue2();
        virtual void                            _ReservedTimedEventQueue3();
        virtual void                            _ReservedTimedEventQueue4();
        virtual void                            _ReservedTimedEventQueue5();
        virtual void                            _ReservedTimedEventQueue6();
        virtual void                            _ReservedTimedEventQueue7();
        virtual void                            _ReservedTimedEventQueue8();
        virtual void                            _ReservedTimedEventQueue9();
        virtual void                            _ReservedTimedEventQueue10();
        virtual void                            _ReservedTimedEventQueue11();
        virtual void                            _ReservedTimedEventQueue12();
        virtual void                            _ReservedTimedEventQueue13();
        virtual void                            _ReservedTimedEventQueue14();
        virtual void                            _ReservedTimedEventQueue15();
        virtual void                            _ReservedTimedEventQueue16();
        virtual void                            _ReservedTimedEventQueue17();
        virtual void                            _ReservedTimedEventQueue18();
        virtual void                            _ReservedTimedEventQueue19();
        virtual void                            _ReservedTimedEventQueue20();
        virtual void                            _ReservedTimedEventQueue21();
        virtual void                            _ReservedTimedEventQueue22();
        virtual void                            _ReservedTimedEventQueue23();

                                                                BTimedEventQueue(const BTimedEventQueue&);
                        BTimedEventQueue&       operator=(const BTimedEventQueue&);

private:
        static  int                                     _Match(const media_timed_event& event,
                                                                                 bigtime_t eventTime,
                                                                                 time_direction direction,
                                                                                 bool inclusive, int32 eventType);

private:
                        BPrivate::TimedEventQueueData* fData;

                        uint32                          _reserved[6];
};


#endif