159 lines
3.3 KiB
C
159 lines
3.3 KiB
C
|
#include "ecdb.h"
|
||
|
|
||
|
typedef struct Burn_Data Burn_Data;
|
||
|
struct Burn_Data
|
||
|
{
|
||
|
BurnDisc *disc;
|
||
|
BurnSession *session;
|
||
|
Ecore_List *sources;
|
||
|
Ecore_List *tracks;
|
||
|
Ecdb_Project *proj;
|
||
|
};
|
||
|
|
||
|
void *_progress_update(void *d);
|
||
|
|
||
|
/* Event handlers */
|
||
|
int
|
||
|
ecdb_burn_project(Ecdb_Project *proj)
|
||
|
{
|
||
|
char reasons[BURN_REASONS_LEN];
|
||
|
int padding, i;
|
||
|
Burn_Data *data;
|
||
|
BurnTrack *track;
|
||
|
BurnSource *source;
|
||
|
BurnWriteOpts *opts;
|
||
|
pthread_t progress_update;
|
||
|
|
||
|
i = 0;
|
||
|
data = calloc(1, sizeof(Burn_Data));
|
||
|
data->sources = ecore_list_new();
|
||
|
data->tracks = ecore_list_new();
|
||
|
data->proj = proj;
|
||
|
|
||
|
if (proj->burn_mode != BURN_AUDIO)
|
||
|
padding = 300*1024;
|
||
|
|
||
|
data->disc = burn_disc_create();
|
||
|
data->session = burn_session_create();
|
||
|
burn_disc_add_session(data->disc, data->session, BURN_POS_END);
|
||
|
|
||
|
track = burn_track_create();
|
||
|
burn_track_define_data(track, 0, padding, 1, proj->burn_mode);
|
||
|
|
||
|
while ((source = ecdb_image_project(proj)))
|
||
|
{
|
||
|
if (burn_track_set_source(track, source) != BURN_SOURCE_OK)
|
||
|
{
|
||
|
printf("Error: Cannot attach source object to track "
|
||
|
"object!\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
burn_session_add_track(data->session, track, BURN_POS_END);
|
||
|
ecore_list_append(data->sources, source);
|
||
|
ecore_list_append(data->tracks, track);
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
if (!i)
|
||
|
{
|
||
|
printf("Failed to add any files to burn disc!\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
opts = burn_write_opts_new(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!\n");
|
||
|
burn_write_opts_set_simulate(opts, proj->simulate);
|
||
|
burn_drive_set_speed(proj->drive->tangible->drive, 0, proj->speed);
|
||
|
burn_write_opts_set_underrun_proof(opts, proj->underrun_proof);
|
||
|
|
||
|
if (burn_write_opts_auto_write_type(opts, data->disc, reasons, 0)
|
||
|
== BURN_WRITE_NONE)
|
||
|
{
|
||
|
printf("Error: Failed to find a suitable write mode for "
|
||
|
"disc!\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/* Not sure where to put this for now */
|
||
|
burn_disc_write(opts, data->disc);
|
||
|
burn_write_opts_free(opts);
|
||
|
|
||
|
pthread_create(&progress_update, NULL, _progress_update, data);
|
||
|
pthread_detach(progress_update);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void *
|
||
|
_progress_update(void *d)
|
||
|
{
|
||
|
Burn_Data *data;
|
||
|
BurnProgress p;
|
||
|
BurnDriveStatus stat;
|
||
|
struct burn_drive *drive;
|
||
|
|
||
|
data = d;
|
||
|
|
||
|
if (!data->proj->drive->tangible)
|
||
|
{
|
||
|
printf("No tangible drive!\n");
|
||
|
pthread_exit(NULL);
|
||
|
}
|
||
|
drive = data->proj->drive->tangible[0].drive;
|
||
|
|
||
|
|
||
|
while (TRUE)
|
||
|
{
|
||
|
stat = burn_drive_get_status(drive, &p);
|
||
|
if (stat == BURN_DRIVE_SPAWNING)
|
||
|
{
|
||
|
sleep(3);
|
||
|
continue;
|
||
|
}
|
||
|
else if (stat == BURN_DRIVE_IDLE)
|
||
|
{
|
||
|
BurnTrack *track;
|
||
|
BurnSource *source;
|
||
|
|
||
|
ecore_list_first_goto(data->sources);
|
||
|
ecore_list_first_goto(data->tracks);
|
||
|
|
||
|
while ((source = ecore_list_remove(data->sources)))
|
||
|
{
|
||
|
burn_source_free(source);
|
||
|
track = ecore_list_remove(data->tracks);
|
||
|
burn_track_free(track);
|
||
|
}
|
||
|
|
||
|
ecore_list_destroy(data->sources);
|
||
|
ecore_list_destroy(data->tracks);
|
||
|
burn_session_free(data->session);
|
||
|
burn_disc_free(data->disc);
|
||
|
burn_drive_release(drive, 0);
|
||
|
burn_drive_info_free(data->proj->drive->tangible);
|
||
|
|
||
|
/* Don't keep in here */
|
||
|
printf("fail\n");
|
||
|
ecore_list_destroy(data->proj->files);
|
||
|
FREE(data->proj);
|
||
|
|
||
|
/* End testing */
|
||
|
printf("here\n");
|
||
|
FREE(data);
|
||
|
|
||
|
pthread_exit(NULL);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//printf("Total sectors: %d, on sector: %d\n", p.sectors,
|
||
|
// p.sector);
|
||
|
data->proj->progress = p;
|
||
|
sleep(5);
|
||
|
}
|
||
|
}
|
||
|
|