/// <summary> /// This method gets called when a new Uri has been set, when faking a playlist /// </summary> /// <param name="sender"></param> /// <param name="InstanceID"></param> /// <param name="CurrentURI"></param> /// <param name="CurrentURIMetaData"></param> /// <param name="e"></param> /// <param name="Tag"></param> protected void FakePlayListSink(CpAVTransport sender, System.UInt32 InstanceID, System.String CurrentURI, System.String CurrentURIMetaData, UPnPInvokeException e, object Tag) { if (e == null) { ((AVConnection)Tag).Play(); } }
/// <summary> /// This method gets called when SetAVTransportURI completes /// </summary> /// <param name="sender"></param> /// <param name="InstanceID"></param> /// <param name="CurrentURI"></param> /// <param name="CurrentURIMetaData"></param> /// <param name="e"></param> /// <param name="Tag"></param> protected void SetURISink(CpAVTransport sender, System.UInt32 InstanceID, System.String CurrentURI, System.String CurrentURIMetaData, UPnPInvokeException e, object Tag) { if (e == null) { SetURI_Event.Set(); if (SetURIEvent_Event.WaitOne(0, false) == true) { // OpenSource.Utilities.InstanceTracker.StopTimer("SetAVTransport+Event"); if (OnReady != null) { OnReady(this, (AVConnection)Tag, _Tag); } OnReady = null; } } else { if (OnFailed != null) { OnFailed(this, AVRenderer.CreateFailedReason.SetAVTransport_FAILED); } OnFailed = null; OnReady = null; } }
protected void PositionInfoSink(CpAVTransport sender, UInt32 InstanceID, UInt32 Track, string TrackDuration, string TrackMetaData, string TrackURI, string RelTime, string AbsTime, int RelCount, int AbsCount, UPnPInvokeException e, object Handle) { DText p = new DText(); p.ATTRMARK = ":"; try { p[0] = TrackDuration; _CurrentDuration = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3])); } catch (Exception) { } try { p[0] = RelTime; _CurrentPosition = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3])); } catch (Exception) { } if (OnCurrentPositionChanged != null) { OnCurrentPositionChanged(this); } _CurrentTrack = Track; this._TrackURI = HTTPMessage.UnEscapeString(TrackURI); if (this.OnTrackURIChanged != null) { OnTrackURIChanged(this); } if (OnCurrentTrackChanged != null) { OnCurrentTrackChanged(this); } lock (this) { --StateCounter; if (StateCounter == 0) { if (OnReady != null) { OnReady(this); } } } }
protected void SetAVTransportURISink(CpAVTransport sender, System.UInt32 InstanceID, System.String CurrentURI, System.String CurrentURIMetaData, UPnPInvokeException e, object Tag) { if (e != null) { return; } OnSetAVTransportURIEvent.Fire(this, Tag); }
protected void GetTransportInfoSink(CpAVTransport sender, System.UInt32 InstanceID, CpAVTransport.Enum_TransportState CurrentTransportState, CpAVTransport.Enum_TransportStatus CurrentTransportStatus, CpAVTransport.Enum_TransportPlaySpeed CurrentSpeed, UPnPInvokeException e, object Handle) { if (e != null) { return; } _TransportStatus = _cp.Enum_TransportStatus_ToString(CurrentTransportStatus); switch (CurrentTransportState) { case CpAVTransport.Enum_TransportState.PLAYING: this._PlayState = "PLAYING"; break; case CpAVTransport.Enum_TransportState.STOPPED: this._PlayState = "STOPPED"; break; case CpAVTransport.Enum_TransportState.PAUSED_PLAYBACK: this._PlayState = "PAUSED_PLAYBACK"; break; case CpAVTransport.Enum_TransportState.PAUSED_RECORDING: this._PlayState = "PAUSED_RECORDING"; break; case CpAVTransport.Enum_TransportState.RECORDING: this._PlayState = "RECORDING"; break; case CpAVTransport.Enum_TransportState.TRANSITIONING: this._PlayState = "TRANSITIONING"; break; } if (this.OnPlayStateChanged != null) { OnPlayStateChanged(this); } if (this.OnTransportStatusChanged != null) { OnTransportStatusChanged(this); } lock (this) { --StateCounter; if (StateCounter == 0) { if (OnReady != null) { OnReady(this); } } } }
public AVTransportLastChange(CpAVTransport cpAV, string Ident, int ID, AVTransportLastChange.ReadyHandler ReadyCallback) { OpenSource.Utilities.InstanceTracker.Add(this); this.OnReady += ReadyCallback; InstanceID = ID.ToString(); Identifier = Ident; _cp = cpAV; _cp.OnStateVariable_LastChange += new CpAVTransport.StateVariableModifiedHandler_LastChange(LastChangeSink); _cp._subscribe(500); lock (this) { if (_cp.HasAction_GetPositionInfo) { ++StateCounter; //PollerTimeoutHandler = new LifeTimeMonitor.LifeTimeHandler(PollerTimeoutSink); //PollerTimeout.AddWeakEvent_OnExpired(PollerTimeoutHandler); _cp.GetPositionInfo((UInt32)ID, null, new CpAVTransport.Delegate_OnResult_GetPositionInfo(PositionInfoSink)); } if (_cp.HasAction_GetMediaInfo) { ++StateCounter; _cp.GetMediaInfo((UInt32)ID, null, new CpAVTransport.Delegate_OnResult_GetMediaInfo(MediaInfoSink)); } if (_cp.HasAction_GetTransportInfo) { ++StateCounter; _cp.GetTransportInfo((UInt32)ID, null, new CpAVTransport.Delegate_OnResult_GetTransportInfo(GetTransportInfoSink)); } if (_cp.HasAction_GetTransportSettings) { ++StateCounter; _cp.GetTransportSettings((UInt32)ID, null, new CpAVTransport.Delegate_OnResult_GetTransportSettings(GetTransportSettingsSink)); } } }
private void GetTransportSettingsSink(CpAVTransport sender, System.UInt32 InstanceID, CpAVTransport.Enum_CurrentPlayMode PlayMode, CpAVTransport.Enum_CurrentRecordQualityMode RecQualityMode, UPnPInvokeException e, object _Tag) { if (e == null) { _CurrentPlayMode = _cp.Enum_CurrentPlayMode_ToString(PlayMode); if (this.OnCurrentPlayModeChanged != null) { OnCurrentPlayModeChanged(this); } } lock (this) { --StateCounter; if (StateCounter == 0) { if (OnReady != null) { OnReady(this); } } } }
protected void MediaInfoSink(CpAVTransport sender, System.UInt32 InstanceID, System.UInt32 NrTracks, System.String MediaDuration, System.String CurrentURI, System.String CurrentURIMetaData, System.String NextURI, System.String NextURIMetaData, CpAVTransport.Enum_PlaybackStorageMedium PlayMedium, CpAVTransport.Enum_RecordStorageMedium RecordMedium, CpAVTransport.Enum_RecordMediumWriteStatus WriteStatus, UPnPInvokeException e, object Handle) { _AVTransportURI = CurrentURI; _AVTransportMetaData = CurrentURIMetaData; if (this.OnAVTransportURIChanged != null) { OnAVTransportURIChanged(this); } _NextAVTransportURI = NextURI; _NextAVTransportMetaData = NextURIMetaData; if (this.OnNextAVTransportURIChanged != null) { OnNextAVTransportURIChanged(this); } _NumberOfTracks = NrTracks; this._AVTransportMetaData = CurrentURIMetaData; if (this.OnCurrentURIMetaDataChanged != null) { OnCurrentURIMetaDataChanged(this); } if (OnNumberOfTracksChanged != null) { OnNumberOfTracksChanged(this); } lock (this) { --StateCounter; if (StateCounter == 0) { if (OnReady != null) { OnReady(this); } } } }
/// <summary> /// This construct is only called by the AVRenderer object. /// </summary> /// <param name="device"></param> /// <param name="AVTransportID"></param> /// <param name="RenderingControlID"></param> /// <param name="ConnectionID"></param> /// <param name="ReadyCallback"></param> /// <param name="StateObject"></param> internal AVConnection(UPnPDevice device, int AVTransportID, int RenderingControlID, Int32 ConnectionID, AVConnection.OnReadyHandler ReadyCallback, object StateObject) { OpenSource.Utilities.InstanceTracker.Add(this); this.Tag = StateObject; this.OnReady += ReadyCallback; FriendlyName = device.FriendlyName; Identifier = device.UniqueDeviceName + ":" + ConnectionID.ToString(); AVTid = AVTransportID; RCid = RenderingControlID; CMid = ConnectionID; AVTransport = new CpAVTransport(device.GetServices(CpAVTransport.SERVICE_NAME)[0]); RenderingControl = new CpRenderingControl(device.GetServices(CpRenderingControl.SERVICE_NAME)[0]); ConnectionManager = new CpConnectionManager(device.GetServices(CpConnectionManager.SERVICE_NAME)[0]); if (RenderingControl.HasStateVariable_Volume) { // If the renderer has defined ranges, use those if (RenderingControl.HasMaximum_Volume) { MaxVolume = (UInt16)RenderingControl.Maximum_Volume; } else { MaxVolume = UInt16.MaxValue; } if (RenderingControl.HasMinimum_Volume) { MinVolume = (UInt16)RenderingControl.Minimum_Volume; } else { MinVolume = UInt16.MinValue; } } lock (this) { if (AVTransport.HasStateVariable_LastChange) { // Hook up to the LastChange event of AVTransport ++this.StateCounter; AV_LastChange = new AVTransportLastChange(AVTransport, device.UniqueDeviceName, AVTid, new AVTransportLastChange.ReadyHandler(AVTLC)); AV_LastChange.OnCurrentPositionChanged += new AVTransportLastChange.VariableChangeHandler(PositionSink); AV_LastChange.OnPlayStateChanged += new AVTransportLastChange.VariableChangeHandler(PlayStateSink); AV_LastChange.OnAVTransportURIChanged += new AVTransportLastChange.VariableChangeHandler(AVTransportURISink); AV_LastChange.OnCurrentTrackChanged += new AVTransportLastChange.VariableChangeHandler(TrackChangedSink); AV_LastChange.OnNumberOfTracksChanged += new AVTransportLastChange.VariableChangeHandler(NumberOfTracksChangedSink); AV_LastChange.OnTrackURIChanged += new AVTransportLastChange.VariableChangeHandler(TrackURIChangedSink); AV_LastChange.OnCurrentURIMetaDataChanged += new AVTransportLastChange.VariableChangeHandler(URIMetaDataChangedSink); AV_LastChange.OnCurrentPlayModeChanged += new AVTransportLastChange.VariableChangeHandler(CurrentPlayModeChangedSink); AV_LastChange.OnTransportStatusChanged += new AVTransportLastChange.VariableChangeHandler(TransportStatusChangedSink); } if (RenderingControl.HasStateVariable_LastChange) { // Hook up to the LastChange event of RenderingControl ++this.StateCounter; RC_LastChange = new RenderingControlLastChange(RenderingControl, device.UniqueDeviceName, RCid, new RenderingControlLastChange.OnReadyHandler(RCLC)); RC_LastChange.OnMuteChanged += new RenderingControlLastChange.VariableChangeHandler(MuteSink); RC_LastChange.OnVolumeChanged += new RenderingControlLastChange.VariableChangeHandler(VolumeSink); } /* Get ProtocolInfo Value of current connection */ ++this.StateCounter; ConnectionManager.GetCurrentConnectionInfo(ConnectionID, this.GetHashCode(), new CpConnectionManager.Delegate_OnResult_GetCurrentConnectionInfo(InitialState_GetCurrentConnectionInfoSink)); } RenderingControl._subscribe(500); AVTransport._subscribe(500); }
protected void LastChangeSink(CpAVTransport sender, string LC) { if (LC == "") { return; } //LC = UPnPStringFormatter.UnEscapeString(LC); if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } StringReader MyString = new StringReader(LC); XmlTextReader XMLDoc = new XmlTextReader(MyString); Hashtable T = new Hashtable(); int ID = -1; string VarName = ""; string VarValue = ""; string AttrName = ""; string AttrValue = ""; XMLDoc.Read(); XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while ((XMLDoc.LocalName != "Event") && (XMLDoc.EOF == false)) { // At Start, should be InstanceID if (XMLDoc.LocalName == "InstanceID") { XMLDoc.MoveToAttribute("val"); ID = int.Parse(XMLDoc.GetAttribute("val")); if (T.ContainsKey(ID) == false) { T[ID] = new Hashtable(); } XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while (XMLDoc.LocalName != "InstanceID") { if (XMLDoc.IsStartElement() == true) { VarName = XMLDoc.LocalName; VarValue = ""; AttrName = ""; AttrValue = ""; for (int a_idx = 0; a_idx < XMLDoc.AttributeCount; ++a_idx) { XMLDoc.MoveToAttribute(a_idx); if (XMLDoc.LocalName == "val") { VarValue = UPnPStringFormatter.UnEscapeString(XMLDoc.GetAttribute(a_idx)); } else { AttrName = XMLDoc.LocalName; AttrValue = XMLDoc.GetAttribute(a_idx); } } XMLDoc.MoveToContent(); if (AttrName == "") { ((Hashtable)T[ID])[VarName] = VarValue; } else { if (((Hashtable)T[ID]).ContainsKey(VarName) == false) { ((Hashtable)T[ID])[VarName] = new Hashtable(); } if (((Hashtable)((Hashtable)T[ID])[VarName]).ContainsKey(AttrName) == false) { ((Hashtable)((Hashtable)T[ID])[VarName])[AttrName] = new Hashtable(); } ((Hashtable)((Hashtable)((Hashtable)T[ID])[VarName])[AttrName])[AttrValue] = VarValue; } } XMLDoc.Read(); XMLDoc.MoveToContent(); } } else { XMLDoc.Skip(); } XMLDoc.Read(); XMLDoc.MoveToContent(); } XMLDoc.Close(); IDictionaryEnumerator inEn = T.GetEnumerator(); IDictionaryEnumerator EvEn; Hashtable TT; string TempString; DText TempParser = new DText(); while (inEn.MoveNext()) { if (inEn.Key.ToString() == InstanceID) { TT = (Hashtable)inEn.Value; EvEn = TT.GetEnumerator(); while (EvEn.MoveNext()) { switch ((string)EvEn.Key) { case "AVTransportURI": _AVTransportURI = (string)EvEn.Value; if (OnAVTransportURIChanged != null) { OnAVTransportURIChanged(this); } break; case "TransportState": _PlayState = (string)EvEn.Value; if (OnPlayStateChanged != null) { OnPlayStateChanged(this); } break; case "CurrentTrackDuration": TempString = (string)EvEn.Value; TempParser.ATTRMARK = ":"; TempParser[0] = TempString; try { this._CurrentDuration = new TimeSpan(int.Parse(TempParser[1]), int.Parse(TempParser[2]), int.Parse(TempParser[3])); } catch (Exception) {} if (this.OnCurrentPositionChanged != null) { this.OnCurrentPositionChanged(this); } break; case "RelativeTimePosition": TempString = (string)EvEn.Value; TempParser.ATTRMARK = ":"; TempParser[0] = TempString; this._CurrentPosition = new TimeSpan(int.Parse(TempParser[1]), int.Parse(TempParser[2]), int.Parse(TempParser[3])); if (this.OnCurrentPositionChanged != null) { this.OnCurrentPositionChanged(this); } break; case "NumberOfTracks": try { _NumberOfTracks = UInt32.Parse((string)EvEn.Value); if (OnNumberOfTracksChanged != null) { OnNumberOfTracksChanged(this); } } catch (Exception) {} break; case "CurrentTrack": try { _CurrentTrack = UInt32.Parse((string)EvEn.Value); if (OnCurrentTrackChanged != null) { OnCurrentTrackChanged(this); } } catch (Exception) {} break; case "CurrentTrackURI": _TrackURI = (string)EvEn.Value; if (OnTrackURIChanged != null) { OnTrackURIChanged(this); } break; case "TransportStatus": _TransportStatus = (string)EvEn.Value; if (OnTransportStatusChanged != null) { OnTransportStatusChanged(this); } break; case "AVTransportURIMetaData": _AVTransportMetaData = (string)EvEn.Value; if (this.OnCurrentURIMetaDataChanged != null) { OnCurrentURIMetaDataChanged(this); } break; case "CurrentPlayMode": _CurrentPlayMode = (string)EvEn.Value; if (this.OnCurrentPlayModeChanged != null) { OnCurrentPlayModeChanged(this); } break; } } } } }
protected void PollSink(CpAVTransport sender, UInt32 InstanceID, UInt32 Track, string TrackDuration, string TrackMetaData, string TrackURI, string RelTime, string AbsTime, int RelCount, int AbsCount, UPnPInvokeException e, object Handle) { DText p = new DText(); p.ATTRMARK = ":"; TimeSpan ts; try { p[0] = RelTime; _CurrentPosition = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3])); if (this._CurrentTrack != Track) { this._CurrentTrack = Track; if (this.OnCurrentTrackChanged != null) { this.OnCurrentTrackChanged(this); } } p[0] = TrackDuration; ts = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3])); if (this._CurrentDuration != ts) { this._CurrentDuration = ts; } if (this._TrackURI.CompareTo(TrackURI) != 0) { this._TrackURI = TrackURI; if (this.OnCurrentTrackChanged != null) { this.OnCurrentTrackChanged(this); } } if (this._AVTransportMetaData.CompareTo(TrackMetaData) != 0) { this._AVTransportMetaData = TrackMetaData; if (this.OnCurrentURIMetaDataChanged != null) { this.OnCurrentURIMetaDataChanged(this); } } } catch (Exception) { } if (OnCurrentPositionChanged != null) { OnCurrentPositionChanged(this); } }
/// <summary> /// This method gets called when SetAVTransportURI completes /// </summary> /// <param name="sender"></param> /// <param name="InstanceID"></param> /// <param name="CurrentURI"></param> /// <param name="CurrentURIMetaData"></param> /// <param name="e"></param> /// <param name="Tag"></param> protected void SetURISink(CpAVTransport sender, System.UInt32 InstanceID, System.String CurrentURI, System.String CurrentURIMetaData, UPnPInvokeException e, object Tag) { if (e == null) { SetURI_Event.Set(); if (SetURIEvent_Event.WaitOne(0, false) == true) { // OpenSource.Utilities.InstanceTracker.StopTimer("SetAVTransport+Event"); if (OnReady != null) OnReady(this, (AVConnection)Tag, _Tag); OnReady = null; } } else { if (OnFailed != null) OnFailed(this, AVRenderer.CreateFailedReason.SetAVTransport_FAILED); OnFailed = null; OnReady = null; } }
public override void Start(UPnPDevice device) { UPnPTestStates Master = UPnPTestStates.Pass; TestDevice = device; UPnPDevice d = device; UPnPService[] services = d.GetServices(CpConnectionManager.SERVICE_NAME); if (services == null || services.Length == 0) { enabled = false; return; } CM = new CpConnectionManager(services[0]); string SOURCE = ""; string SINK = ""; DText parser = new DText(); StartCountDown(0, 90); try { CM.Sync_GetProtocolInfo(out SOURCE, out SINK); } catch (UPnPInvokeException) { Results.Add("Connection Handler Test was aborted because GetProtocolInfo FAILED"); SetState("Connection Handling", UPnPTestStates.Failed); Master = UPnPTestStates.Failed; } AbortCountDown(); parser.ATTRMARK = ","; parser.MULTMARK = ":"; bool OK = true; if (ConnectionManagerEventsTest() == false) { Results.Add("Connection Handler Test was aborted because of invalid/missing events"); SetState("Connection Handling", UPnPTestStates.Failed); Master = UPnPTestStates.Failed; } if (SINK != "") { parser[0] = SINK; TotalTime = parser.DCOUNT() * 120; CurrentTime = 0; for (int i = 1; i <= parser.DCOUNT(); ++i) { if (parser.DCOUNT(i) != 4) { // Invalid Format OK = false; AddEvent(LogImportance.Critical, "Connection Handling", " Protocol Info String [" + parser[i] + "] is not in a valid format"); } } if (OK) { AddEvent(LogImportance.Remark, "Connection Handling", " Protocol Info Strings are in the correct format"); } else { Results.Add("Connection Handler Test was aborted because of invalid Protocol Info Strings"); SetState("Connection Handling", UPnPTestStates.Failed); Master = UPnPTestStates.Failed; } if (CM.HasAction_PrepareForConnection) { for (int i = 1; i <= parser.DCOUNT(); ++i) { if (PrepareForConnectionTest_SINK(parser[i]) == false) { OK = false; } } } } if (OK) { Results.Add("Connection Handler Test PASSED"); SetState("Connection Handling", UPnPTestStates.Pass); } else { Results.Add("Connection Handler Test FAILED"); SetState("Connection Handling", UPnPTestStates.Failed); Master = UPnPTestStates.Failed; } OK = true; UPnPService[] _AVT = d.GetServices(CpAVTransport.SERVICE_NAME); if (_AVT.Length != 0) { // AVT Tests AVT = new CpAVTransport(_AVT[0]); if (!Test_AVTransport_LastChange()) { OK = false; } } if (OK) { Results.Add("Event Formatting PASSED"); SetState("Event Formatting", UPnPTestStates.Pass); } else { Results.Add("Event Formatting FAILED"); SetState("Event Formatting", UPnPTestStates.Failed); Master = UPnPTestStates.Failed; } OK = true; _AVT = d.GetServices(CpAVTransport.SERVICE_NAME); if (_AVT.Length != 0) { // AVT Tests AVT = new CpAVTransport(_AVT[0]); if (!Test_AVTransport_StateVariables()) { OK = false; } } if (OK) { Results.Add("StateVariable Values NOT TESTED (Not implemented)"); SetState("StateVariable Values", UPnPTestStates.Pass); } else { Results.Add("StateVariable Values FAILED"); SetState("StateVariable Values", UPnPTestStates.Failed); Master = UPnPTestStates.Failed; } // this.HTTP_ScenarioTest(); state = Master; }
private void AVT_LastChangeSink(CpAVTransport sender, string Val) { Ev.Set(); }