4
0
mirror of https://github.com/RT-Thread/rt-thread.git synced 2025-02-28 05:27:04 +08:00

Corrected MP3 duration calculation. / Increased SD card wait count to 10 for slow cards. / Updated play time display of player UI.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@430 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
kyle.hu.gz 2010-02-21 20:41:42 +00:00
parent ab13173bf8
commit f4cb1ba595
3 changed files with 89 additions and 44 deletions

View File

@ -403,7 +403,7 @@ void mp3_get_info(const char* filename, struct tag_info* info)
} }
p += sync_word + 4; p += sync_word + 4;
if (strncmp("Xing", (char *) mp3_fd_buffer + p, 4) || strncmp("Info", (char *) mp3_fd_buffer + p, 4)) if (strncmp("Xing", (char *) mp3_fd_buffer + p, 4) == 0 || strncmp("Info", (char *) mp3_fd_buffer + p, 4) == 0)
{ {
// VBR // VBR
if (mp3_fd_buffer[p + 7] & 1 == 1) /* Checks if the frames field exists */ if (mp3_fd_buffer[p + 7] & 1 == 1) /* Checks if the frames field exists */
@ -412,6 +412,12 @@ void mp3_get_info(const char* filename, struct tag_info* info)
info->duration = frames * samples_per_frame / frame_info.samprate; info->duration = frames * samples_per_frame / frame_info.samprate;
info->bit_rate = lseek(fd, 0, SEEK_END) * 8 / info->duration; info->bit_rate = lseek(fd, 0, SEEK_END) * 8 / info->duration;
} }
else
{
// Calculate as CBR
info->duration = lseek(fd, 0, SEEK_END) / (frame_info.bitrate / 8); /* second */
info->bit_rate = frame_info.bitrate;
}
} }
/* /*
* There're two other rarely used VBR header standards: VBRI & MLLT. * There're two other rarely used VBR header standards: VBRI & MLLT.

View File

@ -22,6 +22,37 @@
#define RADIO_FN "/radio.pls" #define RADIO_FN "/radio.pls"
const static char *time_bg_xpm[] = {
"48 20 7 1",
". c #007DC6",
"+ c #0079C6",
"@ c #0079BD",
"# c #0075BD",
"$ c #0071BD",
"% c #0071B5",
"& c #006DB5",
"................................................",
"................................................",
"................................................",
"................................................",
"................................................",
"++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"################################################",
"################################################",
"################################################",
"################################################",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"};
static struct rtgui_view* home_view; static struct rtgui_view* home_view;
static struct rtgui_list_view* function_view; static struct rtgui_list_view* function_view;
static struct rtgui_workbench* workbench; static struct rtgui_workbench* workbench;
@ -30,6 +61,8 @@ static rt_thread_t player_ui_tid = RT_NULL;
static enum PLAYER_MODE player_mode = PLAYER_STOP; static enum PLAYER_MODE player_mode = PLAYER_STOP;
static enum PLAYER_STEP next_step = PLAYER_STEP_STOP; static enum PLAYER_STEP next_step = PLAYER_STEP_STOP;
static struct tag_info tinfo; static struct tag_info tinfo;
static rt_uint32_t play_time;
static rtgui_image_t *time_bg_image;
void player_play_file(const char* fn); void player_play_file(const char* fn);
void player_play_url(const char* url); void player_play_url(const char* url);
@ -45,16 +78,29 @@ static void info_timer_timeout(rtgui_timer_t* timer, void* parameter)
saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)); saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view));
RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(206, 231, 255); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(206, 231, 255);
rtgui_dc_draw_hline(dc, 14, 14 + (tinfo.position * 212)/ tinfo.duration, rtgui_dc_draw_hline(dc, 14, 14 + (tinfo.position * 212) / tinfo.duration, 75);
75);
if ((player_mode == PLAYER_PLAY_RADIO) && ((tinfo.position * 212 + 14)/tinfo.duration) < 226) if ((player_mode == PLAYER_PLAY_RADIO) && ((tinfo.position * 212 + 14)/tinfo.duration) < 226)
{ {
RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(82, 199, 16); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(82, 199, 16);
rtgui_dc_draw_hline(dc, 14 + (tinfo.position * 212) / tinfo.duration, 226, 75); rtgui_dc_draw_hline(dc, 14 + (tinfo.position * 212) / tinfo.duration, 226, 75);
} }
RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = saved; RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = saved;
if (player_mode == PLAYER_PLAY_FILE)
{
rtgui_rect_t rect;
char line[32];
play_time++;
rt_snprintf(line, sizeof(line), "%3d:%02d", play_time / 60, play_time % 60);
rect.x1 = 172; rect.y1 = 39;
rect.x2 = 220; rect.y2 = 59;
rtgui_image_blit(time_bg_image, dc, &rect);
rtgui_dc_draw_text(dc, line, &rect);
}
rtgui_dc_end_drawing(dc); rtgui_dc_end_drawing(dc);
} }
@ -71,8 +117,7 @@ static void player_update_tag_info(struct rtgui_dc* dc)
rect.x1 = 0; rect.y1 = 0; rect.x1 = 0; rect.y1 = 0;
rect.x2 = 240; rect.y2 = 65; rect.x2 = 240; rect.y2 = 65;
/* draw background */ /* draw background */
background = rtgui_image_create_from_file("hdc", background = rtgui_image_create_from_file("hdc", "/resource/bg.hdc", RT_FALSE);
"/resource/bg.hdc", RT_FALSE);
if (background != RT_NULL) if (background != RT_NULL)
{ {
rtgui_image_blit(background, dc, &rect); rtgui_image_blit(background, dc, &rect);
@ -90,8 +135,7 @@ static void player_update_tag_info(struct rtgui_dc* dc)
rect.x2 = 220; rect.y2 = rect.y1 + 16; rect.x2 = 220; rect.y2 = rect.y1 + 16;
if (player_mode == PLAYER_STOP) if (player_mode == PLAYER_STOP)
{ {
rt_snprintf(line, sizeof(line), rt_snprintf(line, sizeof(line), "ÍøÂçÊÕÒô»ú");
"ÍøÂçÊÕÒô»ú");
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
} }
else else
@ -101,8 +145,7 @@ static void player_update_tag_info(struct rtgui_dc* dc)
rect.x2 = 220; rect.y2 = 59; rect.x2 = 220; rect.y2 = 59;
if (player_mode == PLAYER_STOP) if (player_mode == PLAYER_STOP)
{ {
rt_snprintf(line, sizeof(line), rt_snprintf(line, sizeof(line), "radio.rt-thread.org");
"radio.rt-thread.org");
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
} }
else else
@ -110,9 +153,10 @@ static void player_update_tag_info(struct rtgui_dc* dc)
if ((tinfo.duration != 0) && player_mode == PLAYER_PLAY_FILE) if ((tinfo.duration != 0) && player_mode == PLAYER_PLAY_FILE)
{ {
rect.x1 = rect.x2 - 64; play_time = 0;
rt_snprintf(line, sizeof(line), "%02d:%02d:%02d",
tinfo.duration / 3600, tinfo.duration / 60, tinfo.duration % 60); rect.x1 = 172;
rt_snprintf(line, sizeof(line), " 0:00");
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
} }
@ -225,8 +269,7 @@ static void function_filelist(void* parameter)
} }
else if (line[0] != '/') else if (line[0] != '/')
{ {
rt_snprintf(fn, sizeof(fn), rt_snprintf(fn, sizeof(fn), "%s/%s", view->current_directory, line);
"%s/%s", view->current_directory, line);
play_list_append(fn); play_list_append(fn);
} }
else play_list_append(line); else play_list_append(line);
@ -453,8 +496,7 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
saved = RTGUI_WIDGET_FOREGROUND(widget); saved = RTGUI_WIDGET_FOREGROUND(widget);
/* draw background */ /* draw background */
background = rtgui_image_create_from_file("hdc", background = rtgui_image_create_from_file("hdc", "/resource/bg.hdc", RT_FALSE);
"/resource/bg.hdc", RT_FALSE);
if (background != RT_NULL) if (background != RT_NULL)
{ {
rtgui_image_t *play; rtgui_image_t *play;
@ -466,11 +508,9 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
background = RT_NULL; background = RT_NULL;
if (player_mode == PLAYER_STOP) if (player_mode == PLAYER_STOP)
play = rtgui_image_create_from_mem("hdc", play = rtgui_image_create_from_mem("hdc", stop_hdh, sizeof(stop_hdh), RT_FALSE);
stop_hdh, sizeof(stop_hdh), RT_FALSE);
else else
play = rtgui_image_create_from_mem("hdc", play = rtgui_image_create_from_mem("hdc", play_hdh, sizeof(play_hdh), RT_FALSE);
play_hdh, sizeof(play_hdh), RT_FALSE);
play_rect.x1 = 32; play_rect.y1 = 92; play_rect.x1 = 32; play_rect.y1 = 92;
play_rect.x2 = 61; play_rect.y2 = 114; play_rect.x2 = 61; play_rect.y2 = 114;
rtgui_image_blit(play, dc, &play_rect); rtgui_image_blit(play, dc, &play_rect);
@ -490,19 +530,18 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
rect.x2 = 220; rect.y2 = rect.y1 + 16; rect.x2 = 220; rect.y2 = rect.y1 + 16;
if (player_mode == PLAYER_STOP) if (player_mode == PLAYER_STOP)
{ {
rt_snprintf(line, sizeof(line), rt_snprintf(line, sizeof(line), "ÍøÂçÊÕÒô»ú");
"ÍøÂçÊÕÒô»ú");
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
} }
else else
rtgui_dc_draw_text(dc, tinfo.title, &rect); rtgui_dc_draw_text(dc, tinfo.title, &rect);
rect.x1 = 28; rect.y1 = 39; rect.x1 = 28; rect.y1 = 39;
rect.x2 = 220; rect.y2 = 59; rect.x2 = 170; rect.y2 = 59;
if (player_mode == PLAYER_STOP) if (player_mode == PLAYER_STOP)
{ {
rt_snprintf(line, sizeof(line), rect.x2 = 220;
"radio.rt-thread.org"); rt_snprintf(line, sizeof(line), "radio.rt-thread.org");
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
} }
else else
@ -510,9 +549,10 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
if ((tinfo.duration != 0) && (player_mode == PLAYER_PLAY_FILE)) if ((tinfo.duration != 0) && (player_mode == PLAYER_PLAY_FILE))
{ {
rect.x1 = rect.x2 - 64; rt_uint32_t t = player_mode == PLAYER_STOP ? tinfo.duration : play_time;
rt_snprintf(line, sizeof(line), "%02d:%02d:%02d",
tinfo.duration / 3600, tinfo.duration / 60, tinfo.duration % 60); rect.x1 = 172; rect.x2 = 220;
rt_snprintf(line, sizeof(line), "%3d:%02d", t / 60, t % 60);
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
} }
} }
@ -529,21 +569,18 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
struct play_item* item; struct play_item* item;
rect.x1 = 20; rect.y1 = 150; rect.x1 = 20; rect.y1 = 150;
rect.x2 = 220; rect.y2 = 168; rect.x2 = 170; rect.y2 = 168;
for (index = 0; index < play_list_items() && index < 8; index ++) for (index = 0; index < play_list_items() && index < 8; index ++)
{ {
item = play_list_item(index); item = play_list_item(index);
rtgui_dc_draw_text(dc, item->title, &rect); rtgui_dc_draw_text(dc, item->title, &rect);
rect.x1 = rect.x2 - 64; rect.x1 = 172; rect.x2 = 220;
rt_snprintf(line, sizeof(line), "%02d:%02d:%02d", rt_snprintf(line, sizeof(line), "%3d:%02d", item->duration / 60, item->duration % 60);
item->duration / 3600,
item->duration / 60,
item->duration % 60);
rtgui_dc_draw_text(dc, line, &rect); rtgui_dc_draw_text(dc, line, &rect);
/* move to next item */ /* move to next item */
rect.x1 = 20; rect.x1 = 20; rect.x2 = 170;
rect.y1 += 18; rect.y2 += 18; rect.y1 += 18; rect.y2 += 18;
} }
} }
@ -565,6 +602,7 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
next_step = PLAYER_STEP_NEXT; next_step = PLAYER_STEP_NEXT;
} }
break; break;
case RTGUIK_LEFT: case RTGUIK_LEFT:
if (player_mode == PLAYER_PLAY_FILE && play_list_items() > 0) if (player_mode == PLAYER_PLAY_FILE && play_list_items() > 0)
{ {
@ -606,6 +644,7 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
case PLAYER_REQUEST_PLAY_LIST: case PLAYER_REQUEST_PLAY_LIST:
rtgui_timer_start(info_timer); rtgui_timer_start(info_timer);
break; break;
case PLAYER_REQUEST_STOP: case PLAYER_REQUEST_STOP:
{ {
rtgui_timer_stop(info_timer); rtgui_timer_stop(info_timer);
@ -632,8 +671,7 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
rtgui_dc_draw_hline(dc, 14, 226, 75); rtgui_dc_draw_hline(dc, 14, 226, 75);
/* update play button */ /* update play button */
button = rtgui_image_create_from_mem("hdc", button = rtgui_image_create_from_mem("hdc", stop_hdh, sizeof(stop_hdh), RT_FALSE);
stop_hdh, sizeof(stop_hdh), RT_FALSE);
play_rect.x1 = 32; play_rect.y1 = 92; play_rect.x1 = 32; play_rect.y1 = 92;
play_rect.x2 = 61; play_rect.y2 = 114; play_rect.x2 = 61; play_rect.y2 = 114;
rtgui_image_blit(button, dc, &play_rect); rtgui_image_blit(button, dc, &play_rect);
@ -643,6 +681,7 @@ static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtg
rtgui_dc_end_drawing(dc); rtgui_dc_end_drawing(dc);
} }
break; break;
case PLAYER_STEP_NEXT: case PLAYER_STEP_NEXT:
if (play_list_is_end() == RT_TRUE) if (play_list_is_end() == RT_TRUE)
{ {
@ -730,9 +769,9 @@ static void player_entry(void* parameter)
rtgui_thread_register(rt_thread_self(), mq); rtgui_thread_register(rt_thread_self(), mq);
/* create information timer */ /* create information timer */
info_timer = rtgui_timer_create(RT_TICK_PER_SECOND, info_timer = rtgui_timer_create(RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC, info_timer_timeout, RT_NULL);
RT_TIMER_FLAG_PERIODIC,
info_timer_timeout, RT_NULL); time_bg_image = rtgui_image_create_from_mem("xpm", (rt_uint8_t *) time_bg_xpm, sizeof(time_bg_xpm), RT_TRUE);
workbench = rtgui_workbench_create("main", "workbench"); workbench = rtgui_workbench_create("main", "workbench");
if (workbench == RT_NULL) return; if (workbench == RT_NULL) return;

View File

@ -961,7 +961,7 @@ SD_Error SD_ReadBlock(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize)
DMA_RxConfiguration(readbuff, BlockSize); DMA_RxConfiguration(readbuff, BlockSize);
while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
{ {
if ((TransferError != SD_OK) || (rt_tick_get() - tick > 2)) if ((TransferError != SD_OK) || (rt_tick_get() - tick > 10))
{ {
errorstatus = SD_ERROR; errorstatus = SD_ERROR;
// rt_kprintf("sd error\n"); // rt_kprintf("sd error\n");
@ -1169,7 +1169,7 @@ SD_Error SD_ReadMultiBlocks(uint32_t addr, uint32_t *readbuff, uint16_t BlockSiz
DMA_RxConfiguration(readbuff, (NumberOfBlocks * BlockSize)); DMA_RxConfiguration(readbuff, (NumberOfBlocks * BlockSize));
while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
{ {
if ((TransferError != SD_OK) || (rt_tick_get() - tick > 2)) if ((TransferError != SD_OK) || (rt_tick_get() - tick > 10))
{ {
errorstatus = SD_ERROR; errorstatus = SD_ERROR;
// rt_kprintf("sd error\n"); // rt_kprintf("sd error\n");