View Javadoc
1   /*
2    * Copyright (C) 2013 4th Line GmbH, Switzerland
3    *
4    * The contents of this file are subject to the terms of either the GNU
5    * Lesser General Public License Version 2 or later ("LGPL") or the
6    * Common Development and Distribution License Version 1 or later
7    * ("CDDL") (collectively, the "License"). You may not use this file
8    * except in compliance with the License. See LICENSE.txt for more
9    * information.
10   *
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14   */
15  package example.mediarenderer;
16  
17  import org.fourthline.cling.support.avtransport.impl.state.AbstractState;
18  import org.fourthline.cling.support.avtransport.impl.state.Stopped;
19  import org.fourthline.cling.support.model.AVTransport;
20  import org.fourthline.cling.support.model.SeekMode;
21  
22  import java.net.URI;
23  
24  /**
25   * <p>
26   * The Stopped state has many possible transitions, from here a control point
27   * can decide to play, seek, skip to the next track, and so on. The following
28   * example is really not doing much, how you implement these triggers and
29   * state transitions is completely dependend on the design of your playback
30   * engine - this is only the scaffolding:
31   * </p>
32   * <a class="citation" href="javacode://this" style="include: INC1"/>
33   * <p>
34   * Each state can have two magic methods: <code>onEntry()</code> and
35   * <code>onExit()</code> - they do exactly what the name says. Don't forget
36   * to call the superclass' method if you decide to use them!
37   * </p>
38   */
39  public class MyRendererStopped extends Stopped { // DOC:INC1
40  
41      public MyRendererStopped(AVTransport transport) {
42          super(transport);
43      }
44  
45      public void onEntry() {
46          super.onEntry();
47          // Optional: Stop playing, release resources, etc.
48      }
49  
50      public void onExit() {
51          // Optional: Cleanup etc.
52      }
53  
54      @Override
55      public Class<? extends AbstractState> setTransportURI(URI uri, String metaData) {
56          // This operation can be triggered in any state, you should think
57          // about how you'd want your player to react. If we are in Stopped
58          // state nothing much will happen, except that you have to set
59          // the media and position info, just like in MyRendererNoMediaPresent.
60          // However, if this would be the MyRendererPlaying state, would you
61          // prefer stopping first?
62          return MyRendererStopped.class;
63      }
64  
65      @Override
66      public Class<? extends AbstractState> stop() {
67          /// Same here, if you are stopped already and someone calls STOP, well...
68          return MyRendererStopped.class;
69      }
70  
71      @Override
72      public Class<? extends AbstractState> play(String speed) {
73          // It's easier to let this classes' onEntry() method do the work
74          return MyRendererPlaying.class;
75      }
76  
77      @Override
78      public Class<? extends AbstractState> next() {
79          return MyRendererStopped.class;
80      }
81  
82      @Override
83      public Class<? extends AbstractState> previous() {
84          return MyRendererStopped.class;
85      }
86  
87      @Override
88      public Class<? extends AbstractState> seek(SeekMode unit, String target) {
89          // Implement seeking with the stream in stopped state!
90          return MyRendererStopped.class;
91      }
92  } // DOC:INC1