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

Reply via email to