zensysupnpavrenderercpdevice .cs

来自「zwave 无线通讯协议 PC controller 控制器源码」· CS 代码 · 共 355 行

CS
355
字号
//////////////////////////////////////////////////////////////////////////////////////////////// 
//
//          #######
//          #   ##    ####   #####    #####  ##  ##   #####
//             ##    ##  ##  ##  ##  ##      ##  ##  ##
//            ##  #  ######  ##  ##   ####   ##  ##   ####
//           ##  ##  ##      ##  ##      ##   #####      ##
//          #######   ####   ##  ##  #####       ##  #####
//                                           #####
//          Z-Wave, the wireless language.
//
//          Copyright Zensys A/S, 2003,2004
//
//          All Rights Reserved
//
//          Description:   This source file is the main sourcefile for the
//                         ZensysUPnPAvRendererCPDevice class, which is a control point
//                         for UPnP AV Renderers
//
//                         Source is based on source code generated by Intel DeviceBuilder Tool
//
//          Author:   Johann Sigfredsson
//
//          Last Changed By:  $Author: jch $
//          Revision:         $Revision: 1.2 $
//          Last Changed:     $Date: 2006/04/26 08:56:09 $
//
//////////////////////////////////////////////////////////////////////////////////////////////

using System;
using System.Collections;
using Intel.UPNP;
using MicroStack;
using Zensys.ZWave.Communication;
using Zensys.ZWave.Logging;

namespace Zensys
{

  public class ZensysUPnPAvRendererDevice : ZensysUPnPDevice
  {
    private uint instanceId;
    private uint connectionId;
    private int deviceNumber;
    private CpRenderingControl renderingControl;
    private CpAVTransport avTransport;
    private CpConnectionManager connectionManager;

    public uint InstanceId {get {return instanceId;} set {instanceId = value;}}
    public uint ConnectionId {get {return connectionId;} set{connectionId = value;}}
    public int DeviceNumber {get {return deviceNumber;} set{deviceNumber = value;}}
    public CpRenderingControl RenderingControl {get {return renderingControl;} set{renderingControl = value;}}
    public CpAVTransport AVTransport {get {return avTransport;} set{avTransport = value;}}
    public CpConnectionManager ConnectionManager {get {return connectionManager;} set{connectionManager = value;}}

    public ZensysUPnPAvRendererDevice(byte Id, CpRenderingControl RenderControl, CpAVTransport AVTrans, CpConnectionManager ConnectionMan, ZWaveLogging mLog)
    {
      instanceId = 0;
      connectionId = 0;
      deviceNumber = 0;
      RenderingControl = RenderControl;
      AVTransport = AVTrans;
      ConnectionManager = ConnectionMan;
      ZensysUPnPUpDeviceInit(UPnPDeviceTypes.AVRenderer, ZWaveDeviceTypes.UNKNOWN, Id, mLog);
    }

    public override string ToString()
    {
      return "UPnPAvRendererDevice";
    }
  }

	/// <summary>
	/// Summary description for ZensysUPnPAvRendererCPDevice.
	/// </summary>
	public class ZensysUPnPAvRendererCPDevice : ZensysUPnPCPDevice
	{
    public delegate void AvRendererCP_EventSubscriberHandler(ZensysUPnPAvRendererDevice rendererDevice, eventID state);
	
    public event AvRendererCP_EventSubscriberHandler AvRendererCP_Eventsubscriber;

    private MediaRendererDiscovery disco;
    private ArrayList CPUPnPDeviceList = new ArrayList();
    private ArrayList UPnPAvRendererDeviceList = new ArrayList();

    [Serializable]
    public struct ZensysCPUPnPDeviceStorage
    {
      public byte nodeId;
      public uint instanceId;
      public uint connectionId;
      public int deviceNumber;
      public ZensysUPnPDevice dev;
      public CpRenderingControl RenderingControl;
      public CpAVTransport AVTransport;
      public CpConnectionManager ConnectionManager;
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="log"></param>
    public ZensysUPnPAvRendererCPDevice(ZWaveLogging log)
		{
      m_log = log;
      disco = new MediaRendererDiscovery();
      disco.OnAddedDevice += new MediaRendererDiscovery.DiscoveryHandler(AddSink);
      disco.OnRemovedDevice += new MediaRendererDiscovery.DiscoveryHandler(RemoveSink);
			
      disco.Start();
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="AVTransport"></param>
    /// <param name="friendlyName"></param>
    /// <param name="InstanceID"></param>
    public void ZensysUPnPAvRendererPlay(CpAVTransport AVTransport, string friendlyName, System.UInt32 InstanceId)
    {
      if (ZensysUPnPAvRendererGetTransport(ref AVTransport, ref friendlyName, ref InstanceId))
      {
        AVTransport.Play(InstanceId, MicroStack.CpAVTransport.Enum_TransportPlaySpeed._1);
        m_log.Write(friendlyName + " received Play command");
      }
      else
      {
        m_log.Write(friendlyName + " has no properly recognized connection to receive the Play command");
      }
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="AVTransport"></param>
    /// <param name="friendlyName"></param>
    /// <param name="InstanceID"></param>
    public void ZensysUPnPAvRendererStop(CpAVTransport AVTransport, string friendlyName, System.UInt32 InstanceId)
    {
      if (ZensysUPnPAvRendererGetTransport(ref AVTransport, ref friendlyName, ref InstanceId))
      {
        AVTransport.Stop(InstanceId);
        m_log.Write(friendlyName + " received Stop command");
      }
      else
      {
        m_log.Write(friendlyName + " has no properly recognized connection to receive the Stop command");
      }
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="AVTransport"></param>
    /// <param name="friendlyName"></param>
    /// <param name="InstanceID"></param>
    public void ZensysUPnPAvRendererPause(CpAVTransport AVTransport, string friendlyName, System.UInt32 InstanceId)
    {
      if (ZensysUPnPAvRendererGetTransport(ref AVTransport, ref friendlyName, ref InstanceId))
      {
        AVTransport.Pause(InstanceId);
        m_log.Write(friendlyName + " received Pause command");
      }
      else
      {
        m_log.Write(friendlyName + " has no properly recognized connection to receive the Pause command");
      }
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="AVTransport"></param>
    /// <param name="friendlyName"></param>
    /// <param name="InstanceID"></param>
    public void ZensysUPnPAvRendererPrev(CpAVTransport AVTransport, string friendlyName, System.UInt32 InstanceID)
    {
      if (ZensysUPnPAvRendererGetTransport(ref AVTransport, ref friendlyName, ref InstanceID))
      {
        AVTransport.Previous(InstanceID);
        m_log.Write(friendlyName + " received Previous command");
      }
      else
      {
        m_log.Write(friendlyName + " has no properly recognized connection to receive the Prev command");
      }
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="AVTransport"></param>
    /// <param name="friendlyName"></param>
    /// <param name="InstanceID"></param>
    public void ZensysUPnPAvRendererNext(CpAVTransport AVTransport, string friendlyName, System.UInt32 InstanceID)
    {
      if (ZensysUPnPAvRendererGetTransport(ref AVTransport, ref friendlyName, ref InstanceID))
      {
        AVTransport.Next(InstanceID);
        m_log.Write(friendlyName + " received Next command");
      }
      else
      {
        m_log.Write(friendlyName + " has no properly recognized connection to receive the Next command");
      }
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="AVTransport"></param>
    /// <param name="friendlyName"></param>
    /// <param name="InstanceID"></param>
    /// <returns></returns>
    private bool ZensysUPnPAvRendererGetTransport(ref CpAVTransport AVTransport, ref string friendlyName, ref System.UInt32 InstanceId)
    {
      /* If no Renderer transport device specified try the first in list */
      if (AVTransport == null)
      {
        if (UPnPAvRendererDeviceList.Count > 0)
        {
          ZensysUPnPAvRendererDevice rendererDev = UPnPAvRendererDeviceList[0] as ZensysUPnPAvRendererDevice;
          AVTransport = rendererDev.AVTransport;
          friendlyName = rendererDev.Device.FriendlyName;
          InstanceId = rendererDev.InstanceId;
        }
      }
      return (AVTransport != null);
    }


    /// <summary>
    /// 
    /// </summary>
    public void ZensysUPnPAvRendererReScan()
    {
      disco.ReScan();
    }


#if VOL
    public void ZensysUPnPAvRendererVolUp(CpAVTransport AVTransport, string friendlyName, System.UInt32 InstanceID)
    {
      ZensysCPUPnPDeviceStorage devstore;
      System.Collections.IEnumerator enumerator = CPUPnPDeviceList.GetEnumerator();

      /* If no Renderer transport device specified try the first in list */
      if (AVTransport == null)
      {
        if (enumerator.MoveNext())
        {
          devstore = (ZensysUPnPAvRendererCPDevice.ZensysCPUPnPDeviceStorage) enumerator.Current;
          AVTransport = devstore.AVTransport;
          devstore.RenderingControl.SetVolume(0, CpRenderingControl.Enum_A_ARG_TYPE_Channel._UNSPECIFIED_, 
          friendlyName = devstore.device.FriendlyName;
        }
      }
      if (AVTransport != null)
      {
        ;
        m_log.Write(friendlyName + " received Next command");
      }
    }
#endif


    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="d"></param>
    private void AddSink(MediaRendererDiscovery sender, UPnPDevice d)
    {
      // To interact with a service, instantiate the appropriate wrapper class on the appropriate service
      // Traverse the device heirarchy to the correct device, and invoke 'GetServices', passing in the static field 'SERVICE_NAME'
      // of the appropriate wrapper class. This method returns an array of all services with this service type. For most purposes,
      // there will only be one service, in which case you can use array index 0.
      // Save a reference to this instance of the wrapper class for later use.
      ZensysUPnPAvRendererDevice AvDev = new ZensysUPnPAvRendererDevice(0,
                                                                        new CpRenderingControl(d.GetServices(CpRenderingControl.SERVICE_NAME)[0]),
                                                                        new CpAVTransport(d.GetServices(CpAVTransport.SERVICE_NAME)[0]),
                                                                        new CpConnectionManager(d.GetServices(CpConnectionManager.SERVICE_NAME)[0]),
                                                                        m_log);
      AvDev.Device = d;
      // To subscribe to Events, call the '_subscribe' method of the wrapper class. The only parameter is
      // the duration of the event. A good value is 300 seconds.
      AvDev.RenderingControl._subscribe(300);
      AvDev.AVTransport._subscribe(300);
      AvDev.ConnectionManager._subscribe(300);
      UPnPAvRendererDeviceList.Add(AvDev);
      // The wrapper class exposes all the evented state variables through events in the form 'OnStateVariable_xx', where xx is the variable name.
			
      // The wrapper class exposes methods in two formats. Asyncronous and Syncronous. The Async method calls are exposed simply
      // by the name of the method. The Syncronous version is the same, except with the word, 'Sync_' prepended to the name.
      // Asyncronous responses to th async method calls are dispatched through the event in the format, 'OnResult_x' where x is the method name.
			
      // Note: All arguments are automatically type checked. Allowed Values are abstracted through enumerations, that are defined in the wrapper class.
      // To access the list of allowed values or ranges for a given device, refer to the property 'Values_XXX' for a list of the allowed values for a
      // given state variable. Similarly, refer to the properties 'HasMaximum_XXX', 'HasMinimum_XXX', 'Maximum_XXX', and 'Minimum_XXX' where XXX is the variable name, for the Max/Min values.
			
      // To determine if a given service implements a particular StateVariable or Method, use the properties, 'HasStateVariableXXX' and 'HasActionXXX' where XXX is the method/variable name.

      /* Add it to our list of devices */
      m_log.Write("AVRenderer " + d.FriendlyName + " created");
      /* Tell our subscribers */
      if (AvRendererCP_Eventsubscriber != null)
      {
        AvRendererCP_Eventsubscriber(AvDev, eventID.include);
      }
    }


    /// <summary>
    /// called by UPnP stack when a registered Av Renderer disappears
    /// </summary>
    /// <param name="sender">MediaRendererDiscovery device</param>
    /// <param name="d">UPnPDevice that has disappeared</param>
    private void RemoveSink(MediaRendererDiscovery sender, UPnPDevice d)
    {
      foreach (ZensysUPnPAvRendererDevice dev in UPnPAvRendererDeviceList)
      {
        if (d == dev.Device)
        {
          /* Tell our subscribers */
          UPnPAvRendererDeviceList.Remove(dev);
          m_log.Write("AVRenderer " + d.FriendlyName + " removed");
          if (AvRendererCP_Eventsubscriber != null)
          {
            AvRendererCP_Eventsubscriber(dev, eventID.exclude);
          }
          return;
        }
      }
      m_log.Write("AVRenderer " + d.FriendlyName + " disappeared but was not registered");
    }


    /// <summary>
    /// Returns string containing short description of class
    /// </summary>
    /// <returns>string describing class</returns>
    public override string ToString()
    {
      return "UPnPAvRendererCP";
    }
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?