summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-06-04 21:43:38 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-06-04 21:43:38 +0000
commit4d1fb48494284abc5a47bd70040d4f9ffe4649d4 (patch)
tree7ea9d0a64af75d12a4585cd16125cd44c7e618fb
parent9c5418648f538ba536645445febc69fdcd72c08d (diff)
downloadrockbox-4d1fb48494284abc5a47bd70040d4f9ffe4649d4.zip
rockbox-4d1fb48494284abc5a47bd70040d4f9ffe4649d4.tar.gz
rockbox-4d1fb48494284abc5a47bd70040d4f9ffe4649d4.tar.bz2
rockbox-4d1fb48494284abc5a47bd70040d4f9ffe4649d4.tar.xz
Moved playlist code here from the firmware directory, also adjusted it
and edited to support the mpeg thread request-style API. Believe it or not, but this passes my basic tests for playlist funcionality. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@890 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/playlist.c164
-rw-r--r--apps/playlist.h61
2 files changed, 225 insertions, 0 deletions
diff --git a/apps/playlist.c b/apps/playlist.c
new file mode 100644
index 0000000..60786f6
--- /dev/null
+++ b/apps/playlist.c
@@ -0,0 +1,164 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by wavey@wavey.org
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <malloc.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include "playlist.h"
+#include <file.h>
+#include "sprintf.h"
+#include "debug.h"
+
+playlist_info_t playlist;
+
+int index_array[1000];
+
+char now_playing[256];
+
+char* playlist_next(int type)
+{
+ int seek = playlist.indices[playlist.index];
+ int max;
+ int fd;
+ playlist.index = (playlist.index+1) % playlist.amount;
+
+ fd = open(playlist.filename, O_RDONLY);
+ if(-1 != fd) {
+ lseek(fd, seek, SEEK_SET);
+ max = read(fd, now_playing, sizeof(now_playing));
+ close(fd);
+
+ seek=0;
+ while((now_playing[seek] != '\n') &&
+ (now_playing[seek] != '\r') &&
+ (seek < max))
+ seek++;
+ if(seek == max)
+ seek = max-1;
+ now_playing[seek]=0;
+
+ return now_playing;
+ }
+ else
+ return NULL;
+}
+
+void play_list(char *dir, char *file)
+{
+ empty_playlist(&playlist);
+
+ snprintf(playlist.filename, sizeof(playlist.filename),
+ "%s/%s", dir, file);
+
+ /* add track indices to playlist data structure */
+ add_indices_to_playlist(&playlist);
+
+ /* if shuffle is wanted, this is where to do that */
+
+ /* also make the first song get playing */
+ mpeg_play(playlist_next(0));
+
+}
+
+/*
+ * remove any filename and indices associated with the playlist
+ */
+void empty_playlist( playlist_info_t *playlist )
+{
+ playlist->filename[0] = '\0';
+ playlist->index = 0;
+ playlist->amount = 0;
+}
+
+/*
+ * calculate track offsets within a playlist file
+ */
+void add_indices_to_playlist( playlist_info_t *playlist )
+{
+ char *p;
+ int i = 0;
+ unsigned char byte;
+ unsigned char lastbyte='\n';
+ int nread;
+
+ int fd;
+
+ fd = open(playlist->filename, O_RDONLY);
+ if(-1 == fd)
+ return; /* failure */
+
+ p = &byte;
+
+ /* loop thru buffer, store index whenever we get a new line */
+
+ while((nread = read(fd, &byte, 1)) == 1)
+ {
+ /* move thru (any) newlines */
+
+ if(( byte != '\n' ) && ( byte != '\r' ) &&
+ ((lastbyte == '\n') || (lastbyte == '\r'))) {
+ /* we're now at the start of a new track filename. store index */
+
+ DEBUGF("tune %d at position %d\n", playlist->amount, i);
+ playlist->indices [ playlist->amount ] = i;
+ playlist->amount++;
+ }
+ i++;
+ lastbyte = byte;
+ }
+
+ close(fd);
+}
+
+/*
+ * randomly rearrange the array of indices for the playlist
+ */
+void randomise_playlist( playlist_info_t *playlist, unsigned int seed )
+{
+ int count = 0;
+ int candidate;
+ int store;
+
+ /* seed with the given seed */
+ srand( seed );
+
+ /* randomise entire indices list */
+
+ while( count < playlist->amount )
+ {
+ /* the rand is from 0 to RAND_MAX, so adjust to our value range */
+ candidate = rand() % ( playlist->amount );
+
+ /* now swap the values at the 'count' and 'candidate' positions */
+ store = playlist->indices[candidate];
+ playlist->indices[candidate] = playlist->indices[count];
+ playlist->indices[count] = store;
+
+ /* move along */
+ count++;
+ }
+}
+
+/* -----------------------------------------------------------------
+ * local variables:
+ * eval: (load-file "../firmware/rockbox-mode.el")
+ * end:
+ */
diff --git a/apps/playlist.h b/apps/playlist.h
new file mode 100644
index 0000000..2271403
--- /dev/null
+++ b/apps/playlist.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by wavey@wavey.org
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef __PLAYLIST_H__
+#define __PLAYLIST_H__
+
+/* playlist data */
+
+#define MAX_PLAYLIST_SIZE 1000
+typedef struct
+{
+ char filename[256]; /* path name of m3u playlist on disk */
+ int indices[MAX_PLAYLIST_SIZE]; /* array of indices */
+ int index; /* index of *NEXT* track to play */
+ int seed; /* random seed */
+ int amount; /* number of tracks in the index */
+} playlist_info_t;
+
+void play_list(char *dir, char *file);
+
+void read_entire_file( char *buf, const char *filename );
+void load_playlist( playlist_info_t *playlist, const char *filename );
+void extract_playlist_indices( char *buf, playlist_info_t *playlist );
+void display_current_playlist( playlist_info_t *playlist );
+void get_indices_as_string( char *string, playlist_info_t *playlist );
+void empty_playlist( playlist_info_t *playlist );
+void add_indices_to_playlist( playlist_info_t *playlist );
+void extend_indices( playlist_info_t *playlist, int new_index );
+void randomise_playlist( playlist_info_t *playlist, unsigned int seed );
+int is_unused_random_in_list( int number, int *original_list, int count );
+
+/**********/
+
+
+
+
+
+
+int create_playlist( void );
+/*int add_to_playlist( track_t *track );*/
+int remove_from_playlist( int index );
+int set_playlist_position( void );
+/*track_t * get_previous_entry_in_playlist( void );*/
+
+#endif /* __PLAYLIST_H__ */