New API call isoburn_set_msc1()
This commit is contained in:
@ -332,6 +332,7 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:
|
||||
if(caps!=NULL)
|
||||
@ -1387,3 +1388,124 @@ void isoburn_toc_disc_free(struct isoburn_toc_disc *d)
|
||||
free((char *) d);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_get_track_lba(struct isoburn_toc_track *track, int *lba, int flag)
|
||||
{
|
||||
struct burn_toc_entry entry;
|
||||
|
||||
isoburn_toc_track_get_entry(track, &entry);
|
||||
if (entry.extensions_valid & 1)
|
||||
*lba= entry.start_lba;
|
||||
else
|
||||
*lba= burn_msf_to_lba(entry.pmin, entry.psec, entry.pframe);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
int flag)
|
||||
{
|
||||
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
||||
int lba, best_lba, size;
|
||||
char volid[33], msg[160];
|
||||
struct isoburn *o;
|
||||
struct isoburn_toc_disc *disc= NULL;
|
||||
struct isoburn_toc_session **sessions;
|
||||
struct isoburn_toc_track **tracks;
|
||||
static char mode_names[][20]= {"auto", "session", "track", "lba", "volid"};
|
||||
static int max_mode_names= 4;
|
||||
|
||||
ret= isoburn_find_emulator(&o, d, 0);
|
||||
if(ret<0)
|
||||
return(-1);
|
||||
if(o==NULL)
|
||||
return(-1);
|
||||
|
||||
adr_num= atoi(adr_value);
|
||||
if(adr_mode!=3) {
|
||||
disc= isoburn_toc_drive_get_disc(d);
|
||||
if(disc==NULL) {
|
||||
not_found:;
|
||||
if(adr_mode<0 || adr_mode>max_mode_names)
|
||||
goto unknown_mode;
|
||||
sprintf(msg, "Failed to find %s %s", mode_names[adr_mode],
|
||||
strlen(adr_value)<=80 ? adr_value : "-oversized-string-");
|
||||
burn_msgs_submit(0x00060000, msg, 0, "FAILURE", NULL);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
sessions= isoburn_toc_disc_get_sessions(disc, &num_sessions);
|
||||
if(sessions==NULL || num_sessions<=0)
|
||||
goto not_found;
|
||||
}
|
||||
if(adr_mode==0) {
|
||||
/* Set fabricated_msc1 to last session in TOC */
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[num_sessions-1],
|
||||
&num_tracks);
|
||||
if(tracks==NULL || num_tracks<=0)
|
||||
goto not_found;
|
||||
isoburn_get_track_lba(tracks[0], &(o->fabricated_msc1), 0);
|
||||
|
||||
} else if(adr_mode==1) {
|
||||
/* Use adr_num as session index (first session is 1, not 0) */
|
||||
if(adr_num<1 || adr_num>num_sessions)
|
||||
goto not_found;
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[adr_num-1], &num_tracks);
|
||||
if(tracks==NULL || num_tracks<=0)
|
||||
goto not_found;
|
||||
isoburn_get_track_lba(tracks[0], &(o->fabricated_msc1), 0);
|
||||
|
||||
} else if(adr_mode==2) {
|
||||
/* use adr_num as track index */
|
||||
total_tracks= 0;
|
||||
for(i=0; i<num_sessions; i++) {
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
||||
if(tracks==NULL)
|
||||
continue;
|
||||
for(j= 0; j<num_tracks; j++) {
|
||||
total_tracks++;
|
||||
if(total_tracks==adr_num) {
|
||||
isoburn_get_track_lba(tracks[j], &(o->fabricated_msc1), 0);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
goto not_found;
|
||||
|
||||
} else if(adr_mode==3) {
|
||||
o->fabricated_msc1= adr_num;
|
||||
|
||||
} else if(adr_mode==4) {
|
||||
/* search for volume id that is equal to adr_value */
|
||||
best_lba= -1;
|
||||
for(i=0; i<num_sessions; i++) {
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
||||
if(tracks==NULL)
|
||||
continue;
|
||||
for(j= 0; j<num_tracks; j++) {
|
||||
isoburn_get_track_lba(tracks[0], &lba, 0);
|
||||
ret= isoburn_read_iso_head(d, lba, &size, volid, 1);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
if(strcmp(volid, adr_value)!=0)
|
||||
continue;
|
||||
best_lba= lba;
|
||||
}
|
||||
}
|
||||
if(best_lba<0)
|
||||
goto not_found;
|
||||
o->fabricated_msc1= best_lba;
|
||||
|
||||
} else {
|
||||
unknown_mode:;
|
||||
sprintf(msg, "Program error: Unknown msc1 address mode %d", adr_mode);
|
||||
burn_msgs_submit(0x00060000, msg, 0, "FATAL", NULL);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(disc!=NULL)
|
||||
isoburn_toc_disc_free(disc);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user