View Javadoc

1   /***
2    *     Ambient - A music player for the Android platform
3    Copyright (C) 2007 Martin Vysny
4    
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation, either version 3 of the License, or
8    (at your option) any later version.
9    
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14  
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17   */
18  package sk.baka.ambient.playlist;
19  
20  import java.util.List;
21  import java.util.Map;
22  
23  import sk.baka.ambient.collection.TrackMetadataBean;
24  import sk.baka.ambient.commons.Interval;
25  import android.os.Handler;
26  
27  /***
28   * <p>
29   * An interface for a playlist. There are two playlist implementations -
30   * {@link StaticPlaylistStrategy} which holds a static playlist and supports
31   * random/repeat playmodes, and {@link DynamicPlaylistStrategy} which
32   * dynamically polls its datasource and modifies itself as the player propagates
33   * through the playlist.
34   * </p>
35   * <p>
36   * All implementations should be serializable. Thread-unsafe - it is recommended
37   * that all methods are invoked in the {@link Handler} thread.
38   * </p>
39   * 
40   * @author Martin Vysny
41   */
42  public interface IPlaylistStrategy {
43  	/***
44  	 * Sets the random mode. Currently played track must be preserved.
45  	 * 
46  	 * @param random
47  	 *            the random mode, never <code>null</code>.
48  	 */
49  	void setRandom(final Random random);
50  
51  	/***
52  	 * Returns current random mode.
53  	 * 
54  	 * @return the random mode, never <code>null</code>.
55  	 */
56  	Random getRandom();
57  
58  	/***
59  	 * Sorts the playlist with album order ordering.
60  	 */
61  	void sortByAlbumOrder();
62  
63  	/***
64  	 * Randomize the playlist.
65  	 */
66  	void shuffle();
67  
68  	/***
69  	 * Returns currently playing track. Note that the playlist is not connected
70  	 * to the player and the player itself may be paused or stopped.
71  	 * 
72  	 * @return currently playing track or <code>-1</code> if nothing is being
73  	 *         played. Index to the {@link #getPlayItems()} list.
74  	 */
75  	int getCurrentlyPlaying();
76  
77  	/***
78  	 * Moves to next track to be played. Returns <code>-1</code> if no more
79  	 * tracks are to be played - this also causes the
80  	 * {@link #getCurrentlyPlaying()} method to return <code>-1</code>.
81  	 * Calling this method while not playing anything will start to play first
82  	 * track.
83  	 * 
84  	 * @return play item to play next or <code>-1</code> if no more items are
85  	 *         to be played. Index to the {@link #getPlayItems()} list.
86  	 */
87  	int next();
88  
89  	/***
90  	 * Plays given track. The playback continues from this track forward, unless
91  	 * random play is activated.
92  	 * 
93  	 * @param track
94  	 *            the track to play. Index to the {@link #getPlayItems()} list.
95  	 *            If <code>-1</code> then the current track pointer is moved
96  	 *            before first track and the playback is stopped.
97  	 * @return the track that is being played.
98  	 */
99  	int play(final int track);
100 
101 	/***
102 	 * Returns previous track to be played. Returns <code>-1</code> if we are
103 	 * at the beginning of the playing track sequence. Calling this method while
104 	 * not playing anything will start to play last track.
105 	 * 
106 	 * @return which item was played prior current track or <code>-1</code> if
107 	 *         we are at the beginning of the playing track sequence.
108 	 */
109 	int previous();
110 
111 	/***
112 	 * Queue this track for playing, after all other queued tracks. Does nothing
113 	 * if the track is already queued.
114 	 * 
115 	 * @param tracks
116 	 *            the tracks to queue, index to the {@link #getPlayItems()}
117 	 *            list.
118 	 */
119 	void queue(final Interval tracks);
120 
121 	/***
122 	 * Dequeues given track if it was queued previously. Does nothing if the
123 	 * track is not present in the queue anymore.
124 	 * 
125 	 * @param track
126 	 *            the track to dequeue.
127 	 */
128 	void dequeue(final int track);
129 
130 	/***
131 	 * Clears queue from queued.
132 	 */
133 	void clearQueue();
134 
135 	/***
136 	 * Returns currently queued tracks.
137 	 * 
138 	 * @return queued tracks, never <code>null</code>.
139 	 */
140 	List<Integer> getQueue();
141 
142 	/***
143 	 * Returns the playlist length.
144 	 * 
145 	 * @return the playlist length.
146 	 */
147 	int size();
148 
149 	/***
150 	 * <p>
151 	 * Returns list of playlist items. The operation must be quick - it should
152 	 * for example provide immutable view on an internal playlist structure, it
153 	 * should not recompute the list anew on each call.
154 	 * </p>
155 	 * <p>
156 	 * Each PlaylistItem in the list must be an unique instance.
157 	 * </p>
158 	 * 
159 	 * @return list of playlist items, will not be modified.
160 	 */
161 	List<PlaylistItem> getPlayItems();
162 
163 	/***
164 	 * Reinitializes the playlist - recomputes new random track ordering etc.
165 	 * Removes all queued tracks and stops the playback ({@link #getCurrentlyPlaying()}
166 	 * will return <code>-1</code>).
167 	 */
168 	void reinit();
169 
170 	/***
171 	 * Inserts given tracks before track with given index.
172 	 * 
173 	 * @param index
174 	 *            the index, must not be negative.
175 	 * @param tracks
176 	 *            the tracks meta, must not be <code>null</code>.
177 	 */
178 	void add(final int index, final List<TrackMetadataBean> tracks);
179 
180 	/***
181 	 * Removes tracks with given index from the playlist. If currently played
182 	 * track is removed then the current song must be set to <code>-1</code>.
183 	 * 
184 	 * @param interval
185 	 *            the interval to remove
186 	 */
187 	void remove(final Interval interval);
188 
189 	/***
190 	 * Moves selected tracks before track with given index. Correctly updates
191 	 * queue indices. Currently played track will not be changed, although the
192 	 * track index may change.
193 	 * 
194 	 * @param interval
195 	 *            the interval to move
196 	 * @param targetIndex
197 	 *            move tracks before track with this index. If this index is
198 	 *            contained in the interval then nothing is done.
199 	 * @return a new interval which contains all moved tracks.
200 	 * @throws IllegalArgumentException
201 	 *             if the interval exceeds the playlist.
202 	 */
203 	Interval move(final Interval interval, final int targetIndex);
204 
205 	/***
206 	 * <p>
207 	 * Moves selected tracks up or down at least <code>delta</code> tracks,
208 	 * depending on the 'delta' value. The playlist may decide to move tracks by
209 	 * more tracks than requested - for example, the dynamic playlist will skip
210 	 * the currently playing/queued tracks. If the move is not possible (for
211 	 * example there are not enough tracks) then move the tracks to the
212 	 * beginning (or end) of the playlist.
213 	 * </p>
214 	 * <p>
215 	 * Currently played track will not be changed, although the queue indices.
216 	 * Currently played track will not be changed, although the track index may
217 	 * change.
218 	 * </p>
219 	 * 
220 	 * @param interval
221 	 *            the interval to move
222 	 * @param delta
223 	 *            move tracks up 'delta' tracks (if delta is negative), or down
224 	 *            'delta' tracks (if delta is positive). Do nothing if delta is
225 	 *            zero.
226 	 * @return a new interval which contains all moved tracks.
227 	 * @throws IllegalArgumentException
228 	 *             if the interval exceeds the playlist.
229 	 */
230 	Interval moveBy(final Interval interval, final int delta);
231 
232 	/***
233 	 * Peeks at the next track without actually changing the current track.
234 	 * 
235 	 * @return next track index. Returns <code>-1</code> when there's no track
236 	 *         left. Dynamic playlist may return <code>-1</code> when there
237 	 *         are no upcoming tracks and the queue is empty.
238 	 */
239 	int peekNext();
240 
241 	/***
242 	 * Modifies the playlist by changing all {@link PlaylistItem} locations.
243 	 * 
244 	 * @param locationMap
245 	 *            maps old locations to new locations.
246 	 */
247 	void replaceLocations(final Map<String, String> locationMap);
248 }