root/headers/os/media/ParameterWeb.h
/*
 * Copyright 2009, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT license.
 */
#ifndef _CONTROL_WEB_H
#define _CONTROL_WEB_H


#include <Flattenable.h>
#include <MediaDefs.h>
#include <MediaNode.h>
#include <TypeConstants.h>


// Parameter Kinds

extern const char* const B_GENERIC;

// slider controls
extern const char* const B_MASTER_GAIN;
extern const char* const B_GAIN;
extern const char* const B_BALANCE;
extern const char* const B_FREQUENCY;
extern const char* const B_LEVEL;
extern const char* const B_SHUTTLE_SPEED;
extern const char* const B_CROSSFADE;           // 0-100 (first - second)
extern const char* const B_EQUALIZATION;        // dB

// compression controls
extern const char* const B_COMPRESSION;
extern const char* const B_QUALITY;
extern const char* const B_BITRATE;                     // bits/s
extern const char* const B_GOP_SIZE;

// selector controls
extern const char* const B_MUTE;
extern const char* const B_ENABLE;
extern const char* const B_INPUT_MUX;
extern const char* const B_OUTPUT_MUX;
extern const char* const B_TUNER_CHANNEL;
extern const char* const B_TRACK;
extern const char* const B_RECSTATE;
extern const char* const B_SHUTTLE_MODE;
extern const char* const B_RESOLUTION;
extern const char* const B_COLOR_SPACE;
extern const char* const B_FRAME_RATE;
extern const char* const B_VIDEO_FORMAT;
        // 1 = NTSC-M, 2 = NTSC-J, 3 = PAL-BDGHI, 4 = PAL-M, 5 = PAL-N, 6 = SECAM,
        // 7 = MPEG-1, 8 = MPEG-2

// junction controls
extern const char* const B_WEB_PHYSICAL_INPUT;
extern const char* const B_WEB_PHYSICAL_OUTPUT;
extern const char* const B_WEB_ADC_CONVERTER;
extern const char* const B_WEB_DAC_CONVERTER;
extern const char* const B_WEB_LOGICAL_INPUT;
extern const char* const B_WEB_LOGICAL_OUTPUT;
extern const char* const B_WEB_LOGICAL_BUS;
extern const char* const B_WEB_BUFFER_INPUT;
extern const char* const B_WEB_BUFFER_OUTPUT;

// transport control
extern const char* const B_SIMPLE_TRANSPORT;
        // 0-4: rewind, stop, play, pause, fast-forward

class BContinuousParameter;
class BDiscreteParameter;
class BList;
class BNullParameter;
class BParameter;
class BParameterGroup;
class BTextParameter;

// Parameter flags for influencing Media Themes
enum media_parameter_flags {
        B_HIDDEN_PARAMETER              = 1,
        B_ADVANCED_PARAMETER    = 2
};

class BParameterWeb : public BFlattenable {
public:
                                                                BParameterWeb();
                                                                ~BParameterWeb();

                        media_node                      Node();

                        BParameterGroup*        MakeGroup(const char* name);
                        int32                           CountGroups();
                        BParameterGroup*        GroupAt(int32 index);

                        int32                           CountParameters();
                        BParameter*                     ParameterAt(int32 index);

        // BFlattenable implementation
        virtual bool                            IsFixedSize() const;
        virtual type_code                       TypeCode() const;
        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual bool                            AllowsTypeCode(type_code code) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BParameterGroup;
        friend class BControllable;

                                                                BParameterWeb(const BParameterWeb& other);
                        BParameterWeb&          operator=(const BParameterWeb& other);

        // reserved
        virtual status_t                        _Reserved_ControlWeb_0(void*);
        virtual status_t                        _Reserved_ControlWeb_1(void*);
        virtual status_t                        _Reserved_ControlWeb_2(void*);
        virtual status_t                        _Reserved_ControlWeb_3(void*);
        virtual status_t                        _Reserved_ControlWeb_4(void*);
        virtual status_t                        _Reserved_ControlWeb_5(void*);
        virtual status_t                        _Reserved_ControlWeb_6(void*);
        virtual status_t                        _Reserved_ControlWeb_7(void*);

                        void                            AddRefFix(void* oldItem, void* newItem);

private:
                        BList*                          fGroups;
                        media_node                      fNode;
                        uint32                          _reserved[8];
                        BList*                          fOldRefs;
                        BList*                          fNewRefs;
};


class BParameterGroup : public BFlattenable {
private:
                                                                BParameterGroup(BParameterWeb* web,
                                                                        const char* name);
        virtual                                         ~BParameterGroup();

public:
                        BParameterWeb*          Web() const;
                        const char*                     Name() const;

                        void                            SetFlags(uint32 flags);
                        uint32                          Flags() const;

                        BNullParameter*         MakeNullParameter(int32 id, media_type type,
                                                                        const char* name, const char* kind);
                        BContinuousParameter* MakeContinuousParameter(int32 id,
                                                                        media_type type, const char* name,
                                                                        const char* kind, const char* unit,
                                                                        float min, float max, float step);
                        BDiscreteParameter*     MakeDiscreteParameter(int32 id, media_type type,
                                                                        const char* name, const char* kind);
                        BTextParameter*         MakeTextParameter(int32 id, media_type type,
                                                                        const char* name, const char* kind,
                                                                        size_t maxBytes);

                        BParameterGroup*        MakeGroup(const char* name);

                        int32                           CountParameters();
                        BParameter*                     ParameterAt(int32 index);

                        int32                           CountGroups();
                        BParameterGroup*        GroupAt(int32 index);

        // BFlattenable implementation
        virtual bool                            IsFixedSize() const;
        virtual type_code                       TypeCode() const;
        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual bool                            AllowsTypeCode(type_code code) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BParameterWeb;

                                                                BParameterGroup();
                                                                BParameterGroup(const BParameterGroup& other);
                        BParameterGroup&        operator=(const BParameterGroup& other);

                        BParameter*                     MakeControl(int32 type);

        // reserved
        virtual status_t                        _Reserved_ControlGroup_0(void*);
        virtual status_t                        _Reserved_ControlGroup_1(void*);
        virtual status_t                        _Reserved_ControlGroup_2(void*);
        virtual status_t                        _Reserved_ControlGroup_3(void*);
        virtual status_t                        _Reserved_ControlGroup_4(void*);
        virtual status_t                        _Reserved_ControlGroup_5(void*);
        virtual status_t                        _Reserved_ControlGroup_6(void*);
        virtual status_t                        _Reserved_ControlGroup_7(void*);

private:
                        BParameterWeb*          fWeb;
                        BList*                          fControls;
                        BList*                          fGroups;
                        char*                           fName;
                        uint32                          fFlags;
                        uint32                          _reserved[7];
};


class BParameter : public BFlattenable {
public:
        enum media_parameter_type {
                B_NULL_PARAMETER,
                B_DISCRETE_PARAMETER,
                B_CONTINUOUS_PARAMETER,
                B_TEXT_PARAMETER
        };

                        media_parameter_type Type() const;
                        BParameterWeb*          Web() const;
                        BParameterGroup*        Group() const;
                        const char*                     Name() const;
                        const char*                     Kind() const;
                        const char*                     Unit() const;
                        int32                           ID() const;
                        
                        void                            SetFlags(uint32 flags);
                        uint32                          Flags() const;
        
        virtual type_code                       ValueType() = 0;
        
                        status_t                        GetValue(void* buffer, size_t* _size,
                                                                        bigtime_t* _when);
                        status_t                        SetValue(const void* buffer, size_t size,
                                                                        bigtime_t when);

                        int32                           CountChannels();
                        void                            SetChannelCount(int32 count);

                        media_type                      MediaType();
                        void                            SetMediaType(media_type type);

                        int32                           CountInputs();
                        BParameter*                     InputAt(int32 index);
                        void                            AddInput(BParameter* input);

                        int32                           CountOutputs();
                        BParameter*                     OutputAt(int32 index);
                        void                            AddOutput(BParameter* output);

        // BFlattenable implementation
        virtual bool                            IsFixedSize() const;
        virtual type_code                       TypeCode() const;
        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual bool                            AllowsTypeCode(type_code code) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BNullParameter;
        friend class BContinuousParameter;
        friend class BDiscreteParameter;
        friend class BTextParameter;
        friend class BParameterGroup;
        friend class BParameterWeb;

                                                                BParameter(int32 id, media_type mediaType,
                                                                        media_parameter_type type,
                                                                        BParameterWeb* web, const char* name,
                                                                        const char* kind, const char* unit);
                                                                ~BParameter();

        // reserved
        virtual status_t                        _Reserved_Control_0(void*);
        virtual status_t                        _Reserved_Control_1(void*);
        virtual status_t                        _Reserved_Control_2(void*);
        virtual status_t                        _Reserved_Control_3(void*);
        virtual status_t                        _Reserved_Control_4(void*);
        virtual status_t                        _Reserved_Control_5(void*);
        virtual status_t                        _Reserved_Control_6(void*);
        virtual status_t                        _Reserved_Control_7(void*);

                        bool                            SwapOnUnflatten() { return fSwapDetected; }
        virtual void                            FixRefs(BList& old, BList& updated);

private:
                        int32                           fID;
                        media_parameter_type fType;
                        BParameterWeb*          fWeb;
                        BParameterGroup*        fGroup;
                        char*                           fName;
                        char*                           fKind;
                        char*                           fUnit;
                        BList*                          fInputs;
                        BList*                          fOutputs;
                        bool                            fSwapDetected;
                        media_type                      fMediaType;
                        int32                           fChannels;
                        uint32                          fFlags;

                        uint32                          _reserved[7];
};


class BContinuousParameter : public BParameter {
public:
        enum response {
                B_UNKNOWN = 0,
                B_LINEAR,
                B_POLYNOMIAL,
                B_EXPONENTIAL,
                B_LOGARITHMIC
        };

        virtual type_code                       ValueType();

                        float                           MinValue();
                        float                           MaxValue();
                        float                           ValueStep();

                        void                            SetResponse(int response, float factor,
                                                                        float offset);
                        void                            GetResponse(int* _response, float* factor,
                                                                        float* offset);

        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BParameterGroup;

                                                                BContinuousParameter(int32 id,
                                                                        media_type mediaType,
                                                                        BParameterWeb* web, const char* name,
                                                                        const char* kind, const char* unit,
                                                                        float min, float max, float step);
                                                                ~BContinuousParameter();

        // reserved
        virtual status_t                        _Reserved_ContinuousParameter_0(void*);
        virtual status_t                        _Reserved_ContinuousParameter_1(void*);
        virtual status_t                        _Reserved_ContinuousParameter_2(void*);
        virtual status_t                        _Reserved_ContinuousParameter_3(void*);
        virtual status_t                        _Reserved_ContinuousParameter_4(void*);
        virtual status_t                        _Reserved_ContinuousParameter_5(void*);
        virtual status_t                        _Reserved_ContinuousParameter_6(void*);
        virtual status_t                        _Reserved_ContinuousParameter_7(void*);

private:
                        float                           fMinimum;
                        float                           fMaximum;
                        float                           fStepping;
                        response                        fResponse;
                        float                           fFactor;
                        float                           fOffset;
                        
                        uint32                          _reserved[8];
};


class BDiscreteParameter : public BParameter {
public:
        virtual type_code                       ValueType();

                        int32                           CountItems();
                        const char*                     ItemNameAt(int32 index);
                        int32                           ItemValueAt(int32 index);
                        status_t                        AddItem(int32 value, const char* name);

                        status_t                        MakeItemsFromInputs();
                        status_t                        MakeItemsFromOutputs();

                        void                            MakeEmpty();

        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BParameterGroup;

                                                                BDiscreteParameter(int32 id,
                                                                        media_type mediaType,
                                                                        BParameterWeb* web, const char* name,
                                                                        const char* kind);
                                                                ~BDiscreteParameter();

        // reserved
        virtual status_t                        _Reserved_DiscreteParameter_0(void*);
        virtual status_t                        _Reserved_DiscreteParameter_1(void*);
        virtual status_t                        _Reserved_DiscreteParameter_2(void*);
        virtual status_t                        _Reserved_DiscreteParameter_3(void*);
        virtual status_t                        _Reserved_DiscreteParameter_4(void*);
        virtual status_t                        _Reserved_DiscreteParameter_5(void*);
        virtual status_t                        _Reserved_DiscreteParameter_6(void*);
        virtual status_t                        _Reserved_DiscreteParameter_7(void*);

private:
                        BList*                          fSelections;
                        BList*                          fValues;
                        
                        uint32                          _reserved[8];
};


class BTextParameter : public BParameter {
public:
        virtual type_code                       ValueType();

                        size_t                          MaxBytes() const;

        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BParameterGroup;

                                                                BTextParameter(int32 id,
                                                                        media_type mediaType,
                                                                        BParameterWeb* web, const char* name,
                                                                        const char* kind, size_t maxBytes);
                                                                ~BTextParameter();

        // reserved
        virtual status_t                        _Reserved_TextParameter_0(void*);
        virtual status_t                        _Reserved_TextParameter_1(void*);
        virtual status_t                        _Reserved_TextParameter_2(void*);
        virtual status_t                        _Reserved_TextParameter_3(void*);
        virtual status_t                        _Reserved_TextParameter_4(void*);
        virtual status_t                        _Reserved_TextParameter_5(void*);
        virtual status_t                        _Reserved_TextParameter_6(void*);
        virtual status_t                        _Reserved_TextParameter_7(void*);

private:
                        uint32                          fMaxBytes;
                        
                        uint32                          _reserved[8];
};


class BNullParameter : public BParameter {
public:
        virtual type_code                       ValueType();

        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual status_t                        Unflatten(type_code code, const void* buffer,
                                                                        ssize_t size);

private:
        friend class BParameterGroup;

                                                                BNullParameter(int32 id,
                                                                        media_type mediaType,
                                                                        BParameterWeb* web, const char* name,
                                                                        const char* kind);
                                                                ~BNullParameter();

        // reserved
        virtual status_t                        _Reserved_NullParameter_0(void*);
        virtual status_t                        _Reserved_NullParameter_1(void*);
        virtual status_t                        _Reserved_NullParameter_2(void*);
        virtual status_t                        _Reserved_NullParameter_3(void*);
        virtual status_t                        _Reserved_NullParameter_4(void*);
        virtual status_t                        _Reserved_NullParameter_5(void*);
        virtual status_t                        _Reserved_NullParameter_6(void*);
        virtual status_t                        _Reserved_NullParameter_7(void*);

private:
                        uint32                          _reserved[8];
};


#endif  // _CONTROL_WEB_H