588 lines
12 KiB
C
588 lines
12 KiB
C
#include <cdaudio.h>
|
|
|
|
#include "config.h"
|
|
#include "epplet.h"
|
|
|
|
#define NUM_BUTTONS 10
|
|
#define MAX_LBL_LEN 15
|
|
#define SEPARATOR "-"
|
|
|
|
static Epplet_gadget cddb_label = NULL; /* Label displayed on the epplet */
|
|
static Epplet_gadget tracks_popup = NULL; /* Popup containing the CD tracks */
|
|
static Epplet_gadget volume_slider = NULL;
|
|
static char cddb_string[255]; /* The string containing our cddb info */
|
|
static struct disc_data DiscData;
|
|
static struct disc_info DiscInfo;
|
|
static int cd_desc = 0;
|
|
static int current_track = 1;
|
|
static struct disc_volume cd_volume;
|
|
static unsigned long current_data_id;
|
|
|
|
/* Config options */
|
|
static const char *cdrom_device;
|
|
static const char *scroll_or_bounce;
|
|
static const char *separator;
|
|
static char show_album;
|
|
static char show_artist;
|
|
static char show_name;
|
|
|
|
/* Prototypes */
|
|
static void cddb_update(void *data);
|
|
static void update_cddb_string(void);
|
|
static void update_cddb_tracks(void);
|
|
static void fake_cddb_string(void);
|
|
static void fake_cddb_tracks(void);
|
|
static void set_volume(void *data);
|
|
static void get_volume(void);
|
|
static int eplaycd_cd_stat(int cd_desc, struct disc_info *disc);
|
|
static void open_cdrom(const char *cdrom_device);
|
|
static void close_cdrom(void);
|
|
|
|
/* bounce the cddb_label */
|
|
static void
|
|
bounce_cddb_label(void *data)
|
|
{
|
|
static int start = 0;
|
|
static int direction = 1;
|
|
char *temp = (char *)data;
|
|
char saved_char = temp[start + MAX_LBL_LEN];
|
|
|
|
return; /* this is broke */
|
|
|
|
if (strlen(temp) < MAX_LBL_LEN)
|
|
{
|
|
Epplet_timer(bounce_cddb_label, &cddb_string, 0.3, "Bouncer");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (((start + MAX_LBL_LEN) > (int)strlen(temp)) || start < 0)
|
|
direction = -direction;
|
|
|
|
temp[start + MAX_LBL_LEN] = '\0';
|
|
Epplet_change_label(cddb_label, &temp[start]);
|
|
|
|
temp[start + MAX_LBL_LEN] = saved_char;
|
|
start += direction;
|
|
}
|
|
|
|
Epplet_timer(bounce_cddb_label, NULL, 0.3, "Bouncer");
|
|
}
|
|
|
|
static void
|
|
scroll_cddb_label(void *data)
|
|
{
|
|
char *temp = (char *)data;
|
|
int length = strlen(temp);
|
|
char saved_char = temp[MAX_LBL_LEN];
|
|
|
|
if (strlen(temp) < MAX_LBL_LEN)
|
|
{
|
|
Epplet_timer(scroll_cddb_label, &cddb_string, 0.3, "Scroller");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
temp[MAX_LBL_LEN] = '\0';
|
|
Epplet_change_label(cddb_label, temp);
|
|
temp[MAX_LBL_LEN] = saved_char;
|
|
saved_char = temp[0];
|
|
memcpy(data, temp + 1, (size_t)length);
|
|
temp[length - 1] = saved_char;
|
|
}
|
|
|
|
Epplet_timer(scroll_cddb_label, &cddb_string, 0.3, "Scroller");
|
|
}
|
|
|
|
static void
|
|
update_track_info(void *data __UNUSED__)
|
|
{
|
|
if (!cd_desc)
|
|
{
|
|
Epplet_timer(update_track_info, NULL, 2, "TrackInfo");
|
|
return;
|
|
}
|
|
|
|
if (eplaycd_cd_stat(cd_desc, &DiscInfo) < 0)
|
|
{
|
|
printf("Error stat'ing cdrom\n");
|
|
return;
|
|
}
|
|
|
|
if (DiscInfo.disc_mode == CDAUDIO_PLAYING)
|
|
{
|
|
if (DiscInfo.disc_current_track != current_track)
|
|
{
|
|
current_track = DiscInfo.disc_current_track;
|
|
cddb_update(NULL);
|
|
}
|
|
}
|
|
|
|
Epplet_timer(update_track_info, NULL, 2, "TrackInfo");
|
|
}
|
|
|
|
/* Close */
|
|
static void
|
|
cb_close(void *data __UNUSED__)
|
|
{
|
|
Epplet_unremember();
|
|
cd_finish(cd_desc);
|
|
exit(0);
|
|
}
|
|
|
|
/* Rewind */
|
|
static void
|
|
rew_cd(void *data __UNUSED__)
|
|
{
|
|
struct disc_timeval time;
|
|
|
|
if (!cd_desc)
|
|
return;
|
|
|
|
eplaycd_cd_stat(cd_desc, &DiscInfo);
|
|
|
|
time.minutes = 0;
|
|
time.seconds = -2;
|
|
time.frames = 0;
|
|
cd_advance(cd_desc, time);
|
|
}
|
|
|
|
/* Fast Forward */
|
|
static void
|
|
ff_cd(void *data __UNUSED__)
|
|
{
|
|
struct disc_timeval time;
|
|
|
|
if (!cd_desc)
|
|
return;
|
|
|
|
eplaycd_cd_stat(cd_desc, &DiscInfo);
|
|
|
|
time.minutes = 0;
|
|
time.seconds = 2;
|
|
time.frames = 0;
|
|
|
|
cd_advance(cd_desc, time);
|
|
}
|
|
|
|
/* Play */
|
|
static void
|
|
play_cd(void *data)
|
|
{
|
|
int *the_track = (int *)data;
|
|
|
|
if (!cd_desc)
|
|
open_cdrom(cdrom_device);
|
|
|
|
eplaycd_cd_stat(cd_desc, &DiscInfo);
|
|
|
|
if (DiscInfo.disc_present)
|
|
{
|
|
if (the_track)
|
|
{
|
|
current_track = *the_track;
|
|
cd_play(cd_desc, current_track);
|
|
update_cddb_string();
|
|
}
|
|
else
|
|
{
|
|
switch (DiscInfo.disc_mode)
|
|
{
|
|
case CDAUDIO_PLAYING:
|
|
cd_pause(cd_desc);
|
|
break;
|
|
case CDAUDIO_PAUSED:
|
|
cd_resume(cd_desc);
|
|
break;
|
|
default:
|
|
cd_play(cd_desc, current_track);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
close_cdrom();
|
|
}
|
|
|
|
/* Stop */
|
|
static void
|
|
stop_cd(void *data __UNUSED__)
|
|
{
|
|
if (!cd_desc)
|
|
return;
|
|
|
|
if (eplaycd_cd_stat(cd_desc, &DiscInfo) < 0)
|
|
return;
|
|
|
|
cd_stop(cd_desc);
|
|
}
|
|
|
|
/* Eject */
|
|
static void
|
|
eject_cd(void *data __UNUSED__)
|
|
{
|
|
static int open = 0;
|
|
|
|
if (!cd_desc)
|
|
open_cdrom(cdrom_device);
|
|
|
|
if (eplaycd_cd_stat(cd_desc, &DiscInfo) < 0)
|
|
{
|
|
printf("Error ejecting CD...\n");
|
|
return;
|
|
}
|
|
|
|
if (open)
|
|
{
|
|
open = 0;
|
|
cddb_update(NULL);
|
|
}
|
|
else
|
|
{
|
|
cd_eject(cd_desc);
|
|
close_cdrom();
|
|
open = 1;
|
|
}
|
|
}
|
|
|
|
/* Previous Track */
|
|
static void
|
|
prev_track(void *data __UNUSED__)
|
|
{
|
|
/* eplaycd_cd_stat(cd_desc, &DiscInfo); */
|
|
|
|
if (!cd_desc)
|
|
return;
|
|
|
|
if (current_track <= DiscInfo.disc_first_track)
|
|
current_track = DiscInfo.disc_total_tracks;
|
|
else
|
|
current_track--;
|
|
|
|
if (DiscInfo.disc_mode == CDAUDIO_PLAYING ||
|
|
DiscInfo.disc_mode == CDAUDIO_PAUSED)
|
|
cd_play(cd_desc, current_track);
|
|
|
|
update_cddb_string();
|
|
}
|
|
|
|
/* Next Track */
|
|
static void
|
|
next_track(void *data __UNUSED__)
|
|
{
|
|
/* eplaycd_cd_stat(cd_desc, &DiscInfo); */
|
|
|
|
if (!cd_desc)
|
|
return;
|
|
|
|
if (current_track >= DiscInfo.disc_total_tracks)
|
|
current_track = DiscInfo.disc_first_track;
|
|
else
|
|
current_track++;
|
|
|
|
if ((DiscInfo.disc_mode == CDAUDIO_PLAYING) ||
|
|
DiscInfo.disc_mode == CDAUDIO_PAUSED)
|
|
cd_play(cd_desc, current_track);
|
|
|
|
update_cddb_string();
|
|
}
|
|
|
|
/* Stat CD */
|
|
static int
|
|
eplaycd_cd_stat(int cddesc, struct disc_info *disc)
|
|
{
|
|
if (!cddesc)
|
|
return -1;
|
|
|
|
cd_stat(cddesc, disc);
|
|
|
|
if (!disc->disc_present)
|
|
{
|
|
cd_close(cddesc);
|
|
cd_stat(cddesc, disc);
|
|
if (!disc->disc_present)
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Update CDDB Info */
|
|
static void
|
|
cddb_update(void *data __UNUSED__)
|
|
{
|
|
if (!cd_desc)
|
|
open_cdrom(cdrom_device);
|
|
|
|
if ((eplaycd_cd_stat(cd_desc, &DiscInfo) >= 0) && DiscInfo.disc_present)
|
|
{
|
|
current_track = DiscInfo.disc_current_track;
|
|
|
|
if (cddb_read_data(cd_desc, &DiscData) < 0)
|
|
{
|
|
current_data_id = DiscData.data_id;
|
|
fake_cddb_string();
|
|
fake_cddb_tracks();
|
|
|
|
current_track = DiscInfo.disc_current_track;
|
|
}
|
|
else
|
|
{
|
|
if (DiscData.data_id != current_data_id)
|
|
{
|
|
current_data_id = DiscData.data_id;
|
|
update_cddb_string();
|
|
update_cddb_tracks();
|
|
}
|
|
else
|
|
{
|
|
update_cddb_string();
|
|
current_track = DiscInfo.disc_current_track;
|
|
}
|
|
}
|
|
}
|
|
|
|
switch (DiscInfo.disc_mode)
|
|
{
|
|
case CDAUDIO_PLAYING:
|
|
case CDAUDIO_PAUSED:
|
|
break;
|
|
default:
|
|
close_cdrom();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Update String for CDDB label */
|
|
static void
|
|
update_cddb_string(void)
|
|
{
|
|
/*
|
|
* strcpy(cddb_string, DiscData.data_artist);
|
|
* strcat(cddb_string, SEPARATOR);
|
|
* strcat(cddb_string, DiscData.data_title);
|
|
* strcat(cddb_string, SEPARATOR);
|
|
*/
|
|
|
|
if (DiscData.data_id <= 0)
|
|
{
|
|
fake_cddb_string();
|
|
return;
|
|
}
|
|
|
|
cddb_string[0] = '\0';
|
|
|
|
if (show_artist)
|
|
{
|
|
strcat(cddb_string, separator);
|
|
strcat(cddb_string, DiscData.data_artist);
|
|
}
|
|
|
|
if (show_album)
|
|
{
|
|
strcat(cddb_string, separator);
|
|
strcat(cddb_string, DiscData.data_title);
|
|
}
|
|
|
|
if (show_name)
|
|
{
|
|
strcat(cddb_string, separator);
|
|
strcat(cddb_string, DiscData.data_track[current_track - 1].track_name);
|
|
}
|
|
|
|
Epplet_change_label(cddb_label, cddb_string);
|
|
}
|
|
|
|
static void
|
|
fake_cddb_string(void)
|
|
{
|
|
sprintf(cddb_string, "Track %d ", current_track);
|
|
|
|
Epplet_change_label(cddb_label, cddb_string);
|
|
}
|
|
|
|
static void
|
|
update_cddb_tracks(void)
|
|
{
|
|
int i;
|
|
static int *tracks = NULL;
|
|
|
|
free(tracks);
|
|
|
|
tracks = (int *)calloc((size_t)DiscInfo.disc_total_tracks, sizeof(int));
|
|
|
|
/* Causes segfault...
|
|
* if(tracks_popup != NULL)
|
|
* Epplet_gadget_destroy(tracks_popup);
|
|
*/
|
|
|
|
tracks_popup = Epplet_create_popup();
|
|
|
|
Epplet_add_popup_entry(tracks_popup, "-NeverMind-", NULL, NULL, NULL);
|
|
|
|
for (i = 0; i < DiscInfo.disc_total_tracks; i++)
|
|
{
|
|
tracks[i] = i + 1;
|
|
|
|
Epplet_add_popup_entry(tracks_popup,
|
|
DiscData.data_track[i].track_name,
|
|
NULL, play_cd, &tracks[i]);
|
|
}
|
|
}
|
|
|
|
static void
|
|
fake_cddb_tracks(void)
|
|
{
|
|
int i;
|
|
static int *tracks = NULL;
|
|
char temp_title[128];
|
|
|
|
free(tracks);
|
|
|
|
tracks = (int *)calloc((size_t)DiscInfo.disc_total_tracks, sizeof(int));
|
|
|
|
tracks_popup = Epplet_create_popup();
|
|
|
|
Epplet_add_popup_entry(tracks_popup, "-NeverMind-", NULL, NULL, NULL);
|
|
|
|
for (i = 0; i < DiscInfo.disc_total_tracks; i++)
|
|
{
|
|
tracks[i] = i + 1;
|
|
snprintf(temp_title, 128, "Track %d", i + 1);
|
|
|
|
Epplet_add_popup_entry(tracks_popup,
|
|
temp_title, NULL, play_cd, &tracks[i]);
|
|
}
|
|
}
|
|
|
|
/* Pop-Up About Box */
|
|
static void
|
|
do_help(void *data __UNUSED__)
|
|
{
|
|
Epplet_show_about("E-PlayCD");
|
|
}
|
|
|
|
static void
|
|
popup_tracks(void *data __UNUSED__)
|
|
{
|
|
Epplet_pop_popup(tracks_popup, 0);
|
|
}
|
|
|
|
/* Set the Volume */
|
|
static void
|
|
set_volume(void *data)
|
|
{
|
|
struct disc_volume *the_volume = (struct disc_volume *)data;
|
|
|
|
the_volume->vol_front.right = the_volume->vol_front.left;
|
|
cd_set_volume(cd_desc, *the_volume);
|
|
}
|
|
|
|
/* Get the Volume */
|
|
static void
|
|
get_volume(void)
|
|
{
|
|
cd_get_volume(cd_desc, &cd_volume);
|
|
}
|
|
|
|
static void
|
|
open_cdrom(const char *device)
|
|
{
|
|
if ((cd_desc = cd_init_device((char *)device)) < 0)
|
|
{
|
|
printf("Could not open %s\n", device);
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
static void
|
|
close_cdrom(void)
|
|
{
|
|
cd_finish(cd_desc);
|
|
cd_desc = 0;
|
|
}
|
|
|
|
static void
|
|
load_config(void)
|
|
{
|
|
cdrom_device = Epplet_query_config_def("cdrom_device", "/dev/cdrom");
|
|
scroll_or_bounce = Epplet_query_config_def("scroll_or_bounce", "scroll");
|
|
separator = Epplet_query_config_def("separator", "-");
|
|
|
|
show_artist = atoi(Epplet_query_config_def("show_artist", "1"));
|
|
show_album = atoi(Epplet_query_config_def("show_album", "yes"));
|
|
show_name = atoi(Epplet_query_config_def("show_name", "yes"));
|
|
}
|
|
|
|
/* MAIN */
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
static const char *const button_stds[] = {
|
|
"CLOSE", "PLAY", "STOP", "PREVIOUS", "NEXT", "ARROW_UP",
|
|
"HELP", "REWIND", "FAST_FORWARD", "REPEAT", "CONFIGURE",
|
|
"EJECT"
|
|
};
|
|
int i;
|
|
typedef void (*callback_func)(void *data);
|
|
|
|
callback_func button_funcs[] = {
|
|
cb_close, play_cd, stop_cd, prev_track, next_track,
|
|
popup_tracks, do_help, rew_cd, ff_cd, NULL, cddb_update,
|
|
eject_cd
|
|
};
|
|
|
|
Epplet_adjust_priority(10);
|
|
|
|
atexit(Epplet_cleanup);
|
|
|
|
Epplet_Init("E-PlayCD", "0.5",
|
|
"Enlightenment CD Player Epplet", 5, 3, argc, argv, 0);
|
|
Epplet_load_config();
|
|
load_config();
|
|
if (!strcmp(scroll_or_bounce, "bounce"))
|
|
Epplet_timer(bounce_cddb_label, &cddb_string, 0.3, "Bouncer");
|
|
else
|
|
Epplet_timer(scroll_cddb_label, &cddb_string, 0.3, "Scroller");
|
|
Epplet_timer(update_track_info, NULL, 1, "TrackInfo");
|
|
for (i = 0; i < 6; i++)
|
|
{
|
|
Epplet_gadget_show(Epplet_create_button(NULL, NULL,
|
|
2 + (i * 13),
|
|
2, 0, 0,
|
|
button_stds
|
|
[i], 0, NULL,
|
|
button_funcs[i], NULL));
|
|
}
|
|
|
|
for (i = 0; i < 6; i++)
|
|
{
|
|
Epplet_gadget_show(Epplet_create_button(NULL, NULL,
|
|
2 + (i * 13),
|
|
15, 0, 0,
|
|
button_stds[6
|
|
+
|
|
i],
|
|
0, NULL,
|
|
button_funcs[6 + i], NULL));
|
|
}
|
|
|
|
tracks_popup = Epplet_create_popup();
|
|
Epplet_add_popup_entry(tracks_popup, "-NeverMind-", NULL, NULL, NULL);
|
|
|
|
get_volume();
|
|
Epplet_gadget_show(volume_slider =
|
|
Epplet_create_hslider(2, 27, 76, 0,
|
|
255, 4, 8,
|
|
&cd_volume.vol_front.left,
|
|
set_volume, &cd_volume));
|
|
/* Epplet_gadget_data_changed (volume_slider); */
|
|
Epplet_gadget_show(cddb_label =
|
|
Epplet_create_label(2, 35, "Welcome To E-PlayCD", 2));
|
|
strcpy(cddb_string, " Welcome To E-PlayCD ");
|
|
Epplet_show();
|
|
cddb_update(NULL);
|
|
Epplet_Loop();
|
|
return 0;
|
|
}
|