1 /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
2 
3 /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
4    Copyright (c) 2011 - 2011 Thomas Schmitt <scdbackup@gmx.net>
5    Provided under GPL version 2 or later.
6 */
7 
8 
9 #ifdef HAVE_CONFIG_H
10 #include "../config.h"
11 #endif
12 
13 /* ts A61008 */
14 /* #include <a ssert.h> */
15 
16 #include <string.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include "toc.h"
20 #include "transport.h"
21 #include "libburn.h"
22 #include "sector.h"
23 #include "options.h"
24 #include "init.h"
25 
26 #if 0
27 static void write_clonecd2(volatile struct toc *toc, int f);
28 
29 static void write_clonecd2(volatile struct toc *toc, int f)
30 {
31 	int i;
32 
33 	/* header */
34 	dprintf(f, "[CloneCD]\r\n");
35 	dprintf(f, "Version=2\r\n");
36 	dprintf(f, "\r\n");
37 
38 	/* disc data */
39 	dprintf(f, "[Disc]\r\n");
40 
41 	dprintf(f, "TocEntries=%d\r\n", toc->toc_entries);
42 	dprintf(f, "Sessions=%d\r\n", toc->sessions);
43 	dprintf(f, "DataTracksScrambled=%d\r\n", toc->datatracksscrambled);
44 	dprintf(f, "CDTextLength=%d\r\n", toc->cdtextlength);
45 	dprintf(f, "\r\n");
46 
47 	/* session data */
48 	for (i = 0; i < toc->sessions; ++i) {
49 		dprintf(f, "[Session %d]\r\n", i + 1);
50 
51 		{
52 			int m;
53 
54 			switch (toc->session[i].track[0]->mode) {
55 			case BURN_MODE_RAW_DATA:
56 			case BURN_MODE_AUDIO:
57 				m = 0;
58 				break;
59 			case BURN_MODE0:
60 				m = 1;
61 				break;
62 			case BURN_MODE1:
63 			case BURN_MODE2_FORMLESS:
64 			case BURN_MODE2_FORM1:
65 			case BURN_MODE2_FORM2:
66 			case BURN_MODE_UNINITIALIZED:
67 
68 				/* ts A61008 : do this softly without Assert */
69 
70 				a ssert(0);	/* unhandled! find out ccd's
71 						   value for these modes! */
72 			}
73 			dprintf(f, "PreGapMode=%d\r\n", m);
74 		}
75 		dprintf(f, "\r\n");
76 	}
77 
78 	for (i = 0; i < toc->toc_entries; ++i) {
79 		dprintf(f, "[Entry %d]\r\n", i);
80 
81 		dprintf(f, "Session=%d\r\n", toc->toc_entry[i].session);
82 		dprintf(f, "Point=0x%02x\r\n", toc->toc_entry[i].point);
83 		dprintf(f, "ADR=0x%02x\r\n", toc->toc_entry[i].adr);
84 		dprintf(f, "Control=0x%02x\r\n", toc->toc_entry[i].control);
85 		dprintf(f, "TrackNo=%d\r\n", toc->toc_entry[i].tno);
86 		dprintf(f, "AMin=%d\r\n", toc->toc_entry[i].min);
87 		dprintf(f, "ASec=%d\r\n", toc->toc_entry[i].sec);
88 		dprintf(f, "AFrame=%d\r\n", toc->toc_entry[i].frame);
89 		dprintf(f, "ALBA=%d\r\n",
90 			burn_msf_to_lba(toc->toc_entry[i].min,
91 					toc->toc_entry[i].sec,
92 					toc->toc_entry[i].frame));
93 		dprintf(f, "Zero=%d\r\n", toc->toc_entry[i].zero);
94 		dprintf(f, "PMin=%d\r\n", toc->toc_entry[i].pmin);
95 		dprintf(f, "PSec=%d\r\n", toc->toc_entry[i].psec);
96 		dprintf(f, "PFrame=%d\r\n", toc->toc_entry[i].pframe);
97 		dprintf(f, "PLBA=%d\r\n",
98 			burn_msf_to_lba(toc->toc_entry[i].pmin,
99 					toc->toc_entry[i].psec,
100 					toc->toc_entry[i].pframe));
101 		dprintf(f, "\r\n");
102 	}
103 }
104 #endif
105 
toc_find_modes(struct burn_drive * d)106 void toc_find_modes(struct burn_drive *d)
107 {
108 	int i, j;
109 	struct buffer *mem = NULL;
110 	struct burn_toc_entry *e;
111 
112 /* ts A70519 : the code which needs this does not work with GNU/Linux 2.4 USB
113 	int lba;
114 	struct burn_read_opts o;
115 
116 	o.raw = 1;
117 	o.c2errors = 0;
118 	o.subcodes_audio = 1;
119 	o.subcodes_data = 1;
120 	o.hardware_error_recovery = 1;
121 	o.report_recovered_errors = 0;
122 	o.transfer_damaged_blocks = 1;
123 	o.hardware_error_retries = 1;
124 */
125 
126 	BURN_ALLOC_MEM_VOID(mem, struct buffer, 1);
127 
128 	mem->bytes = 0;
129 	mem->sectors = 1;
130 
131 	for (i = 0; i < d->disc->sessions; i++)
132 		for (j = 0; j < d->disc->session[i]->tracks; j++) {
133 			struct burn_track *t = d->disc->session[i]->track[j];
134 
135 			e = t->entry;
136 /* XXX | in the subcodes if appropriate! */
137 			if (e && !(e->control & 4)) {
138 				t->mode = BURN_AUDIO;
139 			} else {
140 
141 				t->mode = BURN_MODE1;
142 /* ts A70519 : this does not work with GNU/Linux 2.4 USB because one cannot
143                predict the exact dxfer_size without knowing the sector type.
144 				if (!e)
145 					lba = 0;
146 				else
147 					lba = burn_msf_to_lba(e->pmin, e->psec,
148 							      e->pframe);
149 				mem->sectors = 1;
150 
151 				ts B21119 : Would now be d->read_cd() with
152 					    with sectype = 0 , mainch = 0xf8
153 				d->read_sectors(d, lba, mem.sectors, &o, mem);
154 
155 				t->mode = sector_identify(mem->data);
156 */
157 			}
158 		}
159 
160 ex:
161 	BURN_FREE_MEM(mem);
162 }
163