[MTK]音乐播放器加强功能概要设计 下载本文

短消息信息锁概要设计

二.体系结构设计

2.1系统概述

本功能主要是为用户提供更强大,更加多样化的音乐播放器相关操作.因为存在多个播放列表,所以对播放列表的初始化,修改,删除等一般操作相对频繁,多个播放列表之间的切换工作也相当频繁,比如用户正在浏览的列表和正在播放的列表之间进行切换,进行列表的各项操作经常会用到比较排序等算法.为了不影响系统速度,不占用过多的SRAM空间,同时满足用户一般的需要,我们将系统最大可索引的歌曲数目由原来的1024首减少为512首.

2.2系统上下文定义

该功能相关实现都是基于MTK目前的音乐播放器功能代码实现.

2.3设计约束

1. 为了保证系统的运行速度,我们将相关的播放列表存储在系统FAT空间中,而不是默认的T卡目录,所以要求手机软件预留足够的FAT空间.极限情况下, 该功能有可能用到800K的FAT空间.即Music Library满载512首歌曲.用户新建3个播放列表,每个播放列表满载,为512首歌曲.同时,最近添加列表也为512首歌曲.同时,512首歌曲有512个不同的艺术家和专辑名.

2. 为了保证功能的正常工作以及运行速度,我们禁止了系统自动更新列表的功能.比如,系统是通过索引来找到每个艺术家下面包含哪一些歌曲.如果系统不经意间reload了播放列表,有可能导致这个索引失效.当用户删除了某个音乐文件后,可以通过菜单来更新音乐库.

3. 系统更新音乐库的时候,只能从固定的音乐文件夹(如 Music 或者 My Music 等客户要求存放音乐的文件夹)来索引文件路径.不支持用户手动添加.(参考OPPO音乐手机.)如果允许用户手动添加,同样会导致2所描述的问题.

4. 为了节省空间,最多要求用户可以自定义3个播放列表.

2.4设计策略

MTK自带音乐播放器功能仅可对一个播放列表进行相关操作.解决多个播放列表切换的问题,以及播放列表的自动生成问题,从而实现各种应用.基于该功能,也可以扩展出更多的其它应用.

Page 5 of 22

短消息信息锁概要设计

2.5系统总体结构

2.6子系统N的结构与功能 2.7全局变量定义

因为设计到多个播放列表的操作,所以定义了一定的全局变量,变量定义以及功能描述如下:

每个播放列表的列表名以及路径定义.

#define MUSIC_PLAYER_EXT_LIST_FOLDER L\#define MUSIC_PLAYER_EXT_ALL_LIST_NAME L\

#define MUSIC_PLAYER_EXT_MOSTLY_PLAY_LIST_NAME L\ #define MUSIC_PLAYER_EXT_RECENTLY_PLAY_LIST_NAME L\#define MUSIC_PLAYER_EXT_RECENTLY_ADD_LIST_NAME L\#define MUSIC_PLAYER_EXT_USER_ADD_LIST1_NAME L\#define MUSIC_PLAYER_EXT_USER_ADD_LIST2_NAME L\#define MUSIC_PLAYER_EXT_USER_ADD_LIST3_NAME L\#define MUSIC_PLAYER_EXT_ARTIST_LIST_NAME L\#define MUSIC_PLAYER_EXT_ALBUM_LIST_NAME L\#define MUSIC_PLAYER_EXT_CONFIG_LIST_NAME L\

#define MUSIC_PLAYER_EXT_USER_TEMP_LIST_NAME L\#define MUSIC_PLAYER_EXT_USER_LIST_NUM 3

#define MUSIC_PLAYER_EXT_MOSTLY_PLAY_LIST_NUM 10 #define MUSIC_PLAYER_EXT_RECENTLY_PLAY_LIST_NUM 10

每个播放列表的类型定义

typedef enum {

ALL_LIST = 0, /* 音乐库 */

MOSTLY_PLAY_LIST, /* 最常播放列表 */ RECENTLY_PLAY_LIST, /* 最近播放列表 */ RECENTLY_ADD_LIST, /* 最近添加列表 */ USER_LIST1, /* 用户自定义列表1 */ USER_LIST2, /* 用户自定义列表2 */ USER_LIST3, /* 用户自定义列表3 */ ARTIST_DETAIL_LIST, /* 音乐家列表 */ ALBUM_DETAIL_LIST /* 专辑列表 */

Page 6 of 22

短消息信息锁概要设计

}MUSIC_PLAYER_EXT_LIST_ENUM;

用户当前正在浏览的列表

typedef enum {

MENU_ADD_LIST = 0,

MENU_SHOW_MOSTLY_PLAY_lIST, MENU_SHOW_RECENTLY_PLAY_lIST, MENU_SHOW_RECENTLY_ADD_LIST,

MENU_USER_LIST_BEGIN = MENU_SHOW_RECENTLY_ADD_LIST, MENU_USER_LIST1, MENU_USER_LIST2, MENU_USER_LIST3, MENU_TOTAL_NUM

}MUSIC_PLAYER_EXT_MY_LIST_MENU_ENUM;

用于保存艺术家的结构体

typedef struct {

UI_character_type ArtistName[FMGR_MAX_FILE_LEN + 1]; /* 艺术家名称 */

S16 file_index[MAX_PLAY_LIST_NUM]; /* 属于该艺术家的歌曲索引号 */

}MUSIC_PLAYER_EXT_ARTIST_INFO;

用于保存专辑的结构体

typedef struct {

UI_character_type AlbumName[FMGR_MAX_FILE_LEN + 1]; /* 专辑名称 */

S16 file_index[MAX_PLAY_LIST_NUM]; /* 属于该专辑的歌曲索引号 */

}MUSIC_PLAYER_EXT_ALBUM_INFO;

UI_character_type

music_player_ext_mostly_play_list[MUSIC_PLAYER_EXT_MOSTLY_PLAY_LIST_NUM][FMGR_MAX_PATH_LEN + 1]; /* 用于保存10个最常播放列表 */

S32 g_playCount[MUSIC_PLAYER_EXT_MOSTLY_PLAY_LIST_NUM]; UI_character_type

music_player_ext_recently_play_list[MUSIC_PLAYER_EXT_RECENTLY_PLAY_LIST_NUM][FMGR_MAX_PATH_LEN + 1]; /* 用于保存10个最近播放列表 */

U8 g_Record_State[MAX_PLAY_LIST_NUM]; /* 用于记录每个歌曲的播放次数 */

用户自定义列表的一些信息.需要保存到文件中.

typedef struct

Page 7 of 22

短消息信息锁概要设计 {

S8 totalListNum; /* 用户添加的列表数目 */

S8 curOperIdx; /* 当前用户正在操作的列表索引 */

S8 curOperate; // 1 - rename; 0 – add /* 当前用户操作:增加还是重命名 */ S8 listState[MUSIC_PLAYER_EXT_USER_LIST_NUM]; /* 每个列表状态 */

S8 listName[MUSIC_PLAYER_EXT_USER_LIST_NUM][(FMGR_MAX_FILE_LEN + 1) * ENCODING_LENGTH]; /* 列表名称, 便于用户修改 */

S8 tempListName[(FMGR_MAX_FILE_LEN + 1) * ENCODING_LENGTH]; /* temp */ }MUSIC_PLAYER_EXT_USER_LIST_INFO;

// Just for temp List show.

用于生成临时列表用的结构体变量,比如每个专辑/艺术家下的音乐列表,为临时列表.

typedef struct { U8

list_buffer[PLAY_LIST_BUFF_SIZE][(FMGR_MAX_FILE_LEN

+

1)

*

ENCODING_LENGTH]; /* 一次loading 8/16 个列表到buffer中,显示. */

S32 list_buffer_head; /* 第一个buffer中保存的音乐索引 */ S32 list_buffer_num; /* buffer 中总共的音乐数目 */ S32 list_total_num; /* 该列表的音乐数目 */ S32 list_index; /* 当前高亮的音乐 */ BOOL list_changed; /* Reserve */

}MUSIC_PLAYER_EXT_TEMP_LIST_STRUCT;

全局的用于对多个列表进行操作

typedef struct {

U8 present_list_location; /* 播放列表保存的位置 */

U8 present_music_location; /* 当前音乐文件所在的盘符 */

/* 以下分别用于保存每个播放列表的路径*/

U8 music_library_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH];

U8 mostly_play_list_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH];

U8 recently_play_list_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH]; U8 recently_add_list_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH];

U8 user_add_list_path[MUSIC_PLAYER_EXT_USER_LIST_NUM][(FMGR_MAX_PATH_LEN +

1) * ENCODING_LENGTH];

U8 artist_list_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH]; U8 album_list_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH]; U8 config_file_path[(FMGR_MAX_PATH_LEN + 1) * ENCODING_LENGTH];

/* 用于保存音乐家的buffer */

U8

artist_buffer[PLAY_LIST_BUFF_SIZE][(FMGR_MAX_FILE_LEN

+

1)

*

ENCODING_LENGTH];

Page 8 of 22