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
This commit is contained in:
parent
9c5418648f
commit
4d1fb48494
2 changed files with 225 additions and 0 deletions
164
apps/playlist.c
Normal file
164
apps/playlist.c
Normal file
|
@ -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:
|
||||
*/
|
61
apps/playlist.h
Normal file
61
apps/playlist.h
Normal file
|
@ -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__ */
|
Loading…
Reference in a new issue