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 + -
显示快捷键?