222 lines
7.0 KiB
C
222 lines
7.0 KiB
C
#include "mywin_music.h"
|
|
#include "mp3play.h"
|
|
#include "mywin_inc.h"
|
|
#include "system_updata.h"
|
|
|
|
#define WIN_MUSIC_TYPE "WIN_MusicStruct"
|
|
|
|
WIN_MusicStruct *WIN_CreatMusic(WIN_WindowStruct *base,
|
|
void (*msgLoop)(struct _WIN_WindowStruct *win,
|
|
WIN_MsgStruct *msg),
|
|
int x, int y, int x_size, int y_size) {
|
|
// 重设消息循环
|
|
if (msgLoop == 0) {
|
|
msgLoop = (void (*)(struct _WIN_WindowStruct *win,
|
|
WIN_MsgStruct *msg))MUSIC_defaultMsgLoop;
|
|
}
|
|
|
|
WIN_MusicStruct *ret = mymalloc(sizeof(WIN_MusicStruct));
|
|
// 调用父类的构造函数
|
|
if (ret) {
|
|
mymemset(ret, 0, sizeof(WIN_MusicStruct));
|
|
// if (0==WIN_CreatWindowExt((WIN_WindowStruct
|
|
//*)ret,base,msgLoop,x,y,x_size,y_size))
|
|
if (0 == WIN_CreatTouchEx((WIN_TouchWinStruct *)ret, base, msgLoop, x, y,
|
|
x_size, y_size)) {
|
|
// 创建失败
|
|
myfree(ret);
|
|
ret = 0;
|
|
} else {
|
|
((WIN_WindowStruct *)ret)->winType = WIN_MUSIC_TYPE;
|
|
((WIN_WindowStruct *)ret)->intercept = 1;
|
|
((WIN_WindowStruct *)ret)->deleteWindow =
|
|
(void (*)(struct _WIN_WindowStruct *win))WIN_DeleteMusic;
|
|
ret->timerId = WIN_CreatTimer((WIN_WindowStruct *)ret, 1000);
|
|
// 构造一个消息框
|
|
ret->title = "音乐播放器";
|
|
ret->rectColor = 0x221f18;
|
|
ret->txtColor = 0xff00ff;
|
|
ret->selectRectColor = 0x342f2a;
|
|
ret->selectTxtColor = 0xc2ae9b;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void WIN_DeleteMusic(WIN_MusicStruct *music) {
|
|
if (music->done == 0) {
|
|
mp3_stop();
|
|
while (1) {
|
|
if (WIN_GetExWorkFunStat(music->work))
|
|
break;
|
|
WIN_Delay_ms(100);
|
|
}
|
|
WIN_ExWorkFunClear(music->work);
|
|
music->done = 1;
|
|
}
|
|
|
|
if (music->mp3Data.data)
|
|
myfree(music->mp3Data.data);
|
|
|
|
// 调用父类的销毁函数
|
|
WIN_DeleteWindow((WIN_WindowStruct *)music);
|
|
}
|
|
|
|
// 消息框的绘制函数
|
|
void MUSIC_DefaultPaint(WIN_MusicStruct *music) {
|
|
int x = 0;
|
|
int y = 0;
|
|
int x_size = ((WIN_WindowStruct *)music)->x_size;
|
|
int y_size = ((WIN_WindowStruct *)music)->y_size;
|
|
char *txt_buff = mymalloc(128);
|
|
|
|
WIN_PaintBackGround((WIN_WindowStruct *)music);
|
|
|
|
// 显示标题
|
|
int img_x = x + 25;
|
|
int img_y = y;
|
|
int img_xsize = 0;
|
|
int img_ysize = 0;
|
|
int head_ysize = 45;
|
|
WIN_SetLcdColor(music->txtColor);
|
|
if (music->icon) {
|
|
WIN_GetImageSize(music->icon, &img_xsize, &img_ysize);
|
|
if (img_ysize > head_ysize)
|
|
img_ysize = head_ysize;
|
|
WIN_DrawImagByAlpha(img_x, img_y + head_ysize / 2 - img_ysize / 2,
|
|
img_xsize, img_ysize, music->icon, WIN_GetLcdColor16());
|
|
img_xsize += 10;
|
|
}
|
|
WIN_SetLcdColor(~music->txtColor);
|
|
WIN_DrawTxtAt(music->title, img_x + img_xsize + 1,
|
|
y + head_ysize / 2 - WIN_GetFontHight() / 2);
|
|
WIN_DrawTxtAt(music->title, img_x + img_xsize - 1,
|
|
y + head_ysize / 2 - WIN_GetFontHight() / 2);
|
|
WIN_DrawTxtAt(music->title, img_x + img_xsize,
|
|
y + head_ysize / 2 - WIN_GetFontHight() / 2 + 1);
|
|
WIN_DrawTxtAt(music->title, img_x + img_xsize,
|
|
y + head_ysize / 2 - WIN_GetFontHight() / 2 - 1);
|
|
WIN_SetLcdColor(music->txtColor);
|
|
WIN_DrawTxtAt(music->title, img_x + img_xsize,
|
|
y + head_ysize / 2 - WIN_GetFontHight() / 2);
|
|
|
|
sprintf(txt_buff, "文件:%s", music->mp3_file_name);
|
|
WIN_DrawTxtAt(txt_buff, img_x + img_xsize,
|
|
y_size * 2 / 6 - WIN_GetFontHight() / 2);
|
|
|
|
sprintf(txt_buff, "歌曲:%s", music->mp3_title);
|
|
WIN_DrawTxtAt(txt_buff, img_x + img_xsize,
|
|
y_size * 3 / 6 - WIN_GetFontHight() / 2);
|
|
|
|
sprintf(txt_buff, "艺术家:%s", music->mp3_artist);
|
|
WIN_DrawTxtAt(txt_buff, img_x + img_xsize,
|
|
y_size * 4 / 6 - WIN_GetFontHight() / 2);
|
|
|
|
int cursec = music->cursec;
|
|
int totsec = music->totsec;
|
|
sprintf(txt_buff, "%02d:%02d/%02d:%02d", cursec / 60, cursec % 60,
|
|
totsec / 60, totsec % 60);
|
|
WIN_DrawTxtAt(txt_buff, img_x + img_xsize,
|
|
y_size * 5 / 6 - WIN_GetFontHight() / 2);
|
|
|
|
int line_xsize = x_size - (img_x + img_xsize) * 2;
|
|
WIN_DrawRect(img_x + img_xsize, y_size - 30, line_xsize, 10);
|
|
WIN_FillRectByColor(img_x + img_xsize + 1, y_size - 30 + 1,
|
|
line_xsize * music->cursec / music->totsec, 10 - 2);
|
|
|
|
myfree(txt_buff);
|
|
}
|
|
|
|
// 消息框的消息处理函数
|
|
void MUSIC_defaultMsgLoop(WIN_MusicStruct *music, WIN_MsgStruct *msg) {
|
|
WIN_KeyStruct *k = 0;
|
|
WIN_MoveStruct *m = 0;
|
|
switch (msg->msg) {
|
|
case WIN_MSG_PAINT:
|
|
MUSIC_DefaultPaint(music);
|
|
break;
|
|
case WIN_MSG_TIMER:
|
|
if (music->done == 0) {
|
|
if (WIN_GetExWorkFunStat(music->work)) {
|
|
// 工作已经完成,
|
|
WIN_ExWorkFunClear(music->work);
|
|
WIN_DeleteTimer(music->timerId);
|
|
music->timerId = 0;
|
|
music->done = 1;
|
|
((WIN_WindowStruct *)music)->deleteWindow((WIN_WindowStruct *)music);
|
|
} else {
|
|
music->cursec = mp3_getAudiodev()->cursec;
|
|
music->totsec = mp3_getAudiodev()->totsec;
|
|
if ((music->mp3_title[0] == 0) && mp3_getMp3Info()->title[0]) {
|
|
mymemcpy(music->mp3_title, mp3_getMp3Info()->title,
|
|
strlen((char *)mp3_getMp3Info()->title) + 1);
|
|
}
|
|
if ((music->mp3_artist[0] == 0) && mp3_getMp3Info()->artist[0]) {
|
|
mymemcpy(music->mp3_artist, mp3_getMp3Info()->artist,
|
|
strlen((char *)mp3_getMp3Info()->artist) + 1);
|
|
}
|
|
}
|
|
WIN_SetInvalidWhenTop((WIN_WindowStruct *)music);
|
|
}
|
|
break;
|
|
case WIN_MSG_MOVE:
|
|
m = msg->data.p;
|
|
switch (m->moveType) {
|
|
case MOVE_DATA_LONG:
|
|
((WIN_WindowStruct *)music)->deleteWindow((WIN_WindowStruct *)music);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case WIN_MSG_KEY:
|
|
k = msg->data.p;
|
|
if (k->shortPress & KEY_VALUE_UP) // 短按
|
|
{
|
|
mp3_play();
|
|
} else if (k->shortPress & KEY_VALUE_DOWN) {
|
|
mp3_suspend();
|
|
} else if (k->shortPress & KEY_VALUE_HOME) {
|
|
((WIN_WindowStruct *)music)->deleteWindow((WIN_WindowStruct *)music);
|
|
}
|
|
if (k->shortPress) {
|
|
WIN_SetInvalid((WIN_WindowStruct *)music);
|
|
}
|
|
break; // case WIN_MSG_KEY:
|
|
default:
|
|
WIN_DefaultMsgLoop((WIN_WindowStruct *)music, msg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static int g_work(void *ptr) {
|
|
DataInfo_Struct *dat = ptr;
|
|
return mp3_play_song(dat->data, dat->dataSize);
|
|
}
|
|
|
|
WIN_MusicStruct *MUSIC_PlaySong(WIN_WindowStruct *base, char *name) {
|
|
uint32_t size = 0;
|
|
uint8_t *data = SysFile_GetFileByName(name, &size);
|
|
if (data == 0)
|
|
return 0;
|
|
|
|
WIN_MusicStruct *ret = 0;
|
|
if (base) {
|
|
ret = WIN_CreatMusic(base, 0, 0, 0, base->x_size, base->y_size);
|
|
} else {
|
|
ret = WIN_CreatMusic(0, 0, 0, 0, WIN_GetBaseWindow()->x_size, 50);
|
|
}
|
|
ret->mp3Data.data = data;
|
|
ret->mp3Data.dataSize = size;
|
|
mymemcpy(ret->mp3_file_name, name, strlen(name) + 1);
|
|
|
|
// 创建工作线程
|
|
ret->work = WIN_CreatThreadPro((int (*)(void *))g_work, &ret->mp3Data,
|
|
&ret->work_ret, 17);
|
|
|
|
WIN_SetBackPicPath((WIN_WindowStruct *)ret, base->pic_path);
|
|
WIN_ShowWindow((WIN_WindowStruct *)ret);
|
|
return ret;
|
|
}
|