X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fchan_mapping.h;h=ac546e3bbd6000b180ec22db4a20b1c600d307bb;hb=37b90c2a9eecbb97e4bbe16634272849be6b4e9f;hp=ebb7be402a2801d9bebe6259e160c8187df9155b;hpb=23e7cf10191270d70357ccf0ed9294f020c7b7ab;p=ardour.git diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h index ebb7be402a..ac546e3bbd 100644 --- a/libs/ardour/ardour/chan_mapping.h +++ b/libs/ardour/ardour/chan_mapping.h @@ -25,31 +25,95 @@ #include #include +#include "pbd/xml++.h" #include "ardour/data_type.h" #include "ardour/chan_count.h" namespace ARDOUR { -/** A mapping from one set of channels to another - * (e.g. how to 'connect' two BufferSets). +/** A mapping from one set of channels to another. + * The general form is 1 source (from), many sinks (to). + * numeric IDs are used to identify sources and sinks. + * + * for plugins this is used to map "plugin-pin" to "audio-buffer" */ class LIBARDOUR_API ChanMapping { public: ChanMapping() {} ChanMapping(ARDOUR::ChanCount identity); - - uint32_t get(DataType t, uint32_t from, bool* valid); + ChanMapping(const ChanMapping&); + ChanMapping(const XMLNode& node); + + uint32_t get(DataType t, uint32_t from, bool* valid) const; + + /** reverse lookup + * @param type data type + * @param to pin + * @param valid pointer to a boolean. If not NULL it is set to true if the mapping is found, and false otherwise. + * @returns first "from" that matches given "to" + */ + uint32_t get_src(DataType t, uint32_t to, bool* valid) const; + + /** get buffer mapping for given data type and pin + * @param type data type + * @param from numeric source id + * @returns mapped buffer number (or ChanMapping::Invalid) + */ + uint32_t get (DataType t, uint32_t from) const { return get (t, from, NULL); } + + /** set buffer mapping for given data type + * @param type data type + * @param from numeric source id + * @param to buffer + */ void set(DataType t, uint32_t from, uint32_t to); void offset_from(DataType t, int32_t delta); void offset_to(DataType t, int32_t delta); + /** remove mapping + * @param type data type + * @param from numeric source to remove from mapping + */ + void unset(DataType t, uint32_t from); + + /** Test mapping matrix for identity + * @param offset per data-type offset to take into account + * @returns true if the mapping is a channel identity map + */ + bool is_identity (ARDOUR::ChanCount offset = ARDOUR::ChanCount()) const; + + /** Test if this mapping is monotonic (useful to see if inplace processing is feasible) + * @returns true if the map is a strict monotonic set + */ + bool is_monotonic () const; + + uint32_t n_total () const; + + ChanCount count () const; + + XMLNode* state(const std::string& name) const; + + /** Test if this mapping is a subset + * @param superset to test against + * @returns true if all mapping are also present in the superset + */ + bool is_subset (const ChanMapping& superset) const; + typedef std::map TypeMapping; typedef std::map Mappings; Mappings mappings() { return _mappings; } const Mappings mappings() const { return _mappings; } + bool operator==(const ChanMapping& other) const { + return (_mappings == other._mappings); + } + + bool operator!=(const ChanMapping& other) const { + return ! (*this == other); + } + private: Mappings _mappings; };