Proper inheritance, etc
This commit is contained in:
@@ -13,10 +13,77 @@ struct Burn_Data
|
||||
void *_progress_update(void *d);
|
||||
int _progress_gui_update(void *d);
|
||||
int ecdb_burn_finished(void *data, int type, void *event);
|
||||
int ecdb_burn_project_init(Ecdb_Burn_Project *proj);
|
||||
int ecdb_erase_project_init(Ecdb_Erase_Project *proj);
|
||||
|
||||
Ecdb_Burn_Project *
|
||||
ecdb_burn_project_new(void)
|
||||
{
|
||||
Ecdb_Burn_Project *proj;
|
||||
|
||||
proj = calloc(1, sizeof(Ecdb_Burn_Project));
|
||||
if (!proj)
|
||||
return NULL;
|
||||
if (!ecdb_burn_project_init(proj))
|
||||
{
|
||||
FREE(proj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return proj;
|
||||
}
|
||||
|
||||
/* Event handlers */
|
||||
int
|
||||
ecdb_burn_project(Ecdb_Project *proj)
|
||||
ecdb_burn_project_init(Ecdb_Burn_Project *proj)
|
||||
{
|
||||
if (!ecdb_project_init(ECDB_PROJECT(proj)))
|
||||
return FALSE;
|
||||
|
||||
/* Create some sane defaults */
|
||||
proj->burn_mode = BURN_MODE1;
|
||||
proj->fifo_chunksize = 2048;
|
||||
proj->fifo_chunks = 2048;
|
||||
proj->underrun_proof = TRUE;
|
||||
proj->opc = TRUE;
|
||||
proj->multi = TRUE;
|
||||
proj->files = ecore_list_new();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Ecdb_Erase_Project *
|
||||
ecdb_erase_project_new(void)
|
||||
{
|
||||
Ecdb_Erase_Project *proj;
|
||||
|
||||
proj = calloc(1, sizeof(Ecdb_Erase_Project));
|
||||
if (!proj)
|
||||
return NULL;
|
||||
if (!ecdb_erase_project_init(proj))
|
||||
{
|
||||
FREE(proj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return proj;
|
||||
}
|
||||
|
||||
int
|
||||
ecdb_erase_project_init(Ecdb_Erase_Project *proj)
|
||||
{
|
||||
if (!ecdb_project_init(ECDB_PROJECT(proj)))
|
||||
return FALSE;
|
||||
|
||||
/* Proper defaults */
|
||||
proj->quick = TRUE;
|
||||
proj->format = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Erase and Burn Function */
|
||||
int
|
||||
ecdb_burn_project(Ecdb_Burn_Project *proj)
|
||||
{
|
||||
char reasons[BURN_REASONS_LEN];
|
||||
int padding, i;
|
||||
@@ -28,9 +95,14 @@ ecdb_burn_project(Ecdb_Project *proj)
|
||||
|
||||
i = 0;
|
||||
data = calloc(1, sizeof(Burn_Data));
|
||||
if (!data)
|
||||
{
|
||||
printf("Error: Cannot create burn data structure!\n");
|
||||
return FALSE;
|
||||
}
|
||||
data->sources = ecore_list_new();
|
||||
data->tracks = ecore_list_new();
|
||||
data->proj = proj;
|
||||
data->proj = ECDB_PROJECT(proj);
|
||||
|
||||
if (proj->burn_mode != BURN_AUDIO)
|
||||
padding = 300*1024;
|
||||
@@ -48,7 +120,7 @@ ecdb_burn_project(Ecdb_Project *proj)
|
||||
{
|
||||
printf("Error: Cannot attach source object to track "
|
||||
"object!\n");
|
||||
return 1;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
burn_session_add_track(data->session, track, BURN_POS_END);
|
||||
@@ -60,16 +132,18 @@ ecdb_burn_project(Ecdb_Project *proj)
|
||||
if (!i)
|
||||
{
|
||||
printf("Failed to add any files to burn disc!\n");
|
||||
return 1;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
opts = burn_write_opts_new(proj->drive->tangible[0].drive);
|
||||
opts = burn_write_opts_new(ECDB_PROJECT(proj)->drive->
|
||||
tangible[0].drive);
|
||||
burn_write_opts_set_perform_opc(opts, proj->opc);
|
||||
burn_write_opts_set_multi(opts, proj->multi);
|
||||
if (proj->simulate)
|
||||
printf("Simulating Burn!\n");
|
||||
burn_write_opts_set_simulate(opts, proj->simulate);
|
||||
burn_drive_set_speed(proj->drive->tangible->drive, 0, proj->speed);
|
||||
burn_drive_set_speed(ECDB_PROJECT(proj)->drive->tangible->drive, 0,
|
||||
proj->speed);
|
||||
burn_write_opts_set_underrun_proof(opts, proj->underrun_proof);
|
||||
|
||||
printf("Searching for burn mode\n");
|
||||
@@ -78,20 +152,62 @@ ecdb_burn_project(Ecdb_Project *proj)
|
||||
{
|
||||
printf("Error: Failed to find a suitable write mode for "
|
||||
"disc!\n");
|
||||
return 1;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
burn_disc_write(opts, data->disc);
|
||||
burn_write_opts_free(opts);
|
||||
|
||||
printf("Disc now burning\n");
|
||||
pthread_create(&progress_update, NULL, _progress_update, data);
|
||||
pthread_create(&progress_update, NULL, _progress_update, proj);
|
||||
pthread_detach(progress_update);
|
||||
ecore_timer_add(0.5, _progress_gui_update, data);
|
||||
ecore_timer_add(0.5, _progress_gui_update, proj);
|
||||
ecore_event_handler_add(ECDB_DRIVE_ACTION_FINISHED, ecdb_burn_finished,
|
||||
data);
|
||||
|
||||
return 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
ecdb_erase_disc(Ecdb_Erase_Project *proj)
|
||||
{
|
||||
BurnDriveStatus disc_state;
|
||||
pthread_t progress_update;
|
||||
|
||||
disc_state = burn_disc_get_status(ECDB_PROJECT(proj)->drive->
|
||||
tangible[0].drive);
|
||||
if (disc_state == BURN_DISC_BLANK)
|
||||
{
|
||||
printf("Disc is already blank!\n");
|
||||
return FALSE;
|
||||
}
|
||||
else if (disc_state == BURN_DISC_EMPTY)
|
||||
{
|
||||
printf("No disc!\n");
|
||||
return FALSE;
|
||||
}
|
||||
else if (!burn_disc_erasable(ECDB_PROJECT(proj)->drive->
|
||||
tangible[0].drive))
|
||||
{
|
||||
printf("Not able to erase!\n");
|
||||
return FALSE;
|
||||
}
|
||||
else if (disc_state == BURN_DISC_FULL || BURN_DISC_APPENDABLE)
|
||||
{
|
||||
printf("Beginning to erase disc!\n");
|
||||
burn_disc_erase(ECDB_PROJECT(proj)->drive->
|
||||
tangible[0].drive, proj->quick);
|
||||
pthread_create(&progress_update, NULL, _progress_update,
|
||||
proj);
|
||||
pthread_detach(progress_update);
|
||||
ecore_timer_add(0.5, _progress_gui_update, proj);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Not of erasable type\n");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hopefully at some point EFL will become thread-safe, or ecore_timer will
|
||||
@@ -99,38 +215,39 @@ ecdb_burn_project(Ecdb_Project *proj)
|
||||
* do away with this.
|
||||
*/
|
||||
|
||||
/* Event handlers */
|
||||
void *
|
||||
_progress_update(void *d)
|
||||
{
|
||||
Burn_Data *data;
|
||||
Ecdb_Project *proj;
|
||||
BurnProgress p;
|
||||
struct burn_drive *drive;
|
||||
|
||||
data = d;
|
||||
proj = d;
|
||||
|
||||
if (!data->proj->drive->tangible)
|
||||
if (!proj->drive->tangible)
|
||||
{
|
||||
printf("No tangible drive!\n");
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
drive = data->proj->drive->tangible[0].drive;
|
||||
drive = proj->drive->tangible[0].drive;
|
||||
|
||||
printf("Progress update active\n");
|
||||
while (TRUE)
|
||||
{
|
||||
data->proj->stat = burn_drive_get_status(drive, &p);
|
||||
if (data->proj->stat == BURN_DRIVE_SPAWNING)
|
||||
proj->stat = burn_drive_get_status(drive, &p);
|
||||
if (proj->stat == BURN_DRIVE_SPAWNING)
|
||||
{
|
||||
sleep(3);
|
||||
continue;
|
||||
}
|
||||
else if (data->proj->stat == BURN_DRIVE_IDLE)
|
||||
else if (proj->stat == BURN_DRIVE_IDLE)
|
||||
{
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
data->proj->progress = p;
|
||||
proj->progress = p;
|
||||
sleep(5);
|
||||
}
|
||||
}
|
||||
@@ -138,18 +255,23 @@ _progress_update(void *d)
|
||||
int
|
||||
_progress_gui_update(void *data)
|
||||
{
|
||||
Burn_Data *d;
|
||||
Ecdb_Project *proj;
|
||||
|
||||
d = data;
|
||||
proj = data;
|
||||
|
||||
if (d->proj->stat == BURN_DRIVE_IDLE)
|
||||
if (proj->stat == BURN_DRIVE_IDLE)
|
||||
{
|
||||
ecore_event_add(ECDB_DRIVE_ACTION_FINISHED, NULL, NULL, data);
|
||||
/* These don't enjoy being called before
|
||||
* ecore_main_loop_bugin
|
||||
*/
|
||||
//ecore_event_add(ECDB_DRIVE_ACTION_FINISHED, data, NULL, NULL);
|
||||
ecore_event_add(ECDB_DRIVE_ACTION_FINISHED, NULL, NULL, NULL);
|
||||
printf("Burn finished\n");
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
else
|
||||
ecore_event_add(ECDB_DRIVE_ACTION_UPDATE, NULL, NULL, data);
|
||||
ecore_event_add(ECDB_DRIVE_ACTION_UPDATE, NULL, NULL, NULL);
|
||||
//ecore_event_add(ECDB_DRIVE_ACTION_UPDATE, data, NULL, NULL);
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
@@ -184,11 +306,13 @@ ecdb_burn_finished(void *data, int type, void *event)
|
||||
printf("Releasing drive\n");
|
||||
burn_drive_release(proj->proj->drive->tangible[0].drive, 1);
|
||||
burn_drive_info_free(proj->proj->drive->tangible);
|
||||
printf("Ze brun hath finish\n");
|
||||
printf("Burn Complete\n");
|
||||
|
||||
/* To be removed from here at some point */
|
||||
ecore_list_destroy(proj->proj->files);
|
||||
FREE(proj->proj);
|
||||
Ecdb_Burn_Project *t;
|
||||
t = ECDB_BURN(proj->proj);
|
||||
ecore_list_destroy(t->files);
|
||||
FREE(t);
|
||||
FREE(proj);
|
||||
ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL);
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user