You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

338 lines
5.9 KiB

  1. /*
  2. * cd.c -- cd functions
  3. *
  4. * Copyright (C) 2004, 2005, 2006 Svend Sorensen
  5. * For license terms, see the file COPYING in this distribution.
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "cd.h"
  11. typedef struct Data Data;
  12. struct Data {
  13. int type; /* DataType */
  14. char *name; /* data source name */
  15. long start; /* start time for data */
  16. long length; /* length of data */
  17. };
  18. struct Track {
  19. Data zero_pre; /* pre-gap generated with zero data */
  20. Data file; /* track data file */
  21. Data zero_post; /* post-gap generated with zero data */
  22. int mode; /* track mode */
  23. int sub_mode; /* sub-channel mode */
  24. int flags; /* flags */
  25. char *isrc; /* IRSC Code (5.22.4) 12 bytes */
  26. Cdtext *cdtext; /* CD-TEXT */
  27. int nindex; /* number of indexes */
  28. long index[MAXINDEX]; /* indexes (in frames) (5.29.2.5)
  29. * relative to start of track
  30. * index[0] should always be zero */
  31. };
  32. struct Cd {
  33. int mode; /* disc mode */
  34. char *catalog; /* Media Catalog Number (5.22.3) */
  35. Cdtext *cdtext; /* CD-TEXT */
  36. int ntrack; /* number of tracks in album */
  37. Track *track[MAXTRACK]; /* array of tracks */
  38. };
  39. Cd *cd_init()
  40. {
  41. Cd *cd = NULL;
  42. cd = malloc(sizeof(Cd));
  43. if(NULL == cd) {
  44. fprintf(stderr, "unable to create cd\n");
  45. } else {
  46. cd->mode = MODE_CD_DA;
  47. cd->catalog = NULL;
  48. cd->cdtext = cdtext_init();
  49. cd->ntrack = 0;
  50. }
  51. return cd;
  52. }
  53. Track *track_init()
  54. {
  55. Track *track = NULL;
  56. track = malloc(sizeof(Track));
  57. if (NULL == track) {
  58. fprintf(stderr, "unable to create track\n");
  59. } else {
  60. track->zero_pre.type = DATA_ZERO;
  61. track->zero_pre.name = NULL;
  62. track->zero_pre.start = 0;
  63. track->zero_pre.length = 0;
  64. track->file.type = DATA_AUDIO;
  65. track->file.name = NULL;
  66. track->file.start = 0;
  67. track->file.length = 0;
  68. track->zero_post.type = DATA_ZERO;
  69. track->zero_post.name = NULL;
  70. track->zero_post.start = 0;
  71. track->zero_post.length = 0;
  72. track->mode = MODE_AUDIO;
  73. track->sub_mode = SUB_MODE_RW;
  74. track->flags = FLAG_NONE;
  75. track->isrc = NULL;
  76. track->cdtext = cdtext_init();
  77. track->nindex = 0;
  78. }
  79. return track;
  80. }
  81. /*
  82. * cd structure functions
  83. */
  84. void cd_set_mode(Cd *cd, int mode)
  85. {
  86. cd->mode = mode;
  87. }
  88. int cd_get_mode(Cd *cd)
  89. {
  90. return cd->mode;
  91. }
  92. void cd_set_catalog(Cd *cd, char *catalog)
  93. {
  94. if (cd->catalog) {
  95. free(cd->catalog);
  96. }
  97. cd->catalog = strdup(catalog);
  98. }
  99. char *cd_get_catalog(Cd *cd)
  100. {
  101. return cd->catalog;
  102. }
  103. Cdtext *cd_get_cdtext(Cd *cd)
  104. {
  105. return cd->cdtext;
  106. }
  107. Track *cd_add_track(Cd *cd)
  108. {
  109. if (MAXTRACK - 1 > cd->ntrack) {
  110. cd->ntrack++;
  111. } else {
  112. fprintf(stderr, "too many tracks\n");
  113. }
  114. /* this will reinit last track if there were too many */
  115. cd->track[cd->ntrack - 1] = track_init();
  116. return cd->track[cd->ntrack - 1];
  117. }
  118. int cd_get_ntrack(Cd *cd)
  119. {
  120. return cd->ntrack;
  121. }
  122. Track *cd_get_track(Cd *cd, int i)
  123. {
  124. if (0 < i <= cd->ntrack) {
  125. return cd->track[i - 1];
  126. }
  127. return NULL;
  128. }
  129. /*
  130. * track structure functions
  131. */
  132. void track_set_filename(Track *track, char *filename)
  133. {
  134. if (track->file.name) {
  135. free(track->file.name);
  136. }
  137. track->file.name = strdup(filename);
  138. }
  139. char *track_get_filename(Track *track)
  140. {
  141. return track->file.name;
  142. }
  143. void track_set_start(Track *track, long start)
  144. {
  145. track->file.start = start;
  146. }
  147. long track_get_start(Track *track)
  148. {
  149. return track->file.start;
  150. }
  151. void track_set_length(Track *track, long length)
  152. {
  153. track->file.length = length;
  154. }
  155. long track_get_length(Track *track)
  156. {
  157. return track->file.length;
  158. }
  159. void track_set_mode(Track *track, int mode)
  160. {
  161. track->mode = mode;
  162. }
  163. int track_get_mode(Track *track)
  164. {
  165. return track->mode;
  166. }
  167. void track_set_sub_mode(Track *track, int sub_mode)
  168. {
  169. track->sub_mode = sub_mode;
  170. }
  171. int track_get_sub_mode(Track *track)
  172. {
  173. return track->sub_mode;
  174. }
  175. void track_set_flag(Track *track, int flag)
  176. {
  177. track->flags |= flag;
  178. }
  179. void track_clear_flag(Track *track, int flag)
  180. {
  181. track->flags &= ~flag;
  182. }
  183. int track_is_set_flag(Track *track, int flag)
  184. {
  185. return track->flags & flag;
  186. }
  187. void track_set_zero_pre(Track *track, long length)
  188. {
  189. track->zero_pre.length = length;
  190. }
  191. long track_get_zero_pre(Track *track)
  192. {
  193. return track->zero_pre.length;
  194. }
  195. void track_set_zero_post(Track *track, long length)
  196. {
  197. track->zero_post.length = length;
  198. }
  199. long track_get_zero_post(Track *track)
  200. {
  201. return track->zero_post.length;
  202. }
  203. void track_set_isrc(Track *track, char *isrc)
  204. {
  205. if (track->isrc) {
  206. free(track->isrc);
  207. }
  208. track->isrc = strdup(isrc);
  209. }
  210. char *track_get_isrc(Track *track)
  211. {
  212. return track->isrc;
  213. }
  214. Cdtext *track_get_cdtext(Track *track)
  215. {
  216. return track->cdtext;
  217. }
  218. void track_add_index(Track *track, long index)
  219. {
  220. if (MAXTRACK - 1 > track->nindex) {
  221. track->nindex++;
  222. } else {
  223. fprintf(stderr, "too many indexes\n");
  224. }
  225. /* this will overwrite last index if there were too many */
  226. track->index[track->nindex - 1] = index;
  227. }
  228. int track_get_nindex(Track *track)
  229. {
  230. return track->nindex;
  231. }
  232. long track_get_index(Track *track, int i)
  233. {
  234. if (0 <= i < track->nindex) {
  235. return track->index[i];
  236. }
  237. return -1;
  238. }
  239. /*
  240. * dump cd information
  241. */
  242. void cd_track_dump(Track *track)
  243. {
  244. int i;
  245. printf("zero_pre: %ld\n", track->zero_pre.length);
  246. printf("filename: %s\n", track->file.name);
  247. printf("start: %ld\n", track->file.start);
  248. printf("length: %ld\n", track->file.length);
  249. printf("zero_post: %ld\n", track->zero_post.length);
  250. printf("mode: %d\n", track->mode);
  251. printf("sub_mode: %d\n", track->sub_mode);
  252. printf("flags: 0x%x\n", track->flags);
  253. printf("isrc: %s\n", track->isrc);
  254. printf("indexes: %d\n", track->nindex);
  255. for (i = 0; i < track->nindex; ++i) {
  256. printf("index %d: %ld\n", i, track->index[i]);
  257. }
  258. if (NULL != track->cdtext) {
  259. printf("cdtext:\n");
  260. cdtext_dump(track->cdtext, 1);
  261. }
  262. }
  263. void cd_dump(Cd *cd)
  264. {
  265. int i;
  266. printf("Disc Info\n");
  267. printf("mode: %d\n", cd->mode);
  268. printf("catalog: %s\n", cd->catalog);
  269. if (NULL != cd->cdtext) {
  270. printf("cdtext:\n");
  271. cdtext_dump(cd->cdtext, 0);
  272. }
  273. for (i = 0; i < cd->ntrack; ++i) {
  274. printf("Track %d Info\n", i + 1);
  275. cd_track_dump(cd->track[i]);
  276. }
  277. }