mp3.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include <rtthread.h>
  2. #include <dfs_posix.h>
  3. #include <mp3/pub/mp3dec.h>
  4. #include "dac.h"
  5. static HMP3Decoder hMP3Decoder;
  6. static MP3FrameInfo mp3FrameInfo;
  7. static unsigned char *read_ptr;
  8. static int bytes_left=0, bytes_leftBeforeDecoding=0, err, offset;
  9. static int nFrames = 0;
  10. static unsigned char *mp3buf;
  11. static unsigned int mp3buf_size;
  12. static unsigned char allocated = 0;
  13. static void mp3_reset()
  14. {
  15. read_ptr = RT_NULL;
  16. bytes_leftBeforeDecoding = bytes_left = 0;
  17. nFrames = 0;
  18. }
  19. void mp3_init(rt_uint8_t *buffer, rt_uint32_t buffer_size)
  20. {
  21. mp3buf = buffer;
  22. mp3buf_size = buffer_size;
  23. mp3_reset();
  24. }
  25. void mp3_alloc()
  26. {
  27. if (!allocated) hMP3Decoder = MP3InitDecoder();
  28. allocated = 1;
  29. }
  30. void mp3_free()
  31. {
  32. if (allocated) MP3FreeDecoder(hMP3Decoder);
  33. allocated = 0;
  34. }
  35. int mp3_refill_inbuffer(int fd)
  36. {
  37. rt_uint16_t bytes_read;
  38. int bytes_to_read;
  39. // rt_kprintf("left: %d. refilling inbuffer...\n", bytes_left);
  40. if (bytes_left > 0)
  41. {
  42. // after fseeking backwards the FAT has to be read from the beginning -> S L O W
  43. // assert(f_lseek(mp3file, mp3file->fptr - bytes_leftBeforeDecoding) == FR_OK);
  44. // better: move unused rest of buffer to the start
  45. // no overlap as long as (1024 <= mp3buf_size/2), so no need to use memove
  46. rt_memcpy(mp3buf, read_ptr, bytes_left);
  47. }
  48. bytes_to_read = mp3buf_size - bytes_left;
  49. bytes_read = read(fd, (char *)mp3buf + bytes_left, bytes_to_read);
  50. if (bytes_read == bytes_to_read)
  51. {
  52. read_ptr = mp3buf;
  53. offset = 0;
  54. bytes_left = mp3buf_size;
  55. // rt_kprintf("ok. read: %d. left: %d\n", bytes_read, bytes_left);
  56. return 0;
  57. }
  58. else
  59. {
  60. rt_kprintf("can't read more data");
  61. return -1;
  62. }
  63. }
  64. int mp3_process(int fd)
  65. {
  66. int writeable_buffer;
  67. if (read_ptr == RT_NULL)
  68. {
  69. if(mp3_refill_inbuffer(fd) != 0)
  70. return -1;
  71. }
  72. offset = MP3FindSyncWord(read_ptr, bytes_left);
  73. if (offset < 0)
  74. {
  75. rt_kprintf("Error: MP3FindSyncWord returned <0");
  76. if(mp3_refill_inbuffer(fd) != 0)
  77. return -1;
  78. }
  79. read_ptr += offset;
  80. bytes_left -= offset;
  81. bytes_leftBeforeDecoding = bytes_left;
  82. // check if this is really a valid frame
  83. // (the decoder does not seem to calculate CRC, so make some plausibility checks)
  84. if (MP3GetNextFrameInfo(hMP3Decoder, &mp3FrameInfo, read_ptr) == 0 &&
  85. mp3FrameInfo.nChans == 2 &&
  86. mp3FrameInfo.version == 0)
  87. {
  88. // rt_kprintf("Found a frame at offset %x\n", offset + read_ptr - mp3buf + mp3file->fptr);
  89. }
  90. else
  91. {
  92. rt_kprintf("this is no valid frame\n");
  93. // advance data pointer
  94. // TODO: handle bytes_left == 0
  95. RT_ASSERT(bytes_left > 0);
  96. bytes_left -= 1;
  97. read_ptr += 1;
  98. return 0;
  99. }
  100. if (bytes_left < 1024) {
  101. if(mp3_refill_inbuffer(fd) != 0)
  102. return -1;
  103. }
  104. // rt_kprintf("bytes_leftBeforeDecoding: %i\n", bytes_leftBeforeDecoding);
  105. writeable_buffer = dac_get_writeable_buffer();
  106. if (writeable_buffer == -1) {
  107. return 0;
  108. }
  109. // rt_kprintf("wb %i\n", writeable_buffer);
  110. err = MP3Decode(hMP3Decoder, &read_ptr, &bytes_left, dac_buffer[writeable_buffer], 0);
  111. nFrames++;
  112. if (err)
  113. {
  114. switch (err)
  115. {
  116. case ERR_MP3_INDATA_UNDERFLOW:
  117. rt_kprintf("ERR_MP3_INDATA_UNDERFLOW");
  118. bytes_left = 0;
  119. if(mp3_refill_inbuffer(fd) != 0)
  120. return -1;
  121. break;
  122. case ERR_MP3_MAINDATA_UNDERFLOW:
  123. /* do nothing - next call to decode will provide more mainData */
  124. rt_kprintf("ERR_MP3_MAINDATA_UNDERFLOW");
  125. break;
  126. default:
  127. rt_kprintf("unknown error: %i\n", err);
  128. // skip this frame
  129. if (bytes_left > 0)
  130. {
  131. bytes_left --;
  132. read_ptr ++;
  133. }
  134. else
  135. {
  136. // TODO
  137. RT_ASSERT(0);
  138. }
  139. break;
  140. }
  141. dac_buffer_size[writeable_buffer] = 0;
  142. }
  143. else
  144. {
  145. /* no error */
  146. MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo);
  147. // rt_kprintf("Bitrate: %i\r\n", mp3FrameInfo.bitrate);
  148. // rt_kprintf("%i samples\n", mp3FrameInfo.outputSamps);
  149. dac_buffer_size[writeable_buffer] = mp3FrameInfo.outputSamps;
  150. // rt_kprintf("%lu Hz, %i kbps\n", mp3FrameInfo.samprate, mp3FrameInfo.bitrate/1000);
  151. if (dac_set_srate(mp3FrameInfo.samprate) != 0) {
  152. rt_kprintf("unsupported sample rate: %lu\n", mp3FrameInfo.samprate);
  153. return -1;
  154. }
  155. }
  156. return 0;
  157. }
  158. #include <finsh.h>
  159. void mp3(char* filename)
  160. {
  161. int fd;
  162. rt_uint8_t *mp3_buffer;
  163. list_date();
  164. dac_init();
  165. mp3_buffer = rt_malloc(2048);
  166. mp3_init(mp3_buffer, 2048);
  167. mp3_alloc();
  168. fd = open(filename, O_RDONLY, 0);
  169. if (fd >= 0)
  170. {
  171. while (mp3_process(fd) == 0);
  172. close(fd);
  173. }
  174. list_date();
  175. }
  176. FINSH_FUNCTION_EXPORT(mp3, mp3 decode test)