Enlightenment CVS committal
Author : tsauerbeck
Project : misc
Module : eplayer
Dir : misc/eplayer/src
Modified Files:
callbacks.c eplayer.c eplayer.h playlist.h track.c track.h
Log Message:
Put the decoding/playing code in a separate thread. Seems to be stable :)
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/callbacks.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- callbacks.c 23 Oct 2003 17:01:49 -0000 1.9
+++ callbacks.c 25 Oct 2003 19:31:39 -0000 1.10
@@ -17,12 +17,13 @@
*/
void cb_play(ePlayer *player, Evas *e, Evas_Object *o, void *event) {
#ifdef DEBUG
- printf("Play callback entered\n");
+ printf("DEBUG: Play callback entered\n");
#endif
- if (!paused) /* restart from beginning */
+ if (!paused) { /* restart from beginning */
+ eplayer_playback_stop(player);
eplayer_playback_start(player, 1);
- else { /* continue playback */
+ } else { /* continue playback */
eplayer_playback_start(player, 0);
paused = 0;
}
@@ -38,13 +39,13 @@
*/
void cb_pause(ePlayer *player, Evas *e, Evas_Object *o, void *event) {
#ifdef DEBUG
- printf("Pause callback entered\n");
+ printf("DEBUG: Pause callback entered\n");
#endif
if (paused)
eplayer_playback_start(player, 0);
else
- eplayer_playback_stop(player, 0);
+ eplayer_playback_stop(player);
paused = !paused;
}
@@ -64,7 +65,7 @@
printf("DEBUG: Next File Called\n");
#endif
- eplayer_playback_stop(player, 0);
+ eplayer_playback_stop(player);
if (player->playlist->cur_item->next) {
player->playlist->cur_item = player->playlist->cur_item->next;
@@ -97,7 +98,7 @@
if (!player->playlist->cur_item->prev)
return;
- eplayer_playback_stop(player, 0);
+ eplayer_playback_stop(player);
/* Get the previous list item */
player->playlist->cur_item = player->playlist->cur_item->prev;
@@ -179,7 +180,9 @@
/* We don't care if you seek past the file, the play loop
* will catch EOF and play next file
*/
+ eplayer_playback_stop(player);
pli->plugin->set_current_pos(pli->plugin->get_current_pos() + 5);
+ eplayer_playback_start(player, 0);
}
void cb_seek_backward(void *udata, Evas_Object *obj,
@@ -191,9 +194,12 @@
#ifdef DEBUG
printf("DEBUG: Seeking backward - Current Pos: %i\n", cur_time);
#endif
+ eplayer_playback_stop(player);
if (cur_time < 6) /* restart from the beginning */
eplayer_playback_start(player, 1);
- else
+ else {
pli->plugin->set_current_pos(cur_time - 5);
+ eplayer_playback_start(player, 0);
+ }
}
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/eplayer.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- eplayer.c 23 Oct 2003 19:35:55 -0000 1.11
+++ eplayer.c 25 Oct 2003 19:31:39 -0000 1.12
@@ -76,6 +76,9 @@
if (!player)
return;
+ eplayer_playback_stop(player);
+ track_close(player);
+
playlist_free(player->playlist);
/* unload plugins */
@@ -85,6 +88,8 @@
for (l = player->input_plugins; l; l = l->next)
plugin_free(l->data);
+ pthread_mutex_destroy(&player->playback_mutex);
+
free(player);
}
@@ -131,6 +136,8 @@
return NULL;
}
+ pthread_mutex_init(&player->playback_mutex, NULL);
+
return player;
}
@@ -138,28 +145,22 @@
* Stops playback.
*
* @param player
- * @param rewind_track
*/
-void eplayer_playback_stop(ePlayer *player, int rewind_track) {
+void eplayer_playback_stop(ePlayer *player) {
if (!player)
return;
- /* stop the playloop */
- if (player->play_idler) {
- ecore_idler_del(player->play_idler);
- player->play_idler = NULL;
- }
-
/* stop the timer that updates the time part */
if (player->time_timer) {
ecore_timer_del(player->time_timer);
player->time_timer = NULL;
}
- if (rewind_track) {
- track_close(player);
- track_open(player);
- }
+ pthread_mutex_lock(&player->playback_mutex);
+ player->playback_stop = 1;
+ pthread_mutex_unlock(&player->playback_mutex);
+
+ pthread_join(player->playback_thread, NULL);
}
/**
@@ -174,33 +175,33 @@
track_open(player);
}
- /* start the playloop */
- player->play_idler = ecore_idler_add(track_play_chunk, player);
player->time_timer = ecore_timer_add(0.5, track_update_time,
player);
+
+ pthread_mutex_lock(&player->playback_mutex);
+ player->playback_stop = 0;
+ pthread_mutex_unlock(&player->playback_mutex);
+
+ pthread_create(&player->playback_thread, NULL,
+ (void *) &track_play_chunk, player);
}
int main(int argc, const char **argv) {
ePlayer *player;
int i;
- if (!(player = eplayer_new()))
- return 1;
-
if (argc == 1) {
printf("%s v%s - Usage: %s playlist.m3u [file.ogg] [some/dir]
...\n\n",
PACKAGE, VERSION, argv[0]);
return 1;
}
- /* Parse Args */
- for (i = 1; i < argc; i++) {
-#ifdef DEBUG
- printf("Adding file to playlist: %s\n", argv[i]);
-#endif
-
+ if (!(player = eplayer_new()))
+ return 1;
+
+ /* add files/directories/m3u's to the playlist */
+ for (i = 1; i < argc; i++)
playlist_load_any(player->playlist, argv[i], i > 1);
- }
if (!player->playlist->num) {
fprintf(stderr, "No files loaded!\n");
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/eplayer.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- eplayer.h 23 Oct 2003 19:35:55 -0000 1.9
+++ eplayer.h 25 Oct 2003 19:31:39 -0000 1.10
@@ -2,6 +2,7 @@
#define __EPLAYER_H
#include <Ecore.h>
+#include <pthread.h>
#include "playlist.h"
#include "plugin.h"
@@ -26,9 +27,12 @@
typedef struct {
PlayList *playlist;
- Ecore_Idler *play_idler;
Ecore_Timer *time_timer;
+ pthread_t playback_thread;
+ pthread_mutex_t playback_mutex;
+ int playback_stop;
+
OutputPlugin *output;
Evas_List *input_plugins; /* lists all available input plugins */
@@ -36,7 +40,7 @@
Gui gui;
} ePlayer;
-void eplayer_playback_stop(ePlayer *player, int rewind_track);
+void eplayer_playback_stop(ePlayer *player);
void eplayer_playback_start(ePlayer *player, int rewind_track);
#endif
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/playlist.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- playlist.h 23 Oct 2003 17:01:49 -0000 1.4
+++ playlist.h 25 Oct 2003 19:31:39 -0000 1.5
@@ -3,6 +3,7 @@
#include <Evas.h>
#include <limits.h>
+#include <pthread.h>
#include "plugin.h"
#ifdef __cplusplus
@@ -17,6 +18,9 @@
int duration;
int channels; /* number of channels */
long sample_rate; /* sample rate */
+
+ int current_pos;
+ pthread_mutex_t pos_mutex;
InputPlugin *plugin; /* plugin that's used for this item */
} PlayListItem;
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/track.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- track.c 24 Oct 2003 18:56:39 -0000 1.3
+++ track.c 25 Oct 2003 19:31:39 -0000 1.4
@@ -9,26 +9,25 @@
*
* @param udata Pointer to an ePlayer struct.
*/
-int track_play_chunk(void *udata) {
+void track_play_chunk(void *udata) {
#define BUF_SIZE 65536
ePlayer *player = udata;
PlayListItem *pli = player->playlist->cur_item->data;
- InputPlugin *plugin = pli->plugin;
int read;
static unsigned char pcmout[BUF_SIZE];
- /* read the data ... */
- if ((read = plugin->read(pcmout, BUF_SIZE))) {
- /* ...and play it */
+ while (!player->playback_stop &&
+ (read = pli->plugin->read(pcmout, BUF_SIZE))) {
player->output->play(pcmout, read);
- } else /* EOF -> move to the next track */
+
+ pthread_mutex_lock(&pli->pos_mutex);
+ pli->current_pos = pli->plugin->get_current_pos();
+ pthread_mutex_unlock(&pli->pos_mutex);
+ }
+
+ if (!player->playback_stop) /* EOF -> move to the next track */
edje_object_signal_emit(player->gui.edje,
"PLAY_NEXT", "next_button");
-
- /* the edje callback will re-add the idler, so we can remove it here,
- * in case ov_read() failed
- */
- return !!read;
}
int track_update_time(void *udata) {
@@ -37,7 +36,7 @@
static int old_time = -1;
int cur_time;
- cur_time = current_item->plugin->get_current_pos();
+ cur_time = current_item->current_pos;
if (player->cfg.time_display == TIME_DISPLAY_LEFT)
cur_time = current_item->duration - cur_time;
@@ -51,22 +50,18 @@
return 1;
}
-static int prepare_output(ePlayer *player) {
- PlayListItem *current = player->playlist->cur_item->data;
-
- return player->output->configure(current->channels,
- current->sample_rate, 16);
-}
-
/**
* Closes the current track.
*
* @param player
*/
void track_close(ePlayer *player) {
- PlayListItem *pli = player->playlist->cur_item->data;
+ PlayListItem *pli;
- pli->plugin->close();
+ if (player->playlist) {
+ pli = player->playlist->cur_item->data;
+ pli->plugin->close();
+ }
}
/**
@@ -79,6 +74,7 @@
assert(player->playlist->cur_item);
pli = player->playlist->cur_item->data;
+ pli->current_pos = 0;
pli->plugin->open(pli->file);
@@ -90,7 +86,7 @@
pli->comment[COMMENT_ID_ALBUM]);
edje_object_part_text_set(player->gui.edje, "time_text", "0:00");
- if (!prepare_output(player)) {
+ if (!player->output->configure(pli->channels, pli->sample_rate, 16)) {
fprintf(stderr, "Cannot configure output plugin\n");
/* move to the next track */
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/track.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- track.h 23 Oct 2003 17:01:49 -0000 1.1
+++ track.h 25 Oct 2003 19:31:39 -0000 1.2
@@ -3,7 +3,7 @@
#include "eplayer.h"
-int track_play_chunk(void *udata);
+void track_play_chunk(void *udata);
int track_update_time(void *udata);
void track_open(ePlayer *player);
-------------------------------------------------------
This SF.net email is sponsored by: The SF.net Donation Program.
Do you like what SourceForge.net is doing for the Open
Source Community? Make a contribution, and help us add new
features and functionality. Click here: http://sourceforge.net/donate/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs