mp3.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #include <rtthread.h>
  2. #include <dfs_posix.h>
  3. #include <mp3/pub/mp3dec.h>
  4. #define MP3_AUDIO_BUF_SZ 4096
  5. #define MP3_DECODE_MP_CNT 2
  6. #define MP3_DECODE_MP_SZ 2560
  7. #define STATIC_MEMORY_POOL
  8. #ifdef STATIC_MEMORY_POOL
  9. static rt_uint8_t mempool[(MP3_DECODE_MP_SZ * 2 + 4)* 2]; // 5k x 2
  10. static struct rt_mempool _mp;
  11. #endif
  12. struct mp3_decoder
  13. {
  14. /* mp3 information */
  15. HMP3Decoder decoder;
  16. MP3FrameInfo frame_info;
  17. rt_uint32_t frames;
  18. /* mp3 file descriptor */
  19. int fd;
  20. /* mp3 read session */
  21. rt_uint8_t *read_buffer;
  22. rt_uint8_t* read_ptr;
  23. rt_int32_t read_offset;
  24. rt_uint32_t bytes_left, bytes_left_before_decoding;
  25. /* mp3 decode memory pool */
  26. rt_mp_t mp;
  27. /* audio device */
  28. rt_device_t snd_device;
  29. };
  30. static rt_err_t mp3_decoder_tx_done(rt_device_t dev, void *buffer)
  31. {
  32. /* release memory block to memory pool */
  33. rt_mp_free(buffer);
  34. return RT_EOK;
  35. }
  36. rt_uint8_t mp3_fd_buffer[MP3_AUDIO_BUF_SZ];
  37. void mp3_decoder_init(struct mp3_decoder* decoder)
  38. {
  39. RT_ASSERT(decoder != RT_NULL);
  40. /* init read session */
  41. decoder->read_ptr = RT_NULL;
  42. decoder->bytes_left_before_decoding = decoder->bytes_left = 0;
  43. decoder->frames = 0;
  44. // decoder->read_buffer = rt_malloc(MP3_AUDIO_BUF_SZ);
  45. decoder->read_buffer = &mp3_fd_buffer[0];
  46. if (decoder->read_buffer == RT_NULL) return;
  47. /* create memory pool for decoding */
  48. #ifdef STATIC_MEMORY_POOL
  49. rt_mp_init(&_mp, "mp3", &mempool[0], sizeof(mempool), MP3_DECODE_MP_SZ * 2);
  50. decoder->mp = &_mp;
  51. #else
  52. decoder->mp = rt_mp_create("mp3dec", MP3_DECODE_MP_CNT, MP3_DECODE_MP_SZ * 2);
  53. #endif
  54. decoder->decoder = MP3InitDecoder();
  55. /* open audio device */
  56. decoder->snd_device = rt_device_find("snd");
  57. if (decoder->snd_device != RT_NULL)
  58. {
  59. /* set tx complete call back function */
  60. rt_device_set_tx_complete(decoder->snd_device, mp3_decoder_tx_done);
  61. rt_device_open(decoder->snd_device, RT_DEVICE_OFLAG_WRONLY);
  62. }
  63. }
  64. void mp3_decoder_detach(struct mp3_decoder* decoder)
  65. {
  66. RT_ASSERT(decoder != RT_NULL);
  67. /* close audio device */
  68. if (decoder->snd_device != RT_NULL)
  69. rt_device_close(decoder->snd_device);
  70. /* release mp3 decoder */
  71. MP3FreeDecoder(decoder->decoder);
  72. #ifdef STATIC_MEMORY_POOL
  73. rt_mp_detach(decoder->mp);
  74. #else
  75. /* delete memory pool for decoding */
  76. rt_mp_delete(decoder->mp);
  77. #endif
  78. }
  79. struct mp3_decoder* mp3_decoder_create()
  80. {
  81. struct mp3_decoder* decoder;
  82. /* allocate object */
  83. decoder = (struct mp3_decoder*) rt_malloc (sizeof(struct mp3_decoder));
  84. if (decoder != RT_NULL)
  85. {
  86. mp3_decoder_init(decoder);
  87. }
  88. return decoder;
  89. }
  90. void mp3_decoder_delete(struct mp3_decoder* decoder)
  91. {
  92. RT_ASSERT(decoder != RT_NULL);
  93. /* de-init mp3 decoder object */
  94. mp3_decoder_detach(decoder);
  95. /* release this object */
  96. rt_free(decoder);
  97. }
  98. rt_uint16_t is_first = 1;
  99. rt_uint32_t current_offset = 0;
  100. static rt_int32_t mp3_decoder_fill_buffer(struct mp3_decoder* decoder)
  101. {
  102. rt_size_t bytes_read;
  103. rt_size_t bytes_to_read;
  104. // rt_kprintf("left: %d. refilling inbuffer...\n", decoder->bytes_left);
  105. if (decoder->bytes_left > 0)
  106. {
  107. // better: move unused rest of buffer to the start
  108. rt_memmove(decoder->read_buffer, decoder->read_ptr, decoder->bytes_left);
  109. }
  110. bytes_to_read = (MP3_AUDIO_BUF_SZ - decoder->bytes_left) & ~(512 - 1);
  111. // rt_kprintf("read bytes: %d\n", bytes_to_read);
  112. if (is_first) is_first = 0;
  113. else current_offset += MP3_AUDIO_BUF_SZ - decoder->bytes_left;
  114. bytes_read = read(decoder->fd, (char *)(decoder->read_buffer + decoder->bytes_left),
  115. bytes_to_read);
  116. if (bytes_read == bytes_to_read)
  117. {
  118. decoder->read_ptr = decoder->read_buffer;
  119. decoder->read_offset = 0;
  120. decoder->bytes_left = decoder->bytes_left + bytes_to_read;
  121. return 0;
  122. }
  123. else
  124. {
  125. rt_kprintf("can't read more data");
  126. return -1;
  127. }
  128. }
  129. int mp3_decoder_run(struct mp3_decoder* decoder)
  130. {
  131. int err;
  132. rt_uint16_t* buffer;
  133. RT_ASSERT(decoder != RT_NULL);
  134. if ((decoder->read_ptr == RT_NULL) || decoder->bytes_left < 2*MAINBUF_SIZE)
  135. {
  136. if(mp3_decoder_fill_buffer(decoder) != 0)
  137. return -1;
  138. }
  139. // rt_kprintf("read offset: 0x%08x\n", decoder->read_ptr - decoder->read_buffer);
  140. decoder->read_offset = MP3FindSyncWord(decoder->read_ptr, decoder->bytes_left);
  141. if (decoder->read_offset < 0)
  142. {
  143. rt_kprintf("Error: MP3FindSyncWord returned <0");
  144. if(mp3_decoder_fill_buffer(decoder) != 0)
  145. return -1;
  146. }
  147. // rt_kprintf("sync position: %x\n", decoder->read_offset);
  148. decoder->read_ptr += decoder->read_offset;
  149. decoder->bytes_left -= decoder->read_offset;
  150. decoder->bytes_left_before_decoding = decoder->bytes_left;
  151. #if 0
  152. // check if this is really a valid frame
  153. // (the decoder does not seem to calculate CRC, so make some plausibility checks)
  154. if (!(MP3GetNextFrameInfo(decoder->decoder, &decoder->frame_info, decoder->read_ptr) == 0 &&
  155. decoder->frame_info.nChans == 2 &&
  156. decoder->frame_info.version == 0))
  157. {
  158. rt_kprintf("this is an invalid frame\n");
  159. // advance data pointer
  160. // TODO: handle bytes_left == 0
  161. RT_ASSERT(decoder->bytes_left > 0);
  162. decoder->bytes_left --;
  163. decoder->read_ptr ++;
  164. return 0;
  165. }
  166. if (decoder->bytes_left < 1024)
  167. {
  168. if(mp3_decoder_fill_buffer(decoder) != 0)
  169. return -1;
  170. }
  171. #endif
  172. /* get a decoder buffer */
  173. buffer = (rt_uint16_t*)rt_mp_alloc(decoder->mp, RT_WAITING_FOREVER);
  174. // rt_kprintf("bytes left before decode: %d\n", decoder->bytes_left);
  175. err = MP3Decode(decoder->decoder, &decoder->read_ptr,
  176. (int*)&decoder->bytes_left, (short*)buffer, 0);
  177. // rt_kprintf("bytes left after decode: %d\n", decoder->bytes_left);
  178. decoder->frames++;
  179. if (err != ERR_MP3_NONE)
  180. {
  181. switch (err)
  182. {
  183. case ERR_MP3_INDATA_UNDERFLOW:
  184. rt_kprintf("ERR_MP3_INDATA_UNDERFLOW\n");
  185. decoder->bytes_left = 0;
  186. if(mp3_decoder_fill_buffer(decoder) != 0)
  187. return -1;
  188. break;
  189. case ERR_MP3_MAINDATA_UNDERFLOW:
  190. /* do nothing - next call to decode will provide more mainData */
  191. rt_kprintf("ERR_MP3_MAINDATA_UNDERFLOW\n");
  192. break;
  193. case ERR_MP3_INVALID_FRAMEHEADER:
  194. rt_kprintf("ERR_MP3_INVALID_FRAMEHEADER\n");
  195. rt_kprintf("current offset: 0x%08x, frames: %d\n", current_offset, decoder->frames);
  196. /* dump sector */
  197. {
  198. rt_uint8_t *ptr;
  199. rt_size_t size = 0, col = 0;
  200. ptr = decoder->read_buffer;
  201. rt_kprintf(" 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
  202. rt_kprintf("00 ");
  203. while (size ++ < 512)
  204. {
  205. rt_kprintf("%02x ", *ptr ++);
  206. if (size % 16 == 0) rt_kprintf("\n%02x ", ++col);
  207. }
  208. }
  209. RT_ASSERT(0);
  210. // break;
  211. case ERR_MP3_INVALID_HUFFCODES:
  212. rt_kprintf("ERR_MP3_INVALID_HUFFCODES\n");
  213. break;
  214. default:
  215. rt_kprintf("unknown error: %i\n", err);
  216. // skip this frame
  217. if (decoder->bytes_left > 0)
  218. {
  219. decoder->bytes_left --;
  220. decoder->read_ptr ++;
  221. }
  222. else
  223. {
  224. // TODO
  225. RT_ASSERT(0);
  226. }
  227. break;
  228. }
  229. /* release this memory block */
  230. rt_mp_free(buffer);
  231. }
  232. else
  233. {
  234. /* no error */
  235. MP3GetLastFrameInfo(decoder->decoder, &decoder->frame_info);
  236. // #ifdef MP3_DECODER_TRACE
  237. rt_kprintf("Bitrate: %i\n", decoder->frame_info.bitrate);
  238. rt_kprintf("%i samples\n", decoder->frame_info.outputSamps);
  239. rt_kprintf("%lu Hz, %i kbps\n", decoder->frame_info.samprate,
  240. decoder->frame_info.bitrate/1000);
  241. // #endif
  242. /* set sample rate */
  243. /* write to sound device */
  244. rt_device_write(decoder->snd_device, 0, buffer, decoder->frame_info.outputSamps * 2);
  245. // rt_mp_free(buffer);
  246. }
  247. return 0;
  248. }
  249. #include <finsh.h>
  250. void mp3(char* filename)
  251. {
  252. int fd;
  253. struct mp3_decoder* decoder;
  254. fd = open(filename, O_RDONLY, 0);
  255. if (fd >= 0)
  256. {
  257. decoder = mp3_decoder_create();
  258. if (decoder != RT_NULL)
  259. {
  260. decoder->fd = fd;
  261. while (mp3_decoder_run(decoder) != -1);
  262. close(fd);
  263. /* delete decoder object */
  264. mp3_decoder_delete(decoder);
  265. }
  266. }
  267. }
  268. FINSH_FUNCTION_EXPORT(mp3, mp3 decode test)