mp3.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. #include <rtthread.h>
  2. #include <dfs_posix.h>
  3. #include <mp3/pub/mp3dec.h>
  4. #include <string.h>
  5. #include "board.h"
  6. #include "netbuffer.h"
  7. #include "player_ui.h"
  8. #include "player_bg.h"
  9. #define MP3_AUDIO_BUF_SZ (5 * 1024)
  10. #ifndef MIN
  11. #define MIN(x, y) ((x) < (y)? (x) : (y))
  12. #endif
  13. rt_uint8_t mp3_fd_buffer[MP3_AUDIO_BUF_SZ];
  14. struct mp3_decoder
  15. {
  16. /* mp3 information */
  17. HMP3Decoder decoder;
  18. MP3FrameInfo frame_info;
  19. rt_uint32_t frames;
  20. /* mp3 file descriptor */
  21. rt_size_t (*fetch_data)(void* parameter, rt_uint8_t *buffer, rt_size_t length);
  22. void* fetch_parameter;
  23. /* mp3 read session */
  24. rt_uint8_t *read_buffer, *read_ptr;
  25. rt_int32_t read_offset;
  26. rt_uint32_t bytes_left, bytes_left_before_decoding;
  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 */
  33. sbuf_release(buffer);
  34. return RT_EOK;
  35. }
  36. void mp3_decoder_init(struct mp3_decoder* decoder)
  37. {
  38. RT_ASSERT(decoder != RT_NULL);
  39. /* init read session */
  40. decoder->read_ptr = RT_NULL;
  41. decoder->bytes_left_before_decoding = decoder->bytes_left = 0;
  42. decoder->frames = 0;
  43. // decoder->read_buffer = rt_malloc(MP3_AUDIO_BUF_SZ);
  44. decoder->read_buffer = &mp3_fd_buffer[0];
  45. if (decoder->read_buffer == RT_NULL) return;
  46. decoder->decoder = MP3InitDecoder();
  47. /* open audio device */
  48. decoder->snd_device = rt_device_find("snd");
  49. if (decoder->snd_device != RT_NULL)
  50. {
  51. /* set tx complete call back function */
  52. rt_device_set_tx_complete(decoder->snd_device, mp3_decoder_tx_done);
  53. rt_device_open(decoder->snd_device, RT_DEVICE_OFLAG_WRONLY);
  54. }
  55. }
  56. void mp3_decoder_detach(struct mp3_decoder* decoder)
  57. {
  58. RT_ASSERT(decoder != RT_NULL);
  59. /* close audio device */
  60. if (decoder->snd_device != RT_NULL)
  61. rt_device_close(decoder->snd_device);
  62. /* release mp3 decoder */
  63. MP3FreeDecoder(decoder->decoder);
  64. }
  65. struct mp3_decoder* mp3_decoder_create()
  66. {
  67. struct mp3_decoder* decoder;
  68. /* allocate object */
  69. decoder = (struct mp3_decoder*) rt_malloc (sizeof(struct mp3_decoder));
  70. if (decoder != RT_NULL)
  71. {
  72. mp3_decoder_init(decoder);
  73. }
  74. return decoder;
  75. }
  76. void mp3_decoder_delete(struct mp3_decoder* decoder)
  77. {
  78. RT_ASSERT(decoder != RT_NULL);
  79. /* de-init mp3 decoder object */
  80. mp3_decoder_detach(decoder);
  81. /* release this object */
  82. rt_free(decoder);
  83. }
  84. rt_uint32_t current_offset = 0;
  85. static rt_int32_t mp3_decoder_fill_buffer(struct mp3_decoder* decoder)
  86. {
  87. rt_size_t bytes_read;
  88. rt_size_t bytes_to_read;
  89. // rt_kprintf("left: %d. refilling inbuffer...\n", decoder->bytes_left);
  90. if (decoder->bytes_left > 0)
  91. {
  92. // better: move unused rest of buffer to the start
  93. rt_memmove(decoder->read_buffer, decoder->read_ptr, decoder->bytes_left);
  94. }
  95. bytes_to_read = (MP3_AUDIO_BUF_SZ - decoder->bytes_left) & ~(512 - 1);
  96. bytes_read = decoder->fetch_data(decoder->fetch_parameter,
  97. (rt_uint8_t *)(decoder->read_buffer + decoder->bytes_left),
  98. bytes_to_read);
  99. if (bytes_read != 0)
  100. {
  101. decoder->read_ptr = decoder->read_buffer;
  102. decoder->read_offset = 0;
  103. decoder->bytes_left = decoder->bytes_left + bytes_read;
  104. return 0;
  105. }
  106. else
  107. {
  108. rt_kprintf("can't read more data\n");
  109. return -1;
  110. }
  111. }
  112. int mp3_decoder_run(struct mp3_decoder* decoder)
  113. {
  114. int err;
  115. rt_uint16_t* buffer;
  116. rt_uint32_t delta;
  117. RT_ASSERT(decoder != RT_NULL);
  118. if (player_is_playing() != RT_TRUE) return -1;
  119. if ((decoder->read_ptr == RT_NULL) || decoder->bytes_left < 2*MAINBUF_SIZE)
  120. {
  121. if(mp3_decoder_fill_buffer(decoder) != 0)
  122. return -1;
  123. }
  124. // rt_kprintf("read offset: 0x%08x\n", decoder->read_ptr - decoder->read_buffer);
  125. decoder->read_offset = MP3FindSyncWord(decoder->read_ptr, decoder->bytes_left);
  126. if (decoder->read_offset < 0)
  127. {
  128. /* discard this data */
  129. rt_kprintf("outof sync, byte left: %d\n", decoder->bytes_left);
  130. decoder->bytes_left = 0;
  131. return 0;
  132. }
  133. decoder->read_ptr += decoder->read_offset;
  134. delta = decoder->read_offset;
  135. decoder->bytes_left -= decoder->read_offset;
  136. if (decoder->bytes_left < 1024)
  137. {
  138. /* fill more data */
  139. if(mp3_decoder_fill_buffer(decoder) != 0)
  140. return -1;
  141. }
  142. /* get a decoder buffer */
  143. buffer = (rt_uint16_t*)sbuf_alloc();
  144. decoder->bytes_left_before_decoding = decoder->bytes_left;
  145. err = MP3Decode(decoder->decoder, &decoder->read_ptr,
  146. (int*)&decoder->bytes_left, (short*)buffer, 0);
  147. delta += (decoder->bytes_left_before_decoding - decoder->bytes_left);
  148. current_offset += delta;
  149. if (player_get_mode() != PLAYER_PLAY_RADIO)
  150. player_set_position(current_offset);
  151. // rt_kprintf("bytes left after decode: %d\n", decoder->bytes_left);
  152. decoder->frames++;
  153. if (err != ERR_MP3_NONE)
  154. {
  155. switch (err)
  156. {
  157. case ERR_MP3_INDATA_UNDERFLOW:
  158. rt_kprintf("ERR_MP3_INDATA_UNDERFLOW\n");
  159. decoder->bytes_left = 0;
  160. if(mp3_decoder_fill_buffer(decoder) != 0)
  161. {
  162. /* release this memory block */
  163. sbuf_release(buffer);
  164. return -1;
  165. }
  166. break;
  167. case ERR_MP3_MAINDATA_UNDERFLOW:
  168. /* do nothing - next call to decode will provide more mainData */
  169. rt_kprintf("ERR_MP3_MAINDATA_UNDERFLOW\n");
  170. break;
  171. default:
  172. rt_kprintf("unknown error: %d, left: %d\n", err, decoder->bytes_left);
  173. // skip this frame
  174. if (decoder->bytes_left > 0)
  175. {
  176. decoder->bytes_left --;
  177. decoder->read_ptr ++;
  178. }
  179. else
  180. {
  181. // TODO
  182. RT_ASSERT(0);
  183. }
  184. break;
  185. }
  186. /* release this memory block */
  187. sbuf_release(buffer);
  188. }
  189. else
  190. {
  191. /* no error */
  192. MP3GetLastFrameInfo(decoder->decoder, &decoder->frame_info);
  193. /* set sample rate */
  194. /* write to sound device */
  195. if (decoder->frame_info.outputSamps > 0)
  196. {
  197. rt_device_write(decoder->snd_device, 0, buffer, decoder->frame_info.outputSamps * 2);
  198. }
  199. else
  200. {
  201. /* no output */
  202. sbuf_release(buffer);
  203. }
  204. }
  205. return 0;
  206. }
  207. static int mp3_parse_id3v1(int fd, struct tag_info *info)
  208. {
  209. lseek(fd, -128, SEEK_END);
  210. read(fd, (char *) mp3_fd_buffer, 128);
  211. /* ID3v1 */
  212. if (strncmp("TAG", (char *) mp3_fd_buffer, 3) == 0)
  213. {
  214. strncpy(info->title, (char *) mp3_fd_buffer + 3, MIN(30, sizeof(info->title) - 1));
  215. strncpy(info->artist, (char *) mp3_fd_buffer + 3 + 30, MIN(30, sizeof(info->artist) - 1));
  216. return 0;
  217. }
  218. return -1;
  219. }
  220. static int mp3_parse_id3v2(int fd, struct tag_info *info)
  221. {
  222. rt_uint32_t p = 0;
  223. lseek(fd, 0, SEEK_SET);
  224. read(fd, (char *) mp3_fd_buffer, sizeof(mp3_fd_buffer));
  225. if (strncmp("ID3", (char *) mp3_fd_buffer, 3) == 0)
  226. {
  227. rt_uint32_t tag_size, frame_size, i;
  228. rt_uint8_t version_major;
  229. int frame_header_size;
  230. tag_size = ((rt_uint32_t) mp3_fd_buffer[6] << 21) | ((rt_uint32_t) mp3_fd_buffer[7] << 14) | ((rt_uint16_t) mp3_fd_buffer[8] << 7) | mp3_fd_buffer[9];
  231. info->data_start = tag_size;
  232. version_major = mp3_fd_buffer[3];
  233. if (version_major >= 3)
  234. {
  235. frame_header_size = 10;
  236. }
  237. else
  238. {
  239. frame_header_size = 6;
  240. }
  241. i = p = 10;
  242. // iterate through frames
  243. while (p < tag_size)
  244. {
  245. if (version_major >= 3)
  246. {
  247. frame_size = ((rt_uint32_t) mp3_fd_buffer[i + 4] << 24) | ((rt_uint32_t) mp3_fd_buffer[i + 5] << 16) | ((rt_uint16_t) mp3_fd_buffer[i + 6] << 8) | mp3_fd_buffer[i + 7];
  248. }
  249. else
  250. {
  251. frame_size = ((rt_uint32_t) mp3_fd_buffer[i + 3] << 14) | ((rt_uint16_t) mp3_fd_buffer[i + 4] << 7) | mp3_fd_buffer[i + 5];
  252. }
  253. if (i + frame_size + frame_header_size + frame_header_size >= sizeof(mp3_fd_buffer))
  254. {
  255. if (frame_size + frame_header_size > sizeof(mp3_fd_buffer))
  256. {
  257. lseek(fd, p + frame_size + frame_header_size, SEEK_CUR);
  258. read(fd, (char *) mp3_fd_buffer, sizeof(mp3_fd_buffer));
  259. p += frame_size + frame_header_size;
  260. i = 0;
  261. continue;
  262. }
  263. else
  264. {
  265. int r = sizeof(mp3_fd_buffer) - i;
  266. memmove(mp3_fd_buffer, mp3_fd_buffer + i, r);
  267. read(fd, (char *) mp3_fd_buffer + r, i);
  268. i = 0;
  269. }
  270. }
  271. if (strncmp("TT2", (char *) mp3_fd_buffer + i, 3) == 0 || strncmp("TIT2", (char *) mp3_fd_buffer + i, 4) == 0)
  272. {
  273. strncpy(info->title, (char *) mp3_fd_buffer + i + frame_header_size + 1, MIN(frame_size - 1, sizeof(info->title) - 1));
  274. }
  275. else if (strncmp("TP1", (char *) mp3_fd_buffer + i, 3) == 0 || strncmp("TPE1", (char *) mp3_fd_buffer + i, 4) == 0)
  276. {
  277. strncpy(info->artist, (char *) mp3_fd_buffer + i + frame_header_size + 1, MIN(frame_size - 1, sizeof(info->artist) - 1));
  278. }
  279. p += frame_size + frame_header_size;
  280. i += frame_size + frame_header_size;
  281. }
  282. return 0;
  283. }
  284. return -1;
  285. }
  286. /* get mp3 information */
  287. void mp3_get_info(const char* filename, struct tag_info* info)
  288. {
  289. int fd;
  290. rt_size_t bytes_read;
  291. int sync_word;
  292. HMP3Decoder decoder;
  293. MP3FrameInfo frame_info;
  294. if (filename == RT_NULL || info == RT_NULL) return;
  295. fd = open(filename, O_RDONLY, 0);
  296. if (fd < 0) return; /* can't read file */
  297. /* init decoder */
  298. decoder = MP3InitDecoder();
  299. info->data_start = 0;
  300. /*
  301. * TODO - Add UTF-8 support and fix this.
  302. *
  303. * ID3 v2 is generally useless here, because it
  304. * uses UTF-8 encoding, which we can't handle right now.
  305. * But parsing v2 first is nesessary in order to
  306. * find the correct MP3 frame header location,
  307. * in case of the ID3 v2 tag should be there.
  308. */
  309. // if (mp3_parse_id3v2(fd, info) < 0)
  310. // {
  311. // // ID3 v2 is not available. Fall back to ID3 v1.
  312. // mp3_parse_id3v1(fd, info);
  313. // }
  314. mp3_parse_id3v2(fd, info);
  315. mp3_parse_id3v1(fd, info);
  316. lseek(fd, info->data_start, SEEK_SET);
  317. bytes_read = read(fd, (char *) mp3_fd_buffer, sizeof(mp3_fd_buffer));
  318. /* get frame information */
  319. sync_word = MP3FindSyncWord(mp3_fd_buffer, bytes_read);
  320. if (sync_word >= 0)
  321. {
  322. rt_uint32_t p;
  323. short samples_per_frame;
  324. /* get frame information */
  325. MP3GetNextFrameInfo(decoder, &frame_info, &mp3_fd_buffer[sync_word]);
  326. // Try to locate the Xing VBR header.
  327. if (frame_info.version == MPEG1)
  328. {
  329. p = frame_info.nChans == 2 ? 32 : 17;
  330. samples_per_frame = 1152;
  331. }
  332. else
  333. {
  334. p = frame_info.nChans == 2 ? 17 : 9;
  335. samples_per_frame = 576;
  336. }
  337. p += sync_word + 4;
  338. if (strncmp("Xing", (char *) mp3_fd_buffer + p, 4) == 0 || strncmp("Info", (char *) mp3_fd_buffer + p, 4) == 0)
  339. {
  340. // VBR
  341. if (mp3_fd_buffer[p + 7] & 1 == 1) /* Checks if the frames field exists */
  342. {
  343. rt_uint32_t frames = ((rt_uint32_t) mp3_fd_buffer[p + 8] << 24) | ((rt_uint32_t) mp3_fd_buffer[p + 9] << 16) | ((rt_uint32_t) mp3_fd_buffer[p + 10] << 8) | (rt_uint32_t) mp3_fd_buffer[p + 11];
  344. info->duration = frames * samples_per_frame / frame_info.samprate;
  345. info->bit_rate = lseek(fd, 0, SEEK_END) * 8 / info->duration;
  346. }
  347. else
  348. {
  349. // Calculate as CBR
  350. info->duration = lseek(fd, 0, SEEK_END) / (frame_info.bitrate / 8); /* second */
  351. info->bit_rate = frame_info.bitrate;
  352. }
  353. }
  354. /*
  355. * There're two other rarely used VBR header standards: VBRI & MLLT.
  356. * I can't find any sample with these headers. So I just ignored them. :)
  357. */
  358. else
  359. {
  360. // CBR
  361. info->duration = lseek(fd, 0, SEEK_END) / (frame_info.bitrate / 8); /* second */
  362. info->bit_rate = frame_info.bitrate;
  363. }
  364. info->sampling = frame_info.samprate;
  365. }
  366. /* set current position */
  367. info->position = 0;
  368. /* release mp3 decoder */
  369. MP3FreeDecoder(decoder);
  370. /* close file */
  371. close(fd);
  372. }
  373. #include <finsh.h>
  374. rt_size_t fd_fetch(void* parameter, rt_uint8_t *buffer, rt_size_t length)
  375. {
  376. int fd = (int)parameter;
  377. int read_bytes;
  378. read_bytes = read(fd, (char*)buffer, length);
  379. if (read_bytes <= 0) return 0;
  380. return read_bytes;
  381. }
  382. void mp3(char* filename)
  383. {
  384. int fd;
  385. struct mp3_decoder* decoder;
  386. extern rt_bool_t is_playing;
  387. is_playing = RT_TRUE;
  388. fd = open(filename, O_RDONLY, 0);
  389. if (fd >= 0)
  390. {
  391. decoder = mp3_decoder_create();
  392. if (decoder != RT_NULL)
  393. {
  394. decoder->fetch_data = fd_fetch;
  395. decoder->fetch_parameter = (void*)fd;
  396. current_offset = 0;
  397. while (mp3_decoder_run(decoder) != -1);
  398. /* delete decoder object */
  399. mp3_decoder_delete(decoder);
  400. }
  401. close(fd);
  402. }
  403. is_playing = RT_FALSE;
  404. }
  405. FINSH_FUNCTION_EXPORT(mp3, mp3 decode test);
  406. #if STM32_EXT_SRAM
  407. /* http mp3 */
  408. #include "http.h"
  409. static rt_size_t http_fetch(rt_uint8_t* ptr, rt_size_t len, void* parameter)
  410. {
  411. struct http_session* session = (struct http_session*)parameter;
  412. RT_ASSERT(session != RT_NULL);
  413. return http_session_read(session, ptr, len);
  414. }
  415. static void http_close(void* parameter)
  416. {
  417. struct http_session* session = (struct http_session*)parameter;
  418. RT_ASSERT(session != RT_NULL);
  419. http_session_close(session);
  420. }
  421. rt_size_t http_data_fetch(void* parameter, rt_uint8_t *buffer, rt_size_t length)
  422. {
  423. return net_buf_read(buffer, length);
  424. }
  425. void http_mp3(char* url)
  426. {
  427. struct http_session* session;
  428. struct mp3_decoder* decoder;
  429. extern rt_bool_t is_playing;
  430. is_playing = RT_TRUE;
  431. session = http_session_open(url);
  432. if (session != RT_NULL)
  433. {
  434. /* start a job to netbuf worker */
  435. if (net_buf_start_job(http_fetch, http_close, (void*)session) == 0)
  436. {
  437. decoder = mp3_decoder_create();
  438. if (decoder != RT_NULL)
  439. {
  440. decoder->fetch_data = http_data_fetch;
  441. decoder->fetch_parameter = RT_NULL;
  442. current_offset = 0;
  443. while (mp3_decoder_run(decoder) != -1);
  444. /* delete decoder object */
  445. mp3_decoder_delete(decoder);
  446. }
  447. session = RT_NULL;
  448. }
  449. else
  450. {
  451. /* start job failed, close session */
  452. http_session_close(session);
  453. }
  454. }
  455. }
  456. FINSH_FUNCTION_EXPORT(http_mp3, http mp3 decode test);
  457. /* ice mp3 */
  458. static rt_size_t ice_fetch(rt_uint8_t* ptr, rt_size_t len, void* parameter)
  459. {
  460. struct shoutcast_session* session = (struct shoutcast_session*)parameter;
  461. RT_ASSERT(session != RT_NULL);
  462. return shoutcast_session_read(session, ptr, len);
  463. }
  464. static void ice_close(void* parameter)
  465. {
  466. struct shoutcast_session* session = (struct shoutcast_session*)parameter;
  467. RT_ASSERT(session != RT_NULL);
  468. shoutcast_session_close(session);
  469. }
  470. rt_size_t ice_data_fetch(void* parameter, rt_uint8_t *buffer, rt_size_t length)
  471. {
  472. return net_buf_read(buffer, length);
  473. }
  474. void ice_mp3(char* url)
  475. {
  476. struct shoutcast_session* session;
  477. struct mp3_decoder* decoder;
  478. extern rt_bool_t is_playing;
  479. is_playing = RT_TRUE;
  480. session = shoutcast_session_open(url);
  481. if (session != RT_NULL)
  482. {
  483. /* start a job to netbuf worker */
  484. if (net_buf_start_job(ice_fetch, ice_close, (void*)session) == 0)
  485. {
  486. decoder = mp3_decoder_create();
  487. if (decoder != RT_NULL)
  488. {
  489. decoder->fetch_data = ice_data_fetch;
  490. decoder->fetch_parameter = RT_NULL;
  491. current_offset = 0;
  492. while (mp3_decoder_run(decoder) != -1);
  493. /* delete decoder object */
  494. mp3_decoder_delete(decoder);
  495. }
  496. session = RT_NULL;
  497. }
  498. else
  499. {
  500. /* start a job failed, close session */
  501. shoutcast_session_close(session);
  502. }
  503. }
  504. }
  505. FINSH_FUNCTION_EXPORT(ice_mp3, shoutcast mp3 decode test);
  506. #endif