예제 #1
0
        // --------------------------- Private methods ----------------------------

        /// <summary> Retrieve the friendly name of a connectorType. </summary>
        private string getName(IPin pin)
        {
            string  s       = "Unknown pin";
            PinInfo pinInfo = new PinInfo();

            // Direction matches, so add pin name to listbox
            int hr = pin.QueryPinInfo(out pinInfo);

            if (hr == 0)
            {
                s = pinInfo.name + "";
            }
            else
            {
                Marshal.ThrowExceptionForHR(hr);
            }

            // The pininfo structure contains a reference to an IBaseFilter,
            // so you must release its reference to prevent resource a leak.
            if (pinInfo.filter != null)
            {
                Marshal.ReleaseComObject(pinInfo.filter);
            }
            pinInfo.filter = null;

            return(s);
        }
예제 #2
0
 /// <summary>
 /// Meldet Informationen zu diesem Endpunkt.
 /// </summary>
 /// <param name="info">Die gewünschten Informationen.</param>
 public void QueryPinInfo(ref PinInfo info)
 {
     // Create new
     info.Direction = PinDirection.Output;
     info.Filter    = m_Filter.AddRef();
     info.Name      = QueryId();
 }
예제 #3
0
파일: PinCache.cs 프로젝트: uilit/BuildXL
        /// <summary>
        /// Sets the cached pin information
        /// </summary>
        public void SetPinInfo(ContentHash hash, TimeSpan timeToLive)
        {
            if (timeToLive <= TimeSpan.Zero)
            {
                Invalidate(hash);
                return;
            }

            var expiryTime = _clock.UtcNow + timeToLive;
            var pinInfo    = new PinInfo(expiryTime);

            if (_cachedPins.TryAdd(hash, pinInfo))
            {
                // Only add to the garbage collection queue if the hash is newly added
                _garbageCollectionQueue.Enqueue(hash);
            }
            else
            {
                _cachedPins[hash] = pinInfo;
            }

            // Attempt to clean up a stale hash. This supplements the remove if expired logic which
            // would never clean up hashes if they are not pinned again.
            CleanStaleHashes(dequeueCount: 1);
        }
예제 #4
0
        /// <summary>Возвращает удобное для чтения имя коннектора. </summary>
        private string getName(IPin pin)
        {
            string  s       = "Unknown pin";
            PinInfo pinInfo = new PinInfo();

            // Direction matches, so add pin name to listbox
            int hr = pin.QueryPinInfo(out pinInfo);

            if (hr == 0)
            {
                s = pinInfo.name + "";
            }
            else
            {
                Marshal.ThrowExceptionForHR(hr);
            }

            //Структура PinInfo содержит ссылку на IBaseFilter, поэтому необходимо освободить ее, чтобы предотвратить утечку
            if (pinInfo.filter != null)
            {
                Marshal.ReleaseComObject(pinInfo.filter);
            }
            pinInfo.filter = null;
            return(s);
        }
        /// <summary>
        /// 将继电器或接触器的端子映射信息转换为实体类
        /// </summary>
        public List <PinInfo> getRelayPins(DataTable table)
        {
            List <PinInfo> rst = new List <PinInfo>();

            for (int i = 0; i < table.Rows.Count; i++)
            {
                string mtrlNum = table.Rows[i][NamesManage.CptNumber].ToString().Trim();
                var    pin     = rst.Find(p => p.MaterialNum == mtrlNum);
                if (pin == null)
                {
                    PinInfo pinfo = new PinInfo();
                    pinfo.MaterialNum = mtrlNum;
                    pinfo.Model       = table.Rows[i][NamesManage.Model].ToString().Trim();
                    pinfo.Pin1        = table.Rows[i][NamesManage.CoilPo].ToString().Trim();
                    pinfo.Pin2        = table.Rows[i][NamesManage.CoilNe].ToString().Trim();
                    pin = pinfo;
                    rst.Add(pinfo);
                }
                string nccom = table.Rows[i][NamesManage.NcCom].ToString().Trim();
                string nc    = table.Rows[i][NamesManage.Nc].ToString().Trim();
                if (!string.IsNullOrEmpty(nccom) && !string.IsNullOrEmpty(nc))
                {
                    pin.NcPin.Add(nccom, nc);
                }
                string nocom = table.Rows[i][NamesManage.NoCom].ToString().Trim();
                string no    = table.Rows[i][NamesManage.No].ToString().Trim();
                if (!string.IsNullOrEmpty(nocom) && !string.IsNullOrEmpty(no))
                {
                    pin.NoPin.Add(nocom, no);
                }
            }
            return(rst);
        }
예제 #6
0
        protected void RenderAudio(PinInfo pinInfo, AMMediaType mediaType)
        {
            int hr;

            try
            {
                if (mediaType.subType == MediaSubType.PCM)
                {
                    if (mediaType.formatType == FormatType.WaveEx)
                    {
                        _audioResamplerFilter = AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, "Elecard Audio Resampler");
                        _audioRenderFilter    = AddFilterByName(_graphBuilder, FilterCategory.AudioRendererCategory, "Default DirectSound Device");
                        ConnectFilters(_graphBuilder, _netSrc, pinInfo.name, _audioResamplerFilter, "Input", true);
                        ConnectFilters(_graphBuilder, _audioResamplerFilter, "Output", _audioRenderFilter, "Audio Input pin (rendered)", true);
                    }
                }
                else if (mediaType.subType == new Guid("000000FF-0000-0010-8000-00AA00389B71")) // AAC Audio
                {
                    _audioDecoderFilter = AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, "LEAD AAC Decoder");
                    _audioRenderFilter  = AddFilterByName(_graphBuilder, FilterCategory.AudioRendererCategory, "Default DirectSound Device");
                    ConnectFilters(_graphBuilder, _netSrc, pinInfo.name, _audioDecoderFilter, "XForm In", true);
                    ConnectFilters(_graphBuilder, _audioDecoderFilter, "XForm Out", _audioRenderFilter, "Audio Input pin (rendered)", true);
                }
            }
            finally
            {
            }
        }
예제 #7
0
 public void BeginEdit()
 {
     if (this.backup == null)
     {
         this.backup = this.MemberwiseClone() as PinInfo;
     }
 }
예제 #8
0
        /// <summary>
        /// Retrieves what pin is connected to.
        /// </summary>
        /// <returns>Returns <see cref="BaseFilter"/> instance if pin is connected; elsewhere returns <b>null</b>.</returns>
        public BaseFilter ConnectedToFilter()
        {
            var other = ConnectedTo();

            if (other != null)
            {
                var        info   = new PinInfo();
                BaseFilter result = null;
                try
                {
                    if (other.Object.QueryPinInfo(out info) == 0)
                    {
                        result = new BaseFilter(info.filter);
                    }
                }
                finally
                {
                    DsUtils.FreePinInfo(info);
                }

                return(result);
            }

            return(null);
        }
예제 #9
0
 /// <summary>
 /// Beschreibt diesen Endpunkt.
 /// </summary>
 /// <param name="info">Die gewünschte Beschreibung.</param>
 public void QueryPinInfo(ref PinInfo info)
 {
     // Fill the rest
     info.Direction = PinDirection.Input;
     info.Filter    = m_Filter.AddRef();
     info.Name      = QueryId();
 }
예제 #10
0
 public int QueryPinInfo(out PinInfo pInfo)
 {
     pInfo        = new PinInfo();
     pInfo.filter = (IBaseFilter)_Filter;
     pInfo.dir    = _Direction;
     pInfo.name   = _Name;
     return((int)HRESULT.S_OK);
 }
예제 #11
0
 /// <summary>
 ///  Free the nested interfaces within a PinInfo structure.
 /// </summary>
 public static void FreePinInfo(PinInfo pinInfo)
 {
     if (pinInfo.filter != null)
     {
         Marshal.ReleaseComObject(pinInfo.filter);
         pinInfo.filter = null;
     }
 }
예제 #12
0
 public Pin(PinInfo info)
 {
     Position  = info.Position;
     AreaId    = info.AreaId;
     CreatorId = info.CreatorId;
     Type      = info.Type;
     Name      = info.Name;
 }
예제 #13
0
            int IPin.QueryPinInfo(out PinInfo pInfo)
            {
                pInfo.dir    = PinDirection.Output;
                pInfo.filter = filter;
                pInfo.name   = name;

                return(S_OK);
            }
예제 #14
0
        protected void removeDownstream(IBaseFilter filter, bool removeFirstFilter)
        {
            // Get a pin enumerator off the filter
            IEnumPins pinEnum;
            int       hr = filter.EnumPins(out pinEnum);

            pinEnum.Reset();
            if ((hr == 0) && (pinEnum != null))
            {
                // Loop through each pin
                IPin[] pins = new IPin[1];
                int    f;
                do
                {
                    // Get the next pin
                    hr = pinEnum.Next(1, pins, out f);
                    if ((hr == 0) && (pins[0] != null))
                    {
                        // Get the pin it is connected to
                        IPin pinTo = null;
                        pins[0].ConnectedTo(out pinTo);
                        if (pinTo != null)
                        {
                            // Is this an input pin?
                            PinInfo info = new PinInfo();
                            hr = pinTo.QueryPinInfo(out info);
                            if ((hr == 0) && (info.dir == (PinDirection.Input)))
                            {
                                // Recurse down this branch
                                removeDownstream(info.filter, true);

                                // Disconnect
                                graphBuilder.Disconnect(pinTo);
                                graphBuilder.Disconnect(pins[0]);

                                // Remove this filter
                                // but don't remove the video or audio compressors
                                if ((info.filter != videoCompressorFilter) &&
                                    (info.filter != audioCompressorFilter))
                                {
                                    graphBuilder.RemoveFilter(info.filter);
                                }
                            }
                            Marshal.ReleaseComObject(info.filter);
                            Marshal.ReleaseComObject(pinTo);
                        }
                        Marshal.ReleaseComObject(pins[0]);
                    }
                }while (hr == 0);

                Marshal.ReleaseComObject(pinEnum);
                pinEnum = null;
            }
        }
예제 #15
0
    private void Randomize(PinInfo pinTumbler)
    {
        float x = Random.Range(minWidth, maxWidth);

        while (tooClose(x))
        {
            x = Random.Range(minWidth, maxWidth);
        }

        pinTumbler.Width = x;
    }
예제 #16
0
        private static IPin t最初の入力ピンを探して返す(IBaseFilter baseFilter)
        {
            int hr = 0;

            IPin firstInputPin = null;

            IEnumPins ePins;

            hr = baseFilter.EnumPins(out ePins);
            DsError.ThrowExceptionForHR(hr);
            try
            {
                var pins = new IPin[1];
                while (ePins.Next(1, pins, IntPtr.Zero) == CWin32.S_OK)
                {
                    PinInfo pinfo = new PinInfo()
                    {
                        filter = null
                    };
                    try
                    {
                        hr = pins[0].QueryPinInfo(out pinfo);
                        DsError.ThrowExceptionForHR(hr);

                        if (pinfo.dir == PinDirection.Input)
                        {
                            firstInputPin = pins[0];
                            break;
                        }
                    }
                    finally
                    {
                        if (pinfo.filter != null)
                        {
                            CCommon.tReleaseComObject(ref pinfo.filter);
                        }
                        DsUtils.FreePinInfo(pinfo);

                        if (firstInputPin == null)
                        {
                            CCommon.tReleaseComObject(ref pins[0]);
                        }
                    }
                }
            }
            finally
            {
                CCommon.tReleaseComObject(ref ePins);
            }

            return(firstInputPin);
        }
예제 #17
0
        private IPin GetPin(IBaseFilter filter, string name)
        {
            filter.EnumPins(out IEnumPins enumPins);
            IntPtr ptr = IntPtr.Zero;

            IPin[] pin = new IPin[1];
            while (true)
            {
                enumPins.Next(1, pin, ptr);
                var pinInfo = new PinInfo();
                pin[0].QueryPinInfo(out pinInfo);
                if (pinInfo.name == name)
                {
                    return(pin[0]);
                }
            }
        }
예제 #18
0
        protected void removeDownstream(IBaseFilter filter, bool removeFirstFilter)
        {
            IEnumPins pins;
            int       num = filter.EnumPins(out pins);

            pins.Reset();
            if ((num == 0) && (pins != null))
            {
                IPin[] ppPins = new IPin[1];
                do
                {
                    int num2;
                    num = pins.Next(1, ppPins, out num2);
                    if ((num == 0) && (ppPins[0] != null))
                    {
                        IPin ppPin = null;
                        ppPins[0].ConnectedTo(out ppPin);
                        if (ppPin != null)
                        {
                            PinInfo pInfo = new PinInfo();
                            num = ppPin.QueryPinInfo(out pInfo);
                            if ((num == 0) && (pInfo.dir == PinDirection.Input))
                            {
                                this.removeDownstream(pInfo.filter, true);
                                this.graphBuilder.Disconnect(ppPin);
                                this.graphBuilder.Disconnect(ppPins[0]);
                                if ((pInfo.filter != this.videoCompressorFilter) && (pInfo.filter != this.audioCompressorFilter))
                                {
                                    this.graphBuilder.RemoveFilter(pInfo.filter);
                                }
                            }
                            Marshal.ReleaseComObject(pInfo.filter);
                            Marshal.ReleaseComObject(ppPin);
                        }
                        Marshal.ReleaseComObject(ppPins[0]);
                    }
                }while (num == 0);
                Marshal.ReleaseComObject(pins);
                pins = null;
            }
        }
예제 #19
0
파일: Capture.cs 프로젝트: zha0/Cerberus
        // Token: 0x06000193 RID: 403 RVA: 0x00011B14 File Offset: 0x0000FD14
        protected void removeDownstream(IBaseFilter filter, bool removeFirstFilter)
        {
            IEnumPins enumPins;
            int       num = filter.EnumPins(out enumPins);

            enumPins.Reset();
            if (num == 0 && enumPins != null)
            {
                IPin[] array = new IPin[1];
                do
                {
                    int num2;
                    num = enumPins.Next(1, array, out num2);
                    if (num == 0 && array[0] != null)
                    {
                        IPin pin = null;
                        array[0].ConnectedTo(out pin);
                        if (pin != null)
                        {
                            PinInfo pinInfo = default(PinInfo);
                            num = pin.QueryPinInfo(out pinInfo);
                            if (num == 0 && pinInfo.dir == PinDirection.Input)
                            {
                                this.removeDownstream(pinInfo.filter, true);
                                this.graphBuilder.Disconnect(pin);
                                this.graphBuilder.Disconnect(array[0]);
                                if (pinInfo.filter == this.videoCompressorFilter && pinInfo.filter == this.audioCompressorFilter)
                                {
                                    this.graphBuilder.RemoveFilter(pinInfo.filter);
                                }
                            }
                            Marshal.ReleaseComObject(pinInfo.filter);
                            Marshal.ReleaseComObject(pin);
                        }
                        Marshal.ReleaseComObject(array[0]);
                    }
                }while (num == 0);
                Marshal.ReleaseComObject(enumPins);
                enumPins = null;
            }
        }
예제 #20
0
        private string getName(IPin pin)
        {
            string  str       = "Unknown pin";
            PinInfo pInfo     = new PinInfo();
            int     errorCode = pin.QueryPinInfo(out pInfo);

            if (errorCode == 0)
            {
                str = pInfo.name ?? "";
            }
            else
            {
                Marshal.ThrowExceptionForHR(errorCode);
            }
            if (pInfo.filter != null)
            {
                Marshal.ReleaseComObject(pInfo.filter);
            }
            pInfo.filter = null;
            return(str);
        }
예제 #21
0
        private IPin GetPin(IBaseFilter filter, Func <PinInfo, bool> pred)
        {
            IEnumPins enumPins;
            var       retVal = filter.EnumPins(out enumPins);

            IPin[] pins = new IPin[1];
            int    fetched;

            while ((retVal = enumPins.Next(1, pins, out fetched)) == 0)
            {
                if (fetched > 0)
                {
                    PinInfo info = new PinInfo();
                    retVal = pins[0].QueryPinInfo(info);
                    if (retVal == 0 && pred(info))
                    {
                        return(pins[0]);
                    }
                }
            }

            return(null);
        }
예제 #22
0
        private void OnMapElementClick(MapControl sender, MapElementClickEventArgs args)
        {
            CloseWindows();

            var element = args.MapElements.FirstOrDefault(el => el is MapIcon icon && icon.Title != "I");

            if (element == null)
            {
                return;
            }

            var pinInfo = new PinInfo(element as MapIcon);

            pinInfo.Clicked += OnActionSelected;
            var position = new BasicGeoposition
            {
                Latitude  = args.Location.Position.Latitude,
                Longitude = args.Location.Position.Longitude
            };

            AddWindow(pinInfo, position);

            _iconClicked = true;
        }
예제 #23
0
 public void BeginEdit()
 {
     if (this.backup == null)
         this.backup = this.MemberwiseClone() as PinInfo;
 }
예제 #24
0
 public void EndEdit()
 {
     this.backup = null;
 }
예제 #25
0
 public void CancelEdit()
 {
     this.Name   = this.backup.Name;
     this.Type   = this.backup.Type;
     this.backup = null;
 }
예제 #26
0
 public void EndEdit()
 {
     this.backup = null;
 }
예제 #27
0
		/// <summary>
		///  Removes all filters downstream from a filter from the graph.
		///  This is called only by derenderGraph() to remove everything
		///  from the graph except the devices and compressors. The parameter
		///  "removeFirstFilter" is used to keep a compressor (that should
		///  be immediately downstream of the device) if one is begin used.
		/// </summary>
		protected void removeDownstream( IBaseFilter filter, bool removeFirstFilter )
		{
			// Get a pin enumerator off the filter
			IEnumPins pinEnum;
			int hr = filter.EnumPins( out pinEnum );
			pinEnum.Reset();
			if( (hr == 0) && (pinEnum != null) )
			{
				// Loop through each pin
				IPin[] pins = new IPin[1];
#if VS2003 || DSHOWNET
				int f;
#else
                IntPtr f = IntPtr.Zero;
#endif
				do
				{
					// Get the next pin

#if VS2003 || DSHOWNET
					hr = pinEnum.Next( 1, pins, out f );
#else
                    hr = pinEnum.Next(1, pins, f);
#endif
					if( (hr == 0) && (pins[0] != null) )
					{
						// Get the pin it is connected to
						IPin pinTo = null;
						pins[0].ConnectedTo( out pinTo );
						if ( pinTo != null )
						{
							// Is this an input pin?
							PinInfo info = new PinInfo();
							hr = pinTo.QueryPinInfo( out info );
							if( (hr == 0) && (info.dir == (PinDirection.Input)) )
							{
								// Recurse down this branch
								removeDownstream( info.filter, true );

								// Disconnect 
								graphBuilder.Disconnect( pinTo );
								graphBuilder.Disconnect( pins[0] );

								// Remove this filter
								// but don't remove the video or audio compressors
								if ( ( info.filter != videoCompressorFilter ) &&
									 ( info.filter != audioCompressorFilter ) )
									graphBuilder.RemoveFilter( info.filter );
							}
							Marshal.ReleaseComObject( info.filter );
							Marshal.ReleaseComObject( pinTo );
						}
						Marshal.ReleaseComObject( pins[0] );
					}
				}
				while( hr == 0 );

				Marshal.ReleaseComObject( pinEnum ); pinEnum = null;
			}
		}
예제 #28
0
 public void CancelEdit()
 {
     this.Name = this.backup.Name;
     this.Type = this.backup.Type;
     this.backup = null;
 }
예제 #29
0
        /// <summary>
        /// Erzeugt einen Graphen und startet ihn.
        /// </summary>
        /// <param name="location">Der Ursprung, über den die Quellgruppe empfangen wird.</param>
        /// <param name="group">Die gewünschte Quellgruppe.</param>
        /// <exception cref="ArgumentException">Es wurden nicht alle Parameter gesetzt.</exception>
        public void Create(GroupLocation location, SourceGroup group)
        {
            // Get rid of it
            Destroy();

            // Create new graph builder
            var graph = Activator.CreateInstance(Type.GetTypeFromCLSID(BDAEnvironment.GraphBuilderClassIdentifier));

            try
            {
                // Convert interface
                m_Graph = (IMediaFilter)graph;
            }
            catch
            {
                // Cleanup
                BDAEnvironment.Release(ref graph);

                // Forward
                throw;
            }

            // See if we should register the graph
            m_ExternalRegistration = BDASettings.RegisterBDAGRaph(m_Graph, false);

            // Attach to alternate interface
            var builder = (IGraphBuilder)m_Graph;

            // Check log
            var logFile = BDASettings.BDALogPath;

            if (logFile != null)
            {
                // Open path
                m_LogFile = new FileStream(logFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read);

                // Enable logging on graph builder
                builder.SetLogFile(m_LogFile.SafeFileHandle);
            }

            // Start with network provider
            NetworkProvider = AddFilter("Network Provider", BDAEnvironment.GetNetworkProviderMoniker(DVBType));

            // Initialize provider
            Tune(location, group);

            // Always create the tuner
            if (TunerInformation != null)
            {
                TunerFilter = AddFilter("Tuner", TunerInformation);
            }
            else
            {
                throw new ArgumentException(Properties.Resources.Exception_MissingTuner, "Tuner");
            }

            // Optionally create capture
            if (CaptureInformation != null)
            {
                CaptureFilter = AddFilter("Capture", CaptureInformation);
            }

            // Add additional filter
            foreach (var additionalFilter in AdditionalFilterInformations)
            {
                if (additionalFilter == null)
                {
                    throw new ArgumentNullException("AdditionalFilters");
                }
                else
                {
                    AdditionalFilters.Add(AddFilter(additionalFilter.DisplayName, additionalFilter));
                }
            }

            // Connect network provider to streaming instance
            Connect(NetworkProvider, CaptureFilter ?? TunerFilter);

            // Initialize provider
            Tune(location, group);

            // Create the primary filter and add it
            AddFilter("TS", TransportStreamAnalyser = new InputFilter());

            // Connect device output for analysis
            Connect(CaptureFilter ?? TunerFilter, TransportStreamAnalyser);

            // Create the demultiplexer - needed to keep the infrastructure alive
            using (var demux = AddFilter("TIF", BDAEnvironment.MicrosoftDemultiplexerMoniker))
            {
                // Connect to the dedicated pin of our analyser
                TransportStreamAnalyser.DataManager.TIFConnector.Connect(demux, BDAEnvironment.TransportStreamMediaType1);

                // Pins to remove
                var remove = new List <string>();

                // Prepare the demultiplexer pins
                demux.InspectAllPins(pin =>
                {
                    // See if this is the SI pin
                    bool isSectionPin = false;
                    pin.InspectAllMediaTypes(type =>
                    {
                        // Check major
                        if (!type.MajorType.Equals(BDAEnvironment.DataFormatTypeSections))
                        {
                            return(true);
                        }

                        // Check minor
                        isSectionPin = type.SubType.Equals(BDAEnvironment.DataFormatSubtypeSI);

                        // Report
                        return(!isSectionPin);
                    });

                    // Check the mode
                    if (isSectionPin)
                    {
                        // Connect
                        using (var comPin = ComIdentity.Create(pin))
                            builder.Render(comPin.Interface);

                        // Load connection data
                        IntPtr tifIn = IntPtr.Zero;
                        if (pin.ConnectedTo(ref tifIn) < 0)
                        {
                            throw new InvalidOperationException(Properties.Resources.Exception_TIF);
                        }

                        // Reconstruct
                        var tifPin = Marshal.GetObjectForIUnknown(tifIn);
                        try
                        {
                            // Request pin context
                            var info = new PinInfo();
                            ((IPin)tifPin).QueryPinInfo(ref info);

                            // Request from pin
                            m_TIF = info.GetAndDisposeFilter();
                        }
                        finally
                        {
                            // Cleanup
                            BDAEnvironment.Release(ref tifPin);
                        }
                    }
                    else if (pin.QueryDirection() == PinDirection.Output)
                    {
                        // Prepare to kill
                        remove.Add(pin.QueryId());
                    }
                });

                // Prepare to remove all unconnected pins
                if (remove.Count > 0)
                {
                    using (var demuxInstance = demux.MarshalToManaged())
                    {
                        // Change type
                        var mpeg2 = (IMpeg2Demultiplexer)demuxInstance.Object;

                        // Remove all
                        foreach (var id in remove)
                        {
                            mpeg2.DeleteOutputPin(id);
                        }
                    }
                }
            }

            // Install the PMT watchdog
            TransportStreamAnalyser.DataManager.TSParser.PMTFound += ProcessPMT;
        }
예제 #30
0
		// --------------------------- Private methods ----------------------------

		/// <summary> Retrieve the friendly name of a connectorType. </summary>
		private string getName( IPin pin )
		{
			string s = "Unknown pin";
			PinInfo pinInfo = new PinInfo();

			// Direction matches, so add pin name to listbox
			int hr = pin.QueryPinInfo( out pinInfo);
			if ( hr == 0 )
			{ 
				s = pinInfo.name + "";
			}
			else
				Marshal.ThrowExceptionForHR( hr );

			// The pininfo structure contains a reference to an IBaseFilter,
			// so you must release its reference to prevent resource a leak.
			if ( pinInfo.filter != null )
				Marshal.ReleaseComObject( pinInfo.filter  );  pinInfo.filter  = null;

			return( s );
		}
예제 #31
0
        protected override CommandResult <string> OnExecute(object commandParameter)
        {
            var result = new CommandResult <string>();
            var param  = commandParameter as CreatePinParameter;

            using (CoreContext context = new CoreContext())
            {
                //使用zlopenid,因为此时没有登录
                var ZlOpenId = context.MemberInfo.Where(m => m.AccountId == param.MemberAccount).Select(m => m.ZlOpenId).FirstOrDefault();
                var pinCofig = context.PinConfig.Where(p => p.PingId == param.PinId && DateTime.Now >= p.StartDate && p.EndDate >= DateTime.Now).FirstOrDefault();
                if (pinCofig == null)
                {
                    result.ErrorCode    = -1;
                    result.ErrorMessage = "找不到拼团活动";
                    return(result);
                }

                var    configArry = JsonConvert.DeserializeObject <JArray>(pinCofig.Config);
                string config     = "";
                foreach (var item in configArry)
                {
                    if (item["ProductSkuNo"].Value <string>() == param.ProductSkuNo)
                    {
                        config = JsonConvert.SerializeObject(item);
                        break;
                    }
                }
                using (var tran = context.Database.BeginTransaction())
                {
                    PinInfo pinInfo  = null;
                    int     pinCount = 0;
                    if (param.MainId > 0)
                    {
                        pinInfo = context.PinInfo.Where(p => p.Recid == param.MainId && p.PingId == param.PinId && p.EndDate >= DateTime.Now).FirstOrDefault();
                        if (pinInfo != null && pinInfo.MemberAccount == param.MemberAccount)
                        {
                            result.ErrorCode    = -1;
                            result.ErrorMessage = "不能参与自己发起的团";
                            return(result);
                        }
                        pinCount = context.PinOrder.Where(p => p.MainId == param.MainId && p.Status == 1).Count();
                        if (pinCount == 0)
                        {
                            result.ErrorCode    = -1;
                            result.ErrorMessage = "参数错误";
                            return(result);
                        }
                    }
                    if (pinInfo == null)
                    {
                        var endDate = DateTime.Now.AddDays(Convert.ToInt32(pinCofig.MaxDate));
                        if (DateTime.Now.ToString("yyyy-MM-dd") == Convert.ToDateTime(pinCofig.EndDate).ToString("yyyy-MM-dd"))
                        {
                            endDate = Convert.ToDateTime(pinCofig.EndDate);
                        }
                        pinInfo = new PinInfo()
                        {
                            MaxDate       = pinCofig.MaxDate,
                            PingId        = pinCofig.PingId,
                            Status        = 1,
                            Config        = config,
                            CreateDate    = DateTime.Now,
                            EndDate       = endDate,
                            MemberAccount = param.MemberAccount,
                            MinCount      = pinCofig.MinCount
                        };
                        context.PinInfo.Add(pinInfo);
                        context.SaveChanges();
                    }
                    if (pinInfo.Status == 9)
                    {
                        result.ErrorCode    = -1;
                        result.ErrorMessage = "拼团失败,该团已满人";
                        return(result);
                    }
                    if (pinInfo.Status == -1)
                    {
                        result.ErrorCode    = -1;
                        result.ErrorMessage = "拼团失败,该团已失效";
                        return(result);
                    }
                    if (pinInfo.EndDate < DateTime.Now)
                    {
                        result.ErrorCode    = -1;
                        result.ErrorMessage = "拼团失败,该团已失效";
                        return(result);
                    }


                    try
                    {
                        var pinOrder = new PinOrder()
                        {
                            Status        = 0,
                            ProductConfig = pinInfo.Config,
                            CreateDate    = DateTime.Now,
                            MainId        = pinInfo.Recid,
                            MemberAccount = param.MemberAccount
                        };
                        context.PinOrder.Add(pinOrder);
                        //创建商城订单
                        JObject productconfig = JsonConvert.DeserializeObject <JObject>(pinInfo.Config);
                        var     res           = new CreateShopOrderCommand().Execute(new CreateShopOrderParameter()
                        {
                            ZlOpenId     = ZlOpenId,
                            ProductSkuNo = productconfig["ProductSkuNo"].Value <string>(),
                            AddressId    = param.AddressId,
                            Id           = pinCofig.PingId
                        });
                        if (!string.IsNullOrEmpty(res.Data))
                        {
                            pinOrder.OrderNo = res.Data;
                        }
                        else
                        {
                            result.ErrorCode    = -1;
                            result.ErrorMessage = res.ErrorMessage;
                            return(result);
                        }

                        context.SaveChanges();
                        result.Data = pinOrder.OrderNo;

                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        result = ErrorResult <string> .ParameterError;
                        result.ErrorMessage = ex.Message;
                        return(result);
                    }

                    //未成团锁定商城订单状态
                    var confirmRes = ZlanAPICaller.ExecuteSys("Sys.ChangeOrderConfirm", new
                    {
                        OrderNo = new List <string> {
                            result.Data
                        },
                        Type = "AWAIT"
                    });
                    if (!confirmRes["ErrorCode"].Value <string>().Equals("0000"))
                    {
                        LogUtil.Log("CreatePinOrder", result.Data, confirmRes["ErrorMsg"].Value <string>());

                        result.ErrorCode    = -1;
                        result.ErrorMessage = "锁定商城订单状态失败";
                        return(result);
                    }
                }
            }

            return(result);
        }
        // this function should be called AFTER the video stream has been rendered
        // but before rendering the audio streams
        // however, it will try to find the splitter even if video wasn't rendered
        private bool FindSplitter(IGraphBuilder pGraphBuilder)
        {
            if (_splitterFilter != null)
            {
                DsUtils.RemoveRedundantFilters(_sourceFilter, pGraphBuilder);
                return(true);
            }

            IEnumFilters pEnumFilters = null;
            IBaseFilter  pFilter      = null;
            int          cFetched;
            bool         bSplitterFound = false;

            int hr = pGraphBuilder.EnumFilters(out pEnumFilters);

            if (DsHlp.FAILED(hr))
            {
                return(false);
            }

            IPin pPin;
            int  nFilters = 0;
            bool bCanRelease;

            while ((pEnumFilters.Next(1, out pFilter, out cFetched) == DsHlp.S_OK))
            {
                nFilters++;
                bCanRelease = true;
                pPin        = DsUtils.GetPin(pFilter, PinDirection.Output, false, 0);
                if (pPin != null)
                {
                    if (DsUtils.IsMediaTypeSupported(pPin, MediaType.Audio) == 0 ||
                        DsUtils.IsMediaTypeSupported(pPin, MediaType.Subtitle) == 0)
                    {
                        //this unconnected pin supports audio or subpicture type!
                        bSplitterFound  = true;
                        bCanRelease     = false;
                        _splitterFilter = pFilter;
                    }
                    Marshal.ReleaseComObject(pPin);
                }

                //let's have a look at another filter
                if (bCanRelease)
                {
                    Marshal.ReleaseComObject(pFilter);
                }

                if (bSplitterFound)
                {
                    break;
                }
            }

            Marshal.ReleaseComObject(pEnumFilters);

            if (!bSplitterFound)
            {
                if (nFilters > 3)
                {
                    pPin = DsUtils.GetPin(_sourceFilter, PinDirection.Output, true, 0);
                    if (pPin != null)
                    {
                        IPin pInputPin;
                        hr = pPin.ConnectedTo(out pInputPin);
                        if (hr == DsHlp.S_OK)
                        {
                            PinInfo info = new PinInfo();
                            hr = pInputPin.QueryPinInfo(out info);
                            if (hr == DsHlp.S_OK)
                            {
                                _splitterFilter = info.pFilter;
                                bSplitterFound  = true;
                            }
                            Marshal.ReleaseComObject(pInputPin);
                        }
                        Marshal.ReleaseComObject(pPin);
                    }
                }
                else
                {
                    _splitterFilter = _sourceFilter;
                    bSplitterFound  = true;
                }
            }

            StripSplitter(pGraphBuilder);
            return(bSplitterFound);
        }
예제 #33
0
        private void UnRender(IPin pinOutOrigin)
        {
            int hr;
            //hr = pinOutOrigin.Disconnect();
            IPin pinOutEnd = null;

            hr = pinOutOrigin.ConnectedTo(out pinOutEnd);
            if (pinOutEnd != null)
            {
                try
                {
                    PinInfo pInfo = new PinInfo();
                    hr = pinOutEnd.QueryPinInfo(out pInfo);
                    if (hr >= 0)
                    {
                        if (pInfo.filter != null)
                        {
                            try
                            {
                                IEnumPins ppEnum;
                                hr = pInfo.filter.EnumPins(out ppEnum);
                                if (hr >= 0)
                                {
                                    try
                                    {
                                        // Walk the pins looking for a match
                                        IPin[] pPins = new IPin[1];
                                        //22 int lFetched;
                                        //22 while ((ppEnum.Next(1, pPins, out lFetched) >= 0) && (lFetched == 1))
                                        while (ppEnum.Next(1, pPins, IntPtr.Zero) >= 0)
                                        {
                                            try
                                            {
                                                // Read the direction
                                                PinDirection ppindir;
                                                hr = pPins[0].QueryDirection(out ppindir);
                                                if (hr >= 0)
                                                {
                                                    // Is it the right direction?
                                                    if (ppindir == PinDirection.Output)
                                                    {
                                                        if (pPins[0] != null)
                                                        {
                                                            UnRender(pPins[0]);
                                                        }
                                                    }
                                                }
                                            }
                                            finally
                                            {
                                                Marshal.ReleaseComObject(pPins[0]);
                                            }
                                        }
                                    }
                                    finally
                                    {
                                        Marshal.ReleaseComObject(ppEnum);
                                    }
                                }

                                hr = graphBuilder.RemoveFilter(pInfo.filter);
                            }
                            finally
                            {
                                Marshal.ReleaseComObject(pInfo.filter);
                            }
                        }
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(pinOutEnd);
                }
            }
        }