短消息信息锁概要设计
二.体系结构设计
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