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.
 
 
 
 
 
 

330 lines
5.9 KiB

  1. /*
  2. * cd.c -- cd functions
  3. *
  4. * Copyright (C) 2004 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. cd->catalog = strdup(catalog);
  97. }
  98. char *cd_get_catalog (Cd *cd)
  99. {
  100. return cd->catalog;
  101. }
  102. Cdtext *cd_get_cdtext (Cd *cd)
  103. {
  104. return cd->cdtext;
  105. }
  106. Track *cd_add_track (Cd *cd)
  107. {
  108. if (MAXTRACK - 1 > cd->ntrack)
  109. cd->ntrack++;
  110. else
  111. fprintf(stderr, "too many tracks\n");
  112. /* this will reinit last track if there were too many */
  113. cd->track[cd->ntrack - 1] = track_init();
  114. return cd->track[cd->ntrack - 1];
  115. }
  116. int cd_get_ntrack (Cd *cd)
  117. {
  118. return cd->ntrack;
  119. }
  120. Track *cd_get_track (Cd *cd, int i)
  121. {
  122. if (0 < i <= cd->ntrack)
  123. return cd->track[i - 1];
  124. return NULL;
  125. }
  126. /*
  127. * track structure functions
  128. */
  129. void track_set_filename (Track *track, char *filename)
  130. {
  131. if (track->file.name)
  132. free(track->file.name);
  133. track->file.name = strdup(filename);
  134. }
  135. char *track_get_filename (Track *track)
  136. {
  137. return track->file.name;
  138. }
  139. void track_set_start (Track *track, long start)
  140. {
  141. track->file.start = start;
  142. }
  143. long track_get_start (Track *track)
  144. {
  145. return track->file.start;
  146. }
  147. void track_set_length (Track *track, long length)
  148. {
  149. track->file.length = length;
  150. }
  151. long track_get_length (Track *track)
  152. {
  153. return track->file.length;
  154. }
  155. void track_set_mode (Track *track, int mode)
  156. {
  157. track->mode = mode;
  158. }
  159. int track_get_mode (Track *track)
  160. {
  161. return track->mode;
  162. }
  163. void track_set_sub_mode (Track *track, int sub_mode)
  164. {
  165. track->sub_mode = sub_mode;
  166. }
  167. int track_get_sub_mode (Track *track)
  168. {
  169. return track->sub_mode;
  170. }
  171. void track_set_flag (Track *track, int flag)
  172. {
  173. track->flags |= flag;
  174. }
  175. void track_clear_flag (Track *track, int flag)
  176. {
  177. track->flags &= ~flag;
  178. }
  179. int track_is_set_flag (Track *track, int flag)
  180. {
  181. return track->flags & flag;
  182. }
  183. void track_set_zero_pre (Track *track, long length)
  184. {
  185. track->zero_pre.length = length;
  186. }
  187. long track_get_zero_pre (Track *track)
  188. {
  189. return track->zero_pre.length;
  190. }
  191. void track_set_zero_post (Track *track, long length)
  192. {
  193. track->zero_post.length = length;
  194. }
  195. long track_get_zero_post (Track *track)
  196. {
  197. return track->zero_post.length;
  198. }
  199. void track_set_isrc (Track *track, char *isrc)
  200. {
  201. if (track->isrc)
  202. free(track->isrc);
  203. track->isrc = strdup(isrc);
  204. }
  205. char *track_get_isrc (Track *track)
  206. {
  207. return track->isrc;
  208. }
  209. Cdtext *track_get_cdtext (Track *track)
  210. {
  211. return track->cdtext;
  212. }
  213. void track_add_index (Track *track, long index)
  214. {
  215. if (MAXTRACK - 1 > track->nindex)
  216. track->nindex++;
  217. else
  218. fprintf(stderr, "too many indexes\n");
  219. /* this will overwrite last index if there were too many */
  220. track->index[track->nindex - 1] = index;
  221. }
  222. int track_get_nindex (Track *track)
  223. {
  224. return track->nindex;
  225. }
  226. long track_get_index (Track *track, int i)
  227. {
  228. if (0 <= i < track->nindex)
  229. return track->index[i];
  230. return -1;
  231. }
  232. /*
  233. * dump cd information
  234. */
  235. void cd_track_dump (Track *track)
  236. {
  237. int i;
  238. printf("zero_pre: %ld\n", track->zero_pre.length);
  239. printf("filename: %s\n", track->file.name);
  240. printf("start: %ld\n", track->file.start);
  241. printf("length: %ld\n", track->file.length);
  242. printf("zero_post: %ld\n", track->zero_post.length);
  243. printf("mode: %d\n", track->mode);
  244. printf("sub_mode: %d\n", track->sub_mode);
  245. printf("flags: 0x%x\n", track->flags);
  246. printf("isrc: %s\n", track->isrc);
  247. printf("indexes: %d\n", track->nindex);
  248. for (i = 0; i < track->nindex; ++i)
  249. printf("index %d: %ld\n", i, track->index[i]);
  250. if (NULL != track->cdtext) {
  251. printf("cdtext:\n");
  252. cdtext_dump(track->cdtext, 1);
  253. }
  254. }
  255. void cd_dump (Cd *cd)
  256. {
  257. int i;
  258. printf("Disc Info\n");
  259. printf("mode: %d\n", cd->mode);
  260. printf("catalog: %s\n", cd->catalog);
  261. if (NULL != cd->cdtext) {
  262. printf("cdtext:\n");
  263. cdtext_dump(cd->cdtext, 0);
  264. }
  265. for (i = 0; i < cd->ntrack; ++i) {
  266. printf("Track %d Info\n", i + 1);
  267. cd_track_dump(cd->track[i]);
  268. }
  269. }