public void SetTransportState(ETransportState aTransportState) { if (iOpen) { iTransportState = aTransportState; if (aTransportState == ETransportState.eStopped) { SetSeconds(0); } else { SetSeconds(iSeconds); } iControl.Dimmed = (aTransportState == ETransportState.ePaused); if (aTransportState == ETransportState.eBuffering) { iViewHourGlass.Start(); } else { iViewHourGlass.Stop(); } } }
private void SetCentreButtonImage(ETransportState aTransportState, uint aDuration, bool aAllowPausing) { switch (aTransportState) { case ETransportState.eBuffering: iButtonCentre.SetImage(kImageStop, UIControlState.Normal); iButtonCentre.SetImage(kImageStopOver, UIControlState.Highlighted); break; case ETransportState.ePlaying: if (aDuration == 0 || !aAllowPausing) { iButtonCentre.SetImage(kImageStop, UIControlState.Normal); iButtonCentre.SetImage(kImageStopOver, UIControlState.Highlighted); } else { iButtonCentre.SetImage(kImagePause, UIControlState.Normal); iButtonCentre.SetImage(kImagePauseOver, UIControlState.Highlighted); } break; case ETransportState.ePaused: case ETransportState.eStopped: case ETransportState.eUnknown: iButtonCentre.SetImage(kImagePlay, UIControlState.Normal); iButtonCentre.SetImage(kImagePlayOver, UIControlState.Highlighted); break; default: Assert.Check(false); break; } }
public void SetTransportState(ETransportState aTransportState) { iMutex.WaitOne(); iTransportState = aTransportState; iMutex.ReleaseMutex(); Invalidate(); }
public void SetTransportState(ETransportState aTransportState) { lock (this) { iTransportState = aTransportState; if (iOpen) { SetCentreButtonImage(aTransportState, iDuration, iAllowPausing); } } }
public void ConnectionStart() { if (_connectionId > 0 || (_connectionThread != null && _connectionThread.ThreadState == Thread.eThreadStates.ThreadRunning)) { return; } _connectionActive = true; _connectionWait.Reset(); CloudLog.Notice("{0} Initialize() called", GetType().Name); _connectionThread = new Thread(specific => { while (_connectionActive && !_programStopping) { var suppressErrors = false; UriBuilder uri; Task <HttpResponseMessage> task; HttpResponseMessage response; Task <string> readTask; string content; JToken json; while (_connectionId == 0) { try { uri = new UriBuilder("http", _ipAddress, 80, string.Format("config")) { Query = "action=connect" }; Debug.WriteInfo("Trying to connect to " + uri.Uri); task = _client.GetAsync(uri.Uri); response = task.Await(); response.EnsureSuccessStatusCode(); readTask = response.Content.ReadAsStringAsync(); content = readTask.Await(); #if DEBUG Debug.WriteInfo("Response content:\r\n" + content); #endif json = JToken.Parse(content); _connectionId = int.Parse(json["connectionid"].Value <string>()); CloudLog.Debug("{0} connected and received conenction id of \"{1}\"", GetType().Name, _connectionId); try { var eventInfo = json["configevents"].First; _currentClip = eventInfo["eParamID_CurrentClip"].Value <string>(); _transportState = (ETransportState)int.Parse(eventInfo["eParamID_TransportState"].Value <string>()); OnTransportModeChanged(this); } catch (Exception e) { Debug.WriteWarn("Could not parse configevents on connect, {0}", e.Message); } } catch (Exception e) { if (!suppressErrors) { suppressErrors = true; CloudLog.Error("Error trying to connect to {0}, {1}", GetType().Name, e.Message); CloudLog.Warn("{0} will try again in 5 seconds", GetType().Name); } _connectionWait.Wait(5000); DeviceCommunicating = false; } } DeviceCommunicating = true; uri = new UriBuilder("http", _ipAddress, 80, string.Format("config")) { Query = "action=get¶mid=eParamID_TransportState" }; Debug.WriteInfo("Trying to connect to " + uri.Uri); task = _client.GetAsync(uri.Uri); response = task.Await(); response.EnsureSuccessStatusCode(); readTask = response.Content.ReadAsStringAsync(); content = readTask.Await(); #if DEBUG Debug.WriteWarn("Response content:\r\n" + content); #endif json = JToken.Parse(content); TransportState = (ETransportState)int.Parse(json["value"].Value <string>()); while (_connectionActive) { var timeStamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; uri = new UriBuilder("http", _ipAddress, 80, string.Format("config")) { Query = string.Format("action=wait_for_config_events&connectionid={0}&_={1}", _connectionId, timeStamp) }; Debug.WriteInfo("Trying to connect to " + uri.Uri); task = _client.GetAsync(uri.Uri); response = task.Await(); if (response.StatusCode == HttpStatusCode.Gone) { _connectionId = 0; break; } response.EnsureSuccessStatusCode(); readTask = response.Content.ReadAsStringAsync(); content = readTask.Await(); #if DEBUG Debug.WriteWarn("Response content:\r\n" + content); #endif json = JToken.Parse(content); foreach (var item in json) { var paramId = item["param_id"].Value <string>(); switch (paramId) { case "eParamID_DisplayTimecode": _timeCode = item["str_value"].Value <string>(); break; case "eParamID_CurrentClip": _currentClip = item["str_value"].Value <string>(); break; case "eParamID_TransportState": _transportState = (ETransportState)item["int_value"].Value <int>(); break; } } OnTransportModeChanged(this); CrestronEnvironment.AllowOtherAppsToRun(); _connectionWait.Wait(100); } } _connectionId = 0; return(null); }, null); }
public void SetTransportState(ETransportState aTransportState) { }
private void EventStateLastChangeResponse(object sender, EventArgs e) { try { string lastChange = iServiceAVTransport.LastChange; if (lastChange != null) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(lastChange); XmlNamespaceManager xmlNsMan = new XmlNamespaceManager(xmlDoc.NameTable); xmlNsMan.AddNamespace("ns", "urn:schemas-upnp-org:metadata-1-0/AVT/"); XmlNodeList eventList = xmlDoc.DocumentElement.SelectNodes("/ns:Event/ns:InstanceID", xmlNsMan); foreach (XmlNode n in eventList) { XmlNodeList valList = n.SelectNodes("@val", xmlNsMan); foreach (XmlAttribute v in valList) { if (uint.Parse(v.Value) == iInstanceId) { XmlNode state = n.SelectSingleNode("ns:CurrentTrackURI", xmlNsMan); string trackUri = string.Empty; if (state != null) { XmlNode val = state.SelectSingleNode("@val", xmlNsMan); if (val != null) { trackUri = val.Value; } } if (iExpectedTrack != null && trackUri == iExpectedTrack.Uri) { iMaster = true; } else if (iTrackPlaylistItem == null || trackUri != iTrackPlaylistItem.Uri) { iMaster = false; } state = n.SelectSingleNode("ns:CurrentTrackMetaData", xmlNsMan); if (state != null) { XmlNode val = state.SelectSingleNode("@val", xmlNsMan); if (val != null) { MrItem trackPlaylistItem = null; try { if (!iMaster) { DidlLite didl = new DidlLite(val.Value); if (didl.Count == 0) { item item = new item(); item.Title = trackUri; didl.Add(item); } // hack for sonos devices artwork (which specifies a relative path) if (didl[0].AlbumArtUri.Count > 0 && didl[0].AlbumArtUri[0] != string.Empty) { string albumArt = didl[0].AlbumArtUri[0]; if (albumArt.StartsWith("/getaa?", StringComparison.OrdinalIgnoreCase)) { try { Uri uri = new Uri(Device.Location); string newUri = string.Format("{0}://{1}{2}", uri.Scheme, uri.Authority, albumArt); didl[0].AlbumArtUri[0] = newUri; } catch { } } } trackPlaylistItem = new MrItem(++iTrackId, trackUri, didl); Trace.WriteLine(Trace.kMediaRenderer, "ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: uri=" + trackPlaylistItem.Uri + ", metadata=" + trackPlaylistItem.DidlLite.Xml); } } catch (XmlException) { DidlLite didl = new DidlLite(); item item = new item(); item.Title = trackUri; didl.Add(item); trackPlaylistItem = new MrItem(++iTrackId, trackUri, didl); Trace.WriteLine(Trace.kMediaRenderer, "ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: uri=" + trackUri + ", metadata="); } Trace.WriteLine(Trace.kTopology, "iMaster=" + iMaster + ", trackUri=" + trackUri + ", iTrackPlaylistItem.Uri=" + ((iTrackPlaylistItem == null) ? "" : iTrackPlaylistItem.Uri) + ", iExpectedUri=" + ((iExpectedTrack == null) ? "" : iExpectedTrack.Uri)); bool changed = false; if (iExpectedTrack != null && trackUri == iExpectedTrack.Uri) { SetCurrent(iExpectedTrack); iTrackIndex = iPlaylist.IndexOf(iExpectedTrack); iExpectedTrack = null; changed = true; } else if (iTrackPlaylistItem == null || trackUri != iTrackPlaylistItem.Uri) { SetCurrent(trackPlaylistItem); iTrackIndex = -1; iExpectedTrack = null; changed = true; } if (changed) { if (EventTrackChanged != null) { EventTrackChanged(this, EventArgs.Empty); } if (iEventTrackChanged != null) { iEventTrackChanged(this, EventArgs.Empty); } if (EventMetaTextChanged != null) { EventMetaTextChanged(this, EventArgs.Empty); } if (EventDetailsChanged != null) { EventDetailsChanged(this, EventArgs.Empty); } } } } state = n.SelectSingleNode("ns:TransportState", xmlNsMan); if (state != null) { XmlNode val = state.SelectSingleNode("@val", xmlNsMan); if (val != null) { ETransportState transportState = ETransportState.eUnknown; if (val.Value == "PLAYING") { transportState = ETransportState.ePlaying; } else if (val.Value == "PAUSED_PLAYBACK") { transportState = ETransportState.ePaused; } else if (val.Value == "STOPPED") { transportState = ETransportState.eStopped; } else if (val.Value == "TRANSITIONING") { transportState = ETransportState.eBuffering; } else { transportState = ETransportState.eUnknown; } Trace.WriteLine(Trace.kMediaRenderer, "ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: transportState=" + transportState); if (transportState != iTransportState) { iTransportState = transportState; if (iTransportState == ETransportState.eStopped) { if (iMaster) { if (!iExpectEventStop) { Next(); } } iExpectEventStop = false; } if (EventTransportStateChanged != null) { EventTransportStateChanged(this, EventArgs.Empty); } } } } /*state = n.SelectSingleNode("ns:CurrentTrack", xmlNsMan); * if (state != null) * { * XmlNode val = state.SelectSingleNode("@val", xmlNsMan); * if (val != null) * { * int trackIndex = int.Parse(val.Value) - 1; * * Trace.WriteLine(Trace.kMediaRenderer, "ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: trackIndex=" + trackIndex); * * if (trackIndex != iTrackIndex) * { * iTrackIndex = trackIndex; * * if (EventTrackChanged != null) * { * EventTrackChanged(this, EventArgs.Empty); * } * } * } * }*/ state = n.SelectSingleNode("ns:CurrentTrackDuration", xmlNsMan); if (state != null) { XmlNode val = state.SelectSingleNode("@val", xmlNsMan); if (val != null) { try { Time duration = new Time(val.Value); Assert.CheckDebug(duration.SecondsTotal >= 0); uint trackDuration = (duration.SecondsTotal >= 0) ? (uint)duration.SecondsTotal : 0; Trace.WriteLine(Trace.kMediaRenderer, "ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: trackDuration=" + duration.ToPrettyString()); iTrackDuration = trackDuration; if (EventDurationChanged != null) { EventDurationChanged(this, EventArgs.Empty); } } catch (Time.TimeInvalid) { if (val.Value != kNotImplemented) { UserLog.WriteLine("ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: Invalid element CurrentTrackDuration: " + val.Value); } } } } } } } } } catch (Exception ex) { string lastChange = iServiceAVTransport.LastChange != null ? iServiceAVTransport.LastChange : ""; Trace.WriteLine(Trace.kMediaRenderer, "ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: " + ex.Message + "\nLastChange: " + lastChange); UserLog.WriteLine("ModelSourceMediaRendererUpnpAv.EventStateLastChangeResponse: " + ex.Message + "\nLastChange: " + lastChange); return; } }