提交 332d0d00 编写于 作者: B bernard.xiong

add more buffer in mp3 decoder. add picture browse support.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@418 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 856f7161
......@@ -8,7 +8,7 @@
#include "player_ui.h"
#include "player_bg.h"
#define MP3_AUDIO_BUF_SZ 4096
#define MP3_AUDIO_BUF_SZ 8192
#ifndef MIN
#define MIN(x, y) ((x) < (y)? (x) : (y))
#endif
......@@ -118,22 +118,21 @@ static rt_int32_t mp3_decoder_fill_buffer(struct mp3_decoder* decoder)
}
bytes_to_read = (MP3_AUDIO_BUF_SZ - decoder->bytes_left) & ~(512 - 1);
// rt_kprintf("read bytes: %d\n", bytes_to_read);
bytes_read = decoder->fetch_data(decoder->fetch_parameter,
(rt_uint8_t *)(decoder->read_buffer + decoder->bytes_left),
bytes_to_read);
if (bytes_read == bytes_to_read)
if (bytes_read != 0)
{
decoder->read_ptr = decoder->read_buffer;
decoder->read_offset = 0;
decoder->bytes_left = decoder->bytes_left + bytes_to_read;
decoder->bytes_left = decoder->bytes_left + bytes_read;
return 0;
}
else
{
rt_kprintf("can't read more data");
rt_kprintf("can't read more data\n");
return -1;
}
}
......@@ -415,7 +414,7 @@ void mp3_get_info(const char* filename, struct tag_info* info)
}
/*
* There're two other rarely used VBR header standards: VBRI & MLLT.
* I can't find any sample with these headers. So I just ignored them. :)
* I can't find any sample with these headers. So I just ignored them. :)
*/
else
{
......
#include <rtgui/rtgui.h>
#include <rtgui/image.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>
#include <dfs_posix.h>
#include <string.h>
#define PICTURE_DIR "/pictures"
enum picture_view_mode
{
VIEW_SINGLE_MODE,
VIEW_DIR_MODE,
VIEW_FN_LIST_MODE
};
static rtgui_view_t* picture_view = RT_NULL;
static enum picture_view_mode view_mode = VIEW_SINGLE_MODE;
/* current picture file name */
static char current_fn[32] = {0};
static const char** picture_fn_list;
static rt_uint8_t picture_fn_list_size, picture_fn_list_current;
static void picture_show_prev()
{
DIR* dir;
struct dirent* entry;
rt_bool_t is_last;
char fn[32];
fn[0] = '\0';
is_last = RT_FALSE;
dir = opendir(PICTURE_DIR);
if (dir == RT_NULL)
{
rt_kprintf("open directory failed\n");
return;
}
do
{
entry = readdir(dir);
if (entry != RT_NULL)
{
if (strstr(entry->d_name, ".hdc") != RT_NULL ||
strstr(entry->d_name, ".HDC") != RT_NULL)
{
/* it's a HDC image */
if ((strcmp(entry->d_name, current_fn) == 0) &&
is_last != RT_TRUE)
{
if (fn[0] == '\0')
{
/* it should be the last image */
is_last = RT_TRUE;
}
else
{
/* display image */
strcpy(current_fn, fn);
rtgui_widget_update(RTGUI_WIDGET(picture_view));
closedir(dir);
return;
}
}
strcpy(fn, entry->d_name);
}
}
} while(entry != RT_NULL);
/* close directory */
closedir(dir);
if ((is_last == RT_TRUE) && fn[0] != '\0')
{
strcpy(current_fn, fn);
rtgui_widget_update(RTGUI_WIDGET(picture_view));
}
}
static void picture_show_next()
{
DIR* dir;
struct dirent* entry;
rt_bool_t found, has_image;
found = RT_FALSE; has_image = RT_FALSE;
__restart:
dir = opendir(PICTURE_DIR);
if (dir == RT_NULL)
{
rt_kprintf("open directory failed\n");
return;
}
do
{
entry = readdir(dir);
if (entry != RT_NULL)
{
if (strstr(entry->d_name, ".hdc") != RT_NULL ||
strstr(entry->d_name, ".HDC") != RT_NULL)
{
/* this directory includes image */
has_image = RT_TRUE;
if (found == RT_TRUE || current_fn[0] == '\0')
{
strcpy(current_fn, entry->d_name);
rtgui_widget_update(RTGUI_WIDGET(picture_view));
closedir(dir);
return;
}
/* it's a HDC image */
if (strcmp(entry->d_name, current_fn) == 0)
found = RT_TRUE;
}
}
} while(entry != RT_NULL);
/* close directory */
closedir(dir);
if (has_image != RT_TRUE) return;
current_fn[0] = '\0';
goto __restart;
}
static rt_bool_t picture_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
if (event->type == RTGUI_EVENT_PAINT)
{
struct rtgui_dc* dc;
struct rtgui_rect rect;
struct rtgui_image* image;
char fn[32];
dc = rtgui_dc_begin_drawing(widget);
if (dc == RT_NULL) return RT_FALSE;
rtgui_widget_get_rect(widget, &rect);
/* open image */
rt_snprintf(fn, sizeof(fn), "%s/%s", PICTURE_DIR, current_fn);
image = rtgui_image_create_from_file("hdc",
fn, RT_FALSE);
if (image != RT_NULL)
{
/* blit image */
rtgui_image_blit(image, dc, &rect);
/* destroy image */
rtgui_image_destroy(image);
}
else
{
rtgui_dc_fill_rect(dc, &rect);
rtgui_dc_draw_text(dc, "ûļ", &rect);
}
rtgui_dc_end_drawing(dc);
return RT_FALSE;
}
else if (event->type == RTGUI_EVENT_KBD)
{
struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
if (ekbd->type == RTGUI_KEYDOWN)
{
switch (ekbd->key)
{
case RTGUIK_RIGHT:
if (view_mode == VIEW_DIR_MODE) picture_show_next();
else if (view_mode == VIEW_FN_LIST_MODE)
{
picture_fn_list_current ++;
if (picture_fn_list_current == picture_fn_list_size)
{
picture_fn_list_current = 0;
}
strcpy(current_fn, picture_fn_list[picture_fn_list_current]);
rtgui_widget_update(RTGUI_WIDGET(picture_view));
}
break;
case RTGUIK_LEFT:
if (view_mode == VIEW_DIR_MODE) picture_show_prev();
else if (view_mode == VIEW_FN_LIST_MODE)
{
if (picture_fn_list_current == 0)
{
picture_fn_list_current = picture_fn_list_size - 1;
}
else picture_fn_list_current --;
strcpy(current_fn, picture_fn_list[picture_fn_list_current]);
rtgui_widget_update(RTGUI_WIDGET(picture_view));
}
break;
case RTGUIK_RETURN:
{
rtgui_view_t* view;
view = RTGUI_VIEW(widget);
/* close this view */
current_fn[0] = '\0';
/* end of modal */
rtgui_view_end_modal(view, RTGUI_MODAL_OK);
picture_view = RT_NULL;
}
break;
}
}
return RT_FALSE;
}
return rtgui_view_event_handler(widget, event);
}
rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench)
{
/* create picture view */
picture_view = rtgui_view_create("Picture Presentation");
rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view),
picture_view_event_handler);
rtgui_workbench_add_view(workbench, picture_view);
/* this view can be focused */
RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* show next picture */
picture_show_next();
view_mode = VIEW_DIR_MODE;
return picture_view;
}
rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench,
const char* filename)
{
strcpy(current_fn, filename);
/* create picture view */
picture_view = rtgui_view_create("Picture Presentation");
rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view),
picture_view_event_handler);
rtgui_workbench_add_view(workbench, picture_view);
/* this view can be focused */
RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
view_mode = VIEW_SINGLE_MODE;
return picture_view;
}
rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench,
const char* list[], rt_uint8_t size)
{
picture_fn_list = list;
picture_fn_list_size = size;
picture_fn_list_current = 0;
strcpy(current_fn, picture_fn_list[picture_fn_list_current]);
/* create picture view */
picture_view = rtgui_view_create("Picture Presentation");
rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view),
picture_view_event_handler);
rtgui_workbench_add_view(workbench, picture_view);
/* this view can be focused */
RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
view_mode = VIEW_FN_LIST_MODE;
return picture_view;
}
#ifndef __PICTURE_H__
#define __PICTURE_H__
rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench);
rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, const char* fn);
rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, const char* list[], rt_uint8_t size);
#endif
......@@ -279,6 +279,8 @@ void function_play_radio(void* parameter)
{
next_step = PLAYER_STEP_STOP;
player_play_url("http://syragon.com:8000/ices");
// player_play_url("http://192.168.1.6:8000/stream");
// player_play_url("http://radio.aozima.com:8000/stream");
}
void function_filelist(void* parameter)
......@@ -381,6 +383,21 @@ void function_player(void* parameter)
return;
}
#include "picture.h"
void function_show_picure(void* parameter)
{
rtgui_view_t *view;
view = picture_view_create(workbench);
if (view != RT_NULL)
{
rtgui_view_show(view, RT_TRUE);
rtgui_view_destroy(view);
}
return;
}
void function_action(void* parameter)
{
rt_kprintf("item action!\n");
......@@ -398,6 +415,7 @@ struct list_item function_list[] =
{"选择电台", RT_NULL, function_play_radio, RT_NULL},
{"更新电台", RT_NULL, function_action, RT_NULL},
{"播放文件", RT_NULL, function_filelist, RT_NULL},
{"浏览图片", RT_NULL, function_show_picure, RT_NULL},
{"设备信息", RT_NULL, function_device, RT_NULL},
{"选项设置", RT_NULL, function_action, RT_NULL},
{"USB 联机", RT_NULL, function_cable, RT_NULL},
......
此差异已折叠。
......@@ -47,6 +47,7 @@ File 1,1,<.\ili9325\ili9320.c><ili9320.c>
File 1,1,<.\codec.c><codec.c>
File 1,1,<.\spi_flash.c><spi_flash.c>
File 1,1,<.\remote.c><remote.c>
File 1,1,<.\picture.c><picture.c>
File 2,1,<..\..\src\clock.c><clock.c>
File 2,1,<..\..\src\idle.c><idle.c>
File 2,1,<..\..\src\ipc.c><ipc.c>
......
......@@ -120,6 +120,9 @@
/* TCP sender buffer space */
#define RT_LWIP_TCP_SND_BUF 2048
/* TCP Window Size */
#define RT_LWIP_TCP_WND (1024 * 2)
/* Enable SNMP protocol */
/* #define RT_LWIP_SNMP */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册