Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

175 Zeilen
3.3 KiB

  1. /*
  2. * cdtext.c -- CD-TEXT data structure and functions
  3. *
  4. * Copyright (C) 2004, 2005, 2006, 2007, 2013 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 "cdtext.h"
  11. struct Cdtext {
  12. int pti;
  13. int format;
  14. char *value;
  15. };
  16. Cdtext *cdtext_init()
  17. {
  18. Cdtext *new_cdtext = NULL;
  19. Cdtext cdtext[] = {
  20. {PTI_TITLE, FORMAT_CHAR, NULL},
  21. {PTI_PERFORMER, FORMAT_CHAR, NULL},
  22. {PTI_SONGWRITER, FORMAT_CHAR, NULL},
  23. {PTI_COMPOSER, FORMAT_CHAR, NULL},
  24. {PTI_ARRANGER, FORMAT_CHAR, NULL},
  25. {PTI_MESSAGE, FORMAT_CHAR, NULL},
  26. {PTI_DISC_ID, FORMAT_BINARY, NULL},
  27. {PTI_GENRE, FORMAT_BINARY, NULL},
  28. {PTI_TOC_INFO1, FORMAT_BINARY, NULL},
  29. {PTI_TOC_INFO2, FORMAT_BINARY, NULL},
  30. {PTI_RESERVED1, FORMAT_CHAR, NULL},
  31. {PTI_RESERVED2, FORMAT_CHAR, NULL},
  32. {PTI_RESERVED3, FORMAT_CHAR, NULL},
  33. {PTI_RESERVED4, FORMAT_CHAR, NULL},
  34. {PTI_UPC_ISRC, FORMAT_CHAR, NULL},
  35. {PTI_SIZE_INFO, FORMAT_BINARY, NULL},
  36. {PTI_END, FORMAT_CHAR, NULL}
  37. };
  38. new_cdtext = (Cdtext *) calloc (sizeof (cdtext) / sizeof (Cdtext), sizeof (Cdtext));
  39. if (NULL == new_cdtext) {
  40. fprintf (stderr, "problem allocating memory\n");
  41. } else {
  42. memcpy (new_cdtext, cdtext, sizeof(cdtext));
  43. }
  44. return new_cdtext;
  45. }
  46. void cdtext_delete(Cdtext *cdtext)
  47. {
  48. int i;
  49. if (NULL != cdtext) {
  50. for (i = 0; PTI_END != cdtext[i].pti; i++) {
  51. free (cdtext[i].value);
  52. }
  53. free (cdtext);
  54. }
  55. }
  56. /* return 0 if there is no cdtext, returns non-zero otherwise */
  57. int cdtext_is_empty(Cdtext *cdtext)
  58. {
  59. for (; PTI_END != cdtext->pti; cdtext++) {
  60. if (NULL != cdtext->value) {
  61. return -1;
  62. }
  63. }
  64. return 0;
  65. }
  66. /* sets cdtext's pti entry to field */
  67. void cdtext_set(int pti, char *value, Cdtext *cdtext)
  68. {
  69. if (NULL != value) { /* don't pass NULL to strdup */
  70. for (; PTI_END != cdtext->pti; cdtext++) {
  71. if (pti == cdtext->pti) {
  72. free (cdtext->value);
  73. cdtext->value = strdup (value);
  74. }
  75. }
  76. }
  77. }
  78. /* returns value for pti, NULL if pti is not found */
  79. char *cdtext_get(int pti, Cdtext *cdtext)
  80. {
  81. for (; PTI_END != cdtext->pti; cdtext++) {
  82. if (pti == cdtext->pti) {
  83. return cdtext->value;
  84. }
  85. }
  86. return NULL;
  87. }
  88. const char *cdtext_get_key(int pti, int istrack)
  89. {
  90. char *key = NULL;
  91. switch (pti) {
  92. case PTI_TITLE:
  93. key = "TITLE";
  94. break;
  95. case PTI_PERFORMER:
  96. key = "PERFORMER";
  97. break;
  98. case PTI_SONGWRITER:
  99. key = "SONGWRITER";
  100. break;
  101. case PTI_COMPOSER:
  102. key = "COMPOSER";
  103. break;
  104. case PTI_ARRANGER:
  105. key = "ARRANGER";
  106. break;
  107. case PTI_MESSAGE:
  108. key = "MESSAGE";
  109. break;
  110. case PTI_DISC_ID:
  111. key = "DISC_ID";
  112. break;
  113. case PTI_GENRE:
  114. key = "GENRE";
  115. break;
  116. case PTI_TOC_INFO1:
  117. key = "TOC_INFO1";
  118. break;
  119. case PTI_TOC_INFO2:
  120. key = "TOC_INFO1";
  121. break;
  122. case PTI_RESERVED1:
  123. /* reserved */
  124. break;
  125. case PTI_RESERVED2:
  126. /* reserved */
  127. break;
  128. case PTI_RESERVED3:
  129. /* reserved */
  130. break;
  131. case PTI_RESERVED4:
  132. /* reserved */
  133. break;
  134. case PTI_UPC_ISRC:
  135. if (0 == istrack)
  136. key = "UPC_EAN";
  137. else
  138. key = "ISRC";
  139. break;
  140. case PTI_SIZE_INFO:
  141. key = "SIZE_INFO";
  142. break;
  143. }
  144. return key;
  145. }
  146. void cdtext_dump(Cdtext *cdtext, int istrack)
  147. {
  148. int pti;
  149. char *value = NULL;
  150. for (pti = 0; PTI_END != pti; pti++) {
  151. if (NULL != (value = cdtext_get(pti, cdtext))) {
  152. printf("%s: ", cdtext_get_key(pti, istrack));
  153. printf("%s\n", value);
  154. }
  155. }
  156. }