root/extra_lib/include/avcap/windows/Crossbar.h

/* [<][>][^][v][top][bottom][index][help] */
/*
 * (c) 2005, 2008 Nico Pranke <Nico.Pranke@googlemail.com>, Robin Luedtke <RobinLu@gmx.de> 
 *
 * This file is part of avcap.
 *
 * avcap is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * avcap is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with avcap.  If not, see <http://www.gnu.org/licenses/>.
 */

/* avcap is free for non-commercial use.
 * To use it in commercial endeavors, please contact Nico Pranke <Nico.Pranke@googlemail.com>.
 */


#ifndef CROSSBAR_H_
#define CROSSBAR_H_

#include <DShow.h>

#include "avcap-export.h"

namespace avcap
{
        struct AVCAP_Export STConnector
        {
                std::string NameOfConnector;
                LONG PhysicalType;
                bool IsAudioConnector;
                bool IsVideoConnector;
                bool IsRouted;
        
                IAMCrossbar *Crossbar;
                long PinIndexOfCrossbar;
                int AudioSet; 
                
                /* Video inputs correspond to zero or max. one audio input. 
                 The pins are numbered from 0 to N-1, N <= 32.
                 Each bit set is the index of a audio pin on the 
                 same crossbar corresponding to the selected video pin.
                 AudioSet only used for video input pins. */
        
                int PinIndex; // Independent PinIndex
        };
        
        struct AVCAP_Export STRouting
        {
                long OutputPinIndex;
                IPin *OutputPin;
                long RelatedInPinIndex;
                IPin *RelatedInputPin;
                IAMCrossbar *Crossbar;
                int CrossbarIndex; // Zero based index
                bool HasConnector;
        };
        
        //! A class for controlling DirectShow video crossbars.
        
        /*! This class creates a single object which encapsulates all connected
         *      crossbars, enumerates all unique inputs which can be reached from
         *  a given starting downstream filter.
         *  
         *  The class supports an arbitrarily complex graph of crossbars, 
         *  which can be cascaded and disjoint, that is not all inputs need 
         *  to traverse the same set of crossbars.
         *  
         *  Given a starting filter (typically the capture filter), the class 
         *  recursively traces upstream searching for all viable inputs.  
         *  An input is considered viable if it is either: 
         * 
         *  - unconnected
         *  - connects to a DirectShow filter which does not support IAMCrossbar 
         * COM-Interface.       
         * */
        
        class AVCAP_Export CCrossbar
        {
        public:
                CCrossbar(ICaptureGraphBuilder2 *CaptureGraphBuilder);
                ~CCrossbar(void);
        
                /*! Searches upstrean for all available crossbars in the filter graph, 
                 * starting from a given filter.
                 * \param StartFilter Filter to start search from.
                 * \return The number of crossbars found in the filter graph, -1 else. */
                int FindAllCrossbarsAndConnectors(IBaseFilter *StartFilter);
                std::list<STConnector*>& GetInputConnectorList();
        
                /*! Gets the currently selected video input connector.
                 * \param Connector Connector data */
                bool GetCurrentVideoInput(STConnector *Connector);
        
                /*! Gets the currently selected audio input connector.
                 * \param Connector Connector data */
                bool GetCurrentAudioInput(STConnector *Connector);
        
                /*! Sets the input connector.
                 * \param PinIndex Pin index */
                bool SetInput(int PinIndex);
        
        private:
                QzCComPtr<ICaptureGraphBuilder2> m_CaptureBuilder;
                std::list<IAMCrossbar*> m_CrossbarList;
                std::list<STRouting*> m_RoutingList;
                std::list<STConnector*> m_InputConnectorList;
        
                HRESULT GetCrossbarIPinAtIndex(IAMCrossbar *pXbar, LONG PinIndex,
                                BOOL IsInputPin, IPin ** ppPin);
                void StringFromPinType(std::string &PinName, long lType);
                void DeleteAllLists();
        };
}

#endif // CROSSBAR_H_

/* [<][>][^][v][top][bottom][index][help] */