root/headers/private/media/experimental/MediaClientDefs.h
/*
 * Copyright 2015-2018, Dario Casalinuovo. All rights reserved.
 * Distributed under the terms of the MIT License.
 */

#ifndef _MEDIA_CLIENT_DEFS_H
#define _MEDIA_CLIENT_DEFS_H

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


namespace BPrivate { namespace media {


typedef int64 media_client_id;
typedef int64 media_connection_id;

typedef uint64 media_client_kinds;
typedef uint64 media_connection_kinds;


enum media_client_kind {
        // The client can receive media data.
        B_MEDIA_RECORDER                = 0x000000001,
        // The client can send media data to another client.
        B_MEDIA_PLAYER                  = 0x000000002,
        // The client specify a control GUI which can be used to configure it.
        B_MEDIA_CONTROLLABLE    = 0x000000004
};

enum media_connection_kind {
        B_MEDIA_INPUT = 0,
        B_MEDIA_OUTPUT = 1
};


typedef struct media_client {
        media_client_id                         Id() const;
        media_client_kinds                      Kinds() const;

        BMessage*                                       ToMessage();

private:
        media_client_kinds                      kinds;

        media_node                                      node;
        uint32                                          padding[16];

        friend class BMediaClient;
        friend class BMediaConnection;
        friend struct media_connection;
} media_client;


typedef struct media_connection {
        media_connection_id                     Id() const;
        media_connection_kinds          Kinds() const;

        const media_client&                     Client() const;

        const char*                                     Name() const;

        bool                                            IsInput() const;
        bool                                            IsOutput() const;

        BMessage*                                       ToMessage() const;

private:
        // NOTE: We are doing this on purpose to avoid redundancy we
        // want to build the input/output on the fly. In pratice, the
        // only thing that can change is the format which is kept updated
        // to reflect the current status of this connection.
        media_input                                     _BuildMediaInput() const;
        media_output                            _BuildMediaOutput() const;

        media_node                                      _Node() const;

        media_connection_id                     id;

        media_client                            client;

        media_node                                      remote_node;

    media_source                                source;
    media_destination                   destination;

    // This format always reflect the most updated format depending
    // on the connection phase.
    media_format                                format;
    char                                                name[B_MEDIA_NAME_LENGTH];

        media_connection_kinds          kinds;
        uint32                                          padding[16];

        friend class BMediaClient;
        friend class BMediaClientNode;
        friend class BMediaConnection;
        friend class BMediaInput;
        friend class BMediaOutput;
} media_connection;


}

}

using namespace BPrivate::media;

#endif