Enlightenment CVS committal
Author : tsauerbeck
Project : misc
Module : eplayer
Dir : misc/eplayer/src
Modified Files:
callbacks.c callbacks.h eplayer.c eplayer.h interface.c
interface.h mixer.c mixer.h playlist.c vorbis.c vorbis.h
Log Message:
Cleaned up mixer code, the mixer is periodically read now to reflect changes made by
other apps, the time part is updated in a sane period now, libao calls have been
tidied up. theme changes: buttons emit their signals on mouse_up now (used to be
mouse_down)
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/callbacks.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- callbacks.c 16 Oct 2003 14:54:33 -0000 1.3
+++ callbacks.c 17 Oct 2003 17:00:27 -0000 1.4
@@ -1,52 +1,47 @@
+#include <config.h>
#include <Edje.h>
#include "eplayer.h"
#include "mixer.h"
#include "vorbis.h"
+#include "interface.h"
-static int paused = 1;
-
-void unpause_playback(ePlayer *data, Evas *e, Evas_Object *obj, void *event_info) {
- /* This ensures we don't call this callback multiple times */
- if (!paused)
- return;
+static int paused = 0;
+void cb_play(ePlayer *player, Evas *e, Evas_Object *obj,
+ void *event_info) {
#ifdef DEBUG
- printf("Unpause callback entered\n");
+ printf("Play callback entered\n");
#endif
-
- paused = 0;
- data->play_idler = ecore_idler_add(play_loop, data); /* Start the play idler */
+ if (!paused) /* restart from beginning */
+ eplayer_playback_start(player, 1);
+ else { /* continue playback */
+ eplayer_playback_start(player, 0);
+ paused = 0;
+ }
}
-void pause_playback(ePlayer *player, Evas *e, Evas_Object *obj,
- void *event_info) {
- if (paused)
- return;
-
+void cb_pause(ePlayer *player, Evas *e, Evas_Object *obj,
+ void *event_info) {
#ifdef DEBUG
printf("Pause callback entered\n");
#endif
- paused = 1;
+ if (paused)
+ eplayer_playback_start(player, 0);
+ else
+ eplayer_playback_stop(player, 0);
- /* Stop the current playing stream */
- if (player->play_idler) {
- ecore_idler_del(player->play_idler);
- player->play_idler = NULL;
- }
+ paused = !paused;
}
-void next_file(ePlayer *player, Evas *e, Evas_Object *obj, void *event_info) {
+void cb_track_next(ePlayer *player, Evas *e, Evas_Object *obj,
+ void *event_info) {
#ifdef DEBUG
printf("DEBUG: Next File Called\n");
#endif
-
- /* Stop the current playing stream */
- if (player->play_idler) {
- ecore_idler_del(player->play_idler);
- player->play_idler = NULL;
- }
+
+ eplayer_playback_stop(player, 0);
/* Get the next list item */
player->playlist->cur_item = player->playlist->cur_item->next;
@@ -68,21 +63,16 @@
}
/* Start the play loop */
- open_track(player);
- player->play_idler = ecore_idler_add(play_loop, player);
+ eplayer_playback_start(player, 1);
}
-void prev_file(ePlayer *player, Evas *e, Evas_Object *obj,
- void *event_info) {
+void cb_track_prev(ePlayer *player, Evas *e, Evas_Object *obj,
+ void *event_info) {
#ifdef DEBUG
printf("DEBUG: Previous File Called\n");
#endif
- if (player->play_idler) {
- /* Stop the current playing stream */
- ecore_idler_del(player->play_idler);
- player->play_idler = NULL;
- }
+ eplayer_playback_stop(player, 0);
/* Get the previous list item */
if (!player->playlist->cur_item->prev)
@@ -91,38 +81,31 @@
player->playlist->cur_item = player->playlist->cur_item->prev;
/* Start the play loop */
- open_track (player);
- player->play_idler = ecore_idler_add(play_loop, player);
+ eplayer_playback_start(player, 1);
}
-void raise_vol(ePlayer *player, Evas_Object *obj, const char *emission,
- const char *src) {
- int vol;
-
+void cb_volume_raise(ePlayer *player, Evas_Object *obj,
+ const char *emission, const char *src) {
#ifdef DEBUG
printf("DEBUG: Raising volume\n");
#endif
- vol = read_mixer(player);
- set_mixer(vol + 1);
- read_mixer(player);
+ mixer_change(player->mixer, 5);
+ refresh_volume(player, 0);
}
-void lower_vol(ePlayer *player, Evas_Object *obj, const char *emission,
- const char *src) {
- int vol;
-
+void cb_volume_lower(ePlayer *player, Evas_Object *obj,
+ const char *emission, const char *src) {
#ifdef DEBUG
printf("DEBUG: Lowering volume\n");
#endif
- vol = read_mixer(player);
- set_mixer(vol - 1);
- read_mixer(player);
+ mixer_change(player->mixer, -5);
+ refresh_volume(player, 0);
}
-void switch_time_display(ePlayer *player, Evas_Object *obj,
- const char *emission, const char *src) {
+void cb_time_display_toggle(ePlayer *player, Evas_Object *obj,
+ const char *emission, const char *src) {
player->time_display = !player->time_display;
update_time(player);
}
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/callbacks.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- callbacks.h 16 Oct 2003 14:54:33 -0000 1.1
+++ callbacks.h 17 Oct 2003 17:00:28 -0000 1.2
@@ -3,23 +3,23 @@
#include <Evas.h>
-void unpause_playback(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
-void pause_playback(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
+void cb_play(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
+void cb_pause(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
-void next_file(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
-void prev_file(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
+void cb_track_next(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
+void cb_track_prev(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
-void switch_time_display(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
+void cb_time_display_toggle(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
-void raise_vol(void *udata, Evas_Object *obj, const char *emission,
- const char *src);
-void lower_vol(void *udata, Evas_Object *obj, const char *emission,
- const char *src);
+void cb_volume_raise(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
+void cb_volume_lower(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
#endif
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/eplayer.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- eplayer.c 16 Oct 2003 14:54:33 -0000 1.5
+++ eplayer.c 17 Oct 2003 17:00:28 -0000 1.6
@@ -1,25 +1,114 @@
/* Eplayer OggVorbis Player - Phase 3 - Started 5/6/03 */
/* Edje Overhaul startnig phase 4 - Started 7/30/03 */
+#include <config.h>
#include <Ecore_Evas.h>
#include "eplayer.h"
#include "interface.h"
#include "vorbis.h"
+static ePlayer *eplayer_new() {
+ ePlayer *player;
+ ao_info *driver_info;
+
+ if (!(player = malloc(sizeof(ePlayer))))
+ return NULL;
+
+ memset(player, 0, sizeof(ePlayer));
+
+ player->playlist = playlist_new();
+
+ /* FIXME: the user should be able to choose which control
+ * will be used
+ */
+ player->mixer = mixer_new(MIXER_CONTROL_VOL);
+
+ ao_initialize();
+ driver_info = ao_driver_info(ao_default_driver_id());
+
+#ifdef DEBUG
+ printf("AO DEBUG: Audio Device: %s\n", driver_info->name);
+#endif
+
+ return player;
+}
+
+static void eplayer_free(ePlayer *player) {
+ if (!player)
+ return;
+
+ playlist_free(player->playlist);
+ mixer_free(player->mixer);
+ ao_shutdown();
+
+ free(player);
+}
+
+/**
+ * Stops playback.
+ *
+ * @param player
+ * @param rewind_track
+ */
+void eplayer_playback_stop(ePlayer *player, int rewind_track) {
+ 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);
+ }
+}
+
+/**
+ * Starts playback.
+ *
+ * @param player
+ * @param rewind_track
+ */
+void eplayer_playback_start(ePlayer *player, int rewind_track) {
+ if (rewind_track) {
+ track_close(player);
+ track_open(player);
+ }
+
+ /* start the playloop */
+ player->play_idler = ecore_idler_add(track_play_chunk, player);
+ player->time_timer = ecore_timer_add(0.5, update_time, player);
+}
+
+static int read_mixer(void *udata) {
+ refresh_volume(udata, 1);
+
+ return 1;
+}
+
int main(int argc, const char **argv) {
ePlayer *player;
int args;
- player = malloc(sizeof(ePlayer));
- memset(player, 0, sizeof(ePlayer));
+ if (!(player = eplayer_new())) {
+ fprintf(stderr, "Out of memory!\n");
+ return 1;
+ }
if (argc == 1) {
printf("eVorbisPlayer v0.7 - Usage: %s playlist.m3u [file.ogg]
[some/dir] ...\n\n", argv[0]);
return 1;
}
- player->playlist = playlist_new();
-
/* Parse Args */
for (args = 1; args < argc; args++) {
#ifdef DEBUG
@@ -32,9 +121,11 @@
setup_ecore(player);
show_playlist(player);
- /*ecore_timer_add (1.5, mixer_refresh, st_session);*/
+ read_mixer(player);
+ ecore_timer_add(1.5, read_mixer, player);
- open_track (player);
+ track_open(player);
+ refresh_time(player, 0);
#ifdef DEBUG
printf("DEBUG: Starting main loop\n");
@@ -42,8 +133,7 @@
ecore_main_loop_begin();
- playlist_free(player->playlist);
- free(player);
+ eplayer_free(player);
ecore_evas_shutdown();
ecore_shutdown();
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/eplayer.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- eplayer.h 16 Oct 2003 14:54:33 -0000 1.3
+++ eplayer.h 17 Oct 2003 17:00:29 -0000 1.4
@@ -2,20 +2,21 @@
#define __EPLAYER_H
#include <Ecore.h>
-#include <config.h>
+#include <vorbis/vorbisfile.h>
+#include <ao/ao.h>
#include "playlist.h"
-
-#define WIDTH 500
-#define HEIGHT 500
+#include "mixer.h"
typedef enum {
- TIME_DISPLAY_LEFT,
- TIME_DISPLAY_ELAPSED
+ TIME_DISPLAY_ELAPSED,
+ TIME_DISPLAY_LEFT
} TimeDisplay;
typedef struct {
PlayList *playlist;
+ Mixer *mixer;
Ecore_Idler *play_idler;
+ Ecore_Timer *time_timer;
struct {
Evas *evas;
@@ -24,7 +25,13 @@
} gui;
TimeDisplay time_display;
+
+ OggVorbis_File current_track;
+ ao_device *ao_dev;
} ePlayer;
+
+void eplayer_playback_stop(ePlayer *player, int rewind_track);
+void eplayer_playback_start(ePlayer *player, int rewind_track);
#endif
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/interface.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- interface.c 16 Oct 2003 17:25:40 -0000 1.4
+++ interface.c 17 Oct 2003 17:00:29 -0000 1.5
@@ -1,3 +1,4 @@
+#include <config.h>
#include "eplayer.h"
#include <Ecore_Evas.h>
#include <Esmart/container.h>
@@ -6,7 +7,9 @@
#include "mixer.h"
#include "vorbis.h"
-/* ECORE/EVAS */
+#define WIDTH 500
+#define HEIGHT 500
+
static Ecore_Evas *ee = NULL;
static int app_signal_exit(void *data, int type, void *event) {
@@ -76,34 +79,31 @@
/*** Edje Callbacks ***************************/
edje_object_signal_callback_add(player->gui.edje,
"PLAY_PREVIOUS", "previous_button",
- prev_file, player);
+ cb_track_prev, player);
edje_object_signal_callback_add(player->gui.edje,
"PLAY_NEXT", "next_button",
- next_file, player);
+ cb_track_next, player);
edje_object_signal_callback_add(player->gui.edje,
"SEEK_BACK", "seekback_button",
- seek_backward, player);
+ cb_seek_backward, player);
edje_object_signal_callback_add(player->gui.edje,
"SEEK_FORWARD", "seekforward_button",
- seek_forward, player);
+ cb_seek_forward, player);
edje_object_signal_callback_add(player->gui.edje,
"PLAY", "play_button",
- unpause_playback, player);
+ cb_play, player);
edje_object_signal_callback_add(player->gui.edje,
"PAUSE", "pause_button",
- pause_playback, player);
+ cb_pause, player);
edje_object_signal_callback_add(player->gui.edje,
"VOL_INCR", "vol_incr_button",
- raise_vol, player);
+ cb_volume_raise, player);
edje_object_signal_callback_add(player->gui.edje,
"VOL_DECR", "vol_decr_button",
- lower_vol, player);
+ cb_volume_lower, player);
edje_object_signal_callback_add(player->gui.edje,
"SWITCH_TIME_DISPLAY", "time_text",
- switch_time_display, player);
-
- /* Update interface with current PCM Volume Setting */
- read_mixer(player);
+ cb_time_display_toggle, player);
}
static Evas_Object *playlist_column_add(ePlayer *player,
@@ -163,3 +163,27 @@
}
}
+void refresh_volume(ePlayer *player, int read) {
+ char buf[8];
+
+ if (read)
+ mixer_read(player->mixer);
+
+ snprintf(buf, sizeof(buf), "%i", player->mixer->volume);
+ edje_object_part_text_set(player->gui.edje, "vol_display_text", buf);
+}
+
+int refresh_time(ePlayer *player, int time) {
+ char buf[9], *fmt[2];
+
+ fmt[TIME_DISPLAY_ELAPSED] = "%i:%02i";
+ fmt[TIME_DISPLAY_LEFT] = "-%i:%02i";
+
+ snprintf(buf, sizeof(buf), fmt[player->time_display],
+ (time / 60), (time % 60));
+
+ edje_object_part_text_set(player->gui.edje, "time_text", buf);
+ evas_render(player->gui.evas);
+
+ return 1;
+}
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/interface.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- interface.h 16 Oct 2003 14:54:33 -0000 1.1
+++ interface.h 17 Oct 2003 17:00:29 -0000 1.2
@@ -6,5 +6,8 @@
void show_playlist(ePlayer *player);
void setup_ecore(ePlayer *player);
+void refresh_volume(ePlayer *player, int read);
+int refresh_time(ePlayer *player, int time);
+
#endif
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/mixer.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- mixer.c 16 Oct 2003 14:54:33 -0000 1.1
+++ mixer.c 17 Oct 2003 17:00:30 -0000 1.2
@@ -1,110 +1,101 @@
-#include <Edje.h>
+#include <config.h>
#include <sys/ioctl.h>
#include <fcntl.h>
-#include <linux/soundcard.h>
-#include "eplayer.h"
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "mixer.h"
-/************ STOLEN FROM MOC (Music on CLI) *********************/
-/* Get PCM volume, return -1 on error */
-int read_mixer (ePlayer *player) {
- int vol;
- int mixer_fd;
-
-#ifdef DEBUG
- printf("DEBUG: Reading mixer\n");
-#endif
-
- mixer_fd = open ("/dev/mixer", O_RDWR);
-
- if (mixer_fd == -1) {
- open ("/dev/mixer0", O_RDWR);
- }
- if (mixer_fd == -1) {
- printf("MIXER: Can't open mixer device\n");
- return 0;
- }
+Mixer *mixer_new(MixerControl ctrl) {
+ Mixer *mixer;
- if (mixer_fd != -1) {
- if (ioctl(mixer_fd, MIXER_READ(SOUND_MIXER_PCM), &vol) == -1) {
-#ifdef DEBUG
- printf("MIXER: Can't read from mixer\n");
-#endif
- } else {
- int return_val;
- /* Average between left and right */
- return_val = ((vol & 0xFF) + ((vol >> 8) & 0xFF)) / 2;
-#ifdef DEBUG
- printf("MIXER: Returning value: %d\n", return_val);
-#endif
- close(mixer_fd);
-
+ if (!(mixer = malloc(sizeof(Mixer))))
+ return NULL;
- /* Update the display with the volume level */
- {
+ mixer->control = ctrl;
+ mixer->volume = 0;
- char vol_str[3];
+ return mixer;
+}
- sprintf(vol_str, "%d", (int)return_val);
+void mixer_free(Mixer *mixer) {
+ if (!mixer)
+ return;
+
+ free(mixer);
+}
+
+static int open_mixer(Mixer *mixer, int rw) {
+ int fd, flags = rw ? O_RDWR : O_RDONLY;
+
+ if (!mixer)
+ return -1;
+
+ if ((fd = open("/dev/mixer", flags)) != -1)
+ return fd;
+ else
+ return open("/dev/mixer0", flags);
+}
-#ifdef DEBUG
- printf("DEBUG: Setting the mixer vol: %s\n", vol_str);
-#endif
+/**
+ * Reads a Mixer.
+ *
+ * @param mixer The Mixer to read
+ * @return The volume the mixer is set to.
+ */
+int mixer_read(Mixer *mixer) {
+ int vol = 0, fd;
+
+ if ((fd = open_mixer(mixer, 0)) == -1) {
+ fprintf(stderr, "MIXER: Can't open mixer device\n");
+ return -1;
+ }
- edje_object_part_text_set(player->gui.edje, "vol_display_text",
vol_str);
+ if (ioctl(fd, MIXER_READ(mixer->control), &vol) == -1) {
+ fprintf(stderr, "MIXER: Can't read from mixer\n");
+ close(fd);
+ return -1;
}
-/*
- if(player->edje) {
- if(return_val > 99)
- return_val == 99;
- if(return_val < 1)
- edje_object_part_text_set(player->edje,
"vol_display_text", "--");
- if(return_val < 10)
- sprintf(return_val, "0%s", (int)return_val);
-
- edje_object_part_text_set(player->edje, "vol_display_text",
return_val);
- }
-*/
- return return_val;
- }
- }
+ close(fd);
- return -1;
+ /* Average between left and right */
+ return (mixer->volume = ((vol & 0xFF) + ((vol >> 8) & 0xFF)) / 2);
}
-/* Set PCM volume */
-void set_mixer(int vol) {
+/**
+ * Changes the volume of a Mixer.
+ *
+ * @param mixer The Mixer to set
+ * @param vol The value to add to the current volume.
+ * @return Boolean success or failure.
+ */
+int mixer_change(Mixer *mixer, int diff) {
+ int fd, ret;
+
+ if ((fd = open_mixer(mixer, 1)) == -1) {
+ fprintf(stderr, "MIXER: Can't open mixer device\n");
+ return 0;
+ }
+
+ diff += mixer->volume;
- int mixer_fd;
+ /* vol is > 0 and < 100 */
+ if (diff > 100)
+ diff = 100;
+ else if (diff < 0)
+ diff = 0;
+
+ /* save the new value */
+ mixer->volume = diff;
+
+ diff = diff | (diff << 8);
+
+ if ((ret = ioctl(fd, MIXER_WRITE(mixer->control), &diff)) == 1)
+ fprintf(stderr, "MIXER: Can't set mixer\n");
+
+ close(fd);
-#ifdef DEBUG
- printf("DEBUG: Setting mixer\n");
-#endif
-
- mixer_fd = open ("/dev/mixer", O_RDWR);
-
- if (mixer_fd == -1)
- mixer_fd = open ("/dev/mixer0", O_RDWR);
-
- if (mixer_fd == -1) {
- printf("MIXER: Can't open mixer device\n");
- return;
- }
-
-
- if (mixer_fd != -1) {
- if (vol > 100)
- vol = 100;
- else if (vol < 0)
- vol = 0;
-
- vol = vol | (vol << 8);
- if (ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_PCM), &vol) == -1) {
-#ifdef DEBUG
- printf("DEBUG: Can't set mixer\n");
-#endif
- }
- }
- close(mixer_fd);
+ return (ret != -1);
}
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/mixer.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- mixer.h 16 Oct 2003 14:54:33 -0000 1.1
+++ mixer.h 17 Oct 2003 17:00:30 -0000 1.2
@@ -1,10 +1,23 @@
#ifndef __MIXER_H
#define __MIXER_H
-#include "eplayer.h"
+#include <linux/soundcard.h>
-void set_mixer(int vol);
-int read_mixer(ePlayer *player);
+typedef enum {
+ MIXER_CONTROL_VOL = SOUND_MIXER_VOLUME,
+ MIXER_CONTROL_PCM = SOUND_MIXER_PCM
+} MixerControl;
+
+typedef struct {
+ MixerControl control;
+ int volume;
+} Mixer;
+
+Mixer *mixer_new(MixerControl ctrl);
+void mixer_free(Mixer *mixer);
+
+int mixer_read(Mixer *mixer);
+int mixer_change(Mixer *mixer, int diff);
#endif
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/playlist.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- playlist.c 16 Oct 2003 18:06:28 -0000 1.3
+++ playlist.c 17 Oct 2003 17:00:30 -0000 1.4
@@ -1,3 +1,4 @@
+#include <config.h>
#include <vorbis/vorbisfile.h>
#include <stdio.h>
#include <stdlib.h>
@@ -8,7 +9,6 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
-#include <config.h>
#include "playlist.h"
static int is_dir (const char *dir) {
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/vorbis.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- vorbis.c 16 Oct 2003 20:16:56 -0000 1.6
+++ vorbis.c 17 Oct 2003 17:00:30 -0000 1.7
@@ -1,18 +1,18 @@
+#include <config.h>
#include <Edje.h>
#include <vorbis/codec.h>
-#include <vorbis/vorbisfile.h>
-#include <ao/ao.h>
#include <sys/ioctl.h>
#include <assert.h>
#include "eplayer.h"
#include "vorbis.h"
+#include "interface.h"
-ao_device *device = NULL;
-ao_sample_format format = {0};
-OggVorbis_File current_track = {0};
-
-/* Main Play Loop */
-int play_loop(void *udata) {
+/**
+ * Plays a chunk of the current track.
+ *
+ * @param udata Pointer to an ePlayer struct.
+ */
+int track_play_chunk(void *udata) {
ePlayer *player = udata;
long bytes_read;
int big_endian = 0;
@@ -21,19 +21,14 @@
#ifdef WORDS_BIGENDIAN
big_endian = 1;
#endif
-
+
/* read the data ... */
- bytes_read = ov_read(¤t_track, pcmout, sizeof(pcmout), big_endian,
- 2, 1, NULL);
+ bytes_read = ov_read(&player->current_track, pcmout, sizeof(pcmout),
+ big_endian, 2, 1, NULL);
- if (bytes_read) { /* ... and play it */
- ao_play(device, pcmout, bytes_read);
-
- /* FIXME move this to its own timer callback
- * it doesn't make sense to call this function *that* often
- */
- update_time(player);
- } else /* EOF -> move to the next track */
+ if (bytes_read) /* ... and play it */
+ ao_play(player->ao_dev, pcmout, bytes_read);
+ else /* EOF -> move to the next track */
edje_object_signal_emit(player->gui.edje,
"PLAY_NEXT", "next_button");
@@ -43,48 +38,29 @@
return !!bytes_read;
}
-int update_time(ePlayer *player) {
+int update_time(void *udata) {
+ ePlayer *player = udata;
static int old_time = -1;
int cur_time;
- char time[9];
+ cur_time = ov_time_tell(&player->current_track);
+
if (player->time_display == TIME_DISPLAY_LEFT)
- cur_time = ov_time_tell(¤t_track);
- else
- cur_time = ov_time_total(¤t_track, -1) -
- ov_time_tell(¤t_track);
+ cur_time = ov_time_total(&player->current_track, -1) - cur_time;
- if (cur_time == old_time) /* value didn't change, so update */
+ if (cur_time == old_time) /* value didn't change, so don't update */
return 1;
old_time = cur_time;
-
- if (player->time_display == TIME_DISPLAY_LEFT)
- snprintf(time, sizeof(time), "%d:%02d",
- (cur_time / 60), (cur_time % 60));
- else
- snprintf(time, sizeof(time), "-%d:%02d",
- (cur_time / 60), (cur_time % 60));
-
- edje_object_part_text_set(player->gui.edje, "time_text", time);
- evas_render(player->gui.evas);
+ refresh_time(player, cur_time);
return 1;
}
-static int setup_ao(PlayListItem *current) {
- ao_info *driver_info;
- int default_driver;
+static int setup_ao(ePlayer *player) {
+ PlayListItem *current = player->playlist->cur_item->data;
+ ao_sample_format format = {0};
- ao_initialize();
- default_driver = ao_default_driver_id();
-
-#ifdef DEBUG
- printf("AO DEBUG: Driver is %d\n", default_driver);
-#endif
-
- driver_info = ao_driver_info(default_driver);
-
format.bits = 16;
format.channels = current->channels;
format.rate = current->rate;
@@ -93,15 +69,23 @@
#ifdef DEBUG
printf("AO DEBUG: %d Channels at %d Hz, in %d bit words\n",
format.channels, format.rate, format.bits);
- printf("AO DEBUG: Audio Device: %s\n", driver_info->name);
#endif
- if (!(device = ao_open_live(default_driver, &format, NULL))) {
+ player->ao_dev = ao_open_live(ao_default_driver_id(), &format, NULL);
+
+ if (!player->ao_dev)
fprintf(stderr, "Error opening device.\n");
- return 0;
- }
- return 1;
+ return !!player->ao_dev;
+}
+
+/**
+ * Closes the current track.
+ *
+ * @param player
+ */
+void track_close(ePlayer *player) {
+ ov_clear(&player->current_track);
}
/**
@@ -109,17 +93,15 @@
*
* @param player
*/
-void open_track(ePlayer *player) {
+void track_open(ePlayer *player) {
PlayListItem *pli;
FILE *fp;
assert(player->playlist->cur_item);
pli = player->playlist->cur_item->data;
- ov_clear(¤t_track);
-
if (!(fp = fopen (pli->file, "rb"))
- || ov_open(fp, ¤t_track, NULL, 0)) {
+ || ov_open(fp, &player->current_track, NULL, 0)) {
fprintf (stderr, "ERROR: Can't open file '%s'\n", pli->file);
return;
}
@@ -128,22 +110,28 @@
edje_object_part_text_set(player->gui.edje, "artist_name", pli->artist);
edje_object_part_text_set(player->gui.edje, "album_name", pli->album);
- setup_ao (pli);
+ setup_ao(player);
}
-void seek_forward(void *udata, Evas_Object *obj,
- const char *emission, const char *src) {
- /* We don't care if you seek past the file, the play look will catch EOF and
play next file */
+void cb_seek_forward(void *udata, Evas_Object *obj,
+ const char *emission, const char *src) {
+ ePlayer *player = udata;
+
#ifdef DEBUG
printf("DEBUG: Seeking forward\n");
#endif
- ov_time_seek(¤t_track, ov_time_tell(¤t_track) + 5);
+ /* We don't care if you seek past the file, the play loop
+ * will catch EOF and play next file
+ */
+ ov_time_seek(&player->current_track,
+ ov_time_tell(&player->current_track) + 5);
}
-void seek_backward(void *udata, Evas_Object *obj,
- const char *emission, const char *src) {
- double cur_time = ov_time_tell(¤t_track);
+void cb_seek_backward(void *udata, Evas_Object *obj,
+ const char *emission, const char *src) {
+ ePlayer *player = udata;
+ double cur_time = ov_time_tell(&player->current_track);
/* Lets not seek backward if there isn't a point */
if (cur_time < 6) {
@@ -155,6 +143,6 @@
printf("DEBUG: Seeking backward - Current Pos: %lf\n", cur_time);
#endif
- ov_time_seek(¤t_track, cur_time - 5);
+ ov_time_seek(&player->current_track, cur_time - 5);
}
===================================================================
RCS file: /cvsroot/enlightenment/misc/eplayer/src/vorbis.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- vorbis.h 16 Oct 2003 14:54:33 -0000 1.1
+++ vorbis.h 17 Oct 2003 17:00:31 -0000 1.2
@@ -3,13 +3,15 @@
#include "eplayer.h"
-int play_loop(void *udata);
-int update_time(ePlayer *eplayer);
-void open_track(ePlayer *player);
+int track_play_chunk(void *udata);
+int update_time(void *udata);
-void seek_forward(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
-void seek_backward(void *udata, Evas_Object *obj,
- const char *emission, const char *src);
+void track_open(ePlayer *player);
+void track_close(ePlayer *player);
+
+void cb_seek_forward(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
+void cb_seek_backward(void *udata, Evas_Object *obj,
+ const char *emission, const char *src);
#endif
-------------------------------------------------------
This SF.net email sponsored by: Enterprise Linux Forum Conference & Expo
The Event For Linux Datacenter Solutions & Strategies in The Enterprise
Linux in the Boardroom; in the Front Office; & in the Server Room
http://www.enterpriselinuxforum.com
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs