Exemplo n.º 1
0
        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();
                }
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
 public void SetTransportState(ETransportState aTransportState)
 {
     iMutex.WaitOne();
     iTransportState = aTransportState;
     iMutex.ReleaseMutex();
     Invalidate();
 }
Exemplo n.º 4
0
 public void SetTransportState(ETransportState aTransportState)
 {
     lock (this)
     {
         iTransportState = aTransportState;
         if (iOpen)
         {
             SetCentreButtonImage(aTransportState, iDuration, iAllowPausing);
         }
     }
 }
Exemplo n.º 5
0
        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&paramid=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);
        }
Exemplo n.º 6
0
 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;
            }
        }