//TODO //repeat track //edit list manually #define MEMSIZE 4096 * 50 //===================================================// // // // LIB // // // //===================================================// #include "../lib/file_system.h" #include "../lib/list_box.h" #include "../lib/gui.h" #include "../lib/obj/box_lib.h" #include "../lib/obj/libio_lib.h" #include "../lib/obj/libimg_lib.h" #include "../lib/obj/libini.h" #include "../lib/patterns/libimg_load_skin.h" #include "../lib/obj/proc_lib.h" #include "../lib/patterns/simple_open_dialog.h" //===================================================// // // // DATA // // // //===================================================// //simple open dialog data char default_dir[] = "/rd/1"; od_filter filter2 = { "MP3", 0 }; #define ABOUT_MESSAGE "'Pixies Player v2.0 A tiny MP3 folder player. Controls: Open file: O key Play/Stop: Space or P key Start playing selected file: Enter Goto next/previous track: Ctrl + Left/Right Change sound volume: Left/Right key Mute: M key' -Std" #define WIN_W_SMALL 127 #define WIN_H_SMALL 39 scroll_bar scroll1 = { 5,200,398,44,0,2,115,15,0,0xeeeeee,0xBBBbbb,0xeeeeee,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}; proc_info Form; llist list; char pixie_ini_path[4096]; char work_folder[4096]; char current_filename[256]; enum { BUTTON_WINDOW_CLOSE = 1, BUTTON_WINDOW_MINIMIZE, BUTTON_WINDOW_REDUCE, BUTTON_PLAYBACK_PLAY_PAUSE = 10, BUTTON_PLAYBACK_PREV, BUTTON_PLAYBACK_NEXT, BUTTON_OPEN_DIALOG, BUTTON_SHOW_VOLUME }; int player_run_id; int notify_run_id; int current_playing_file_n=0; word win_x_normal, win_y_normal; word win_x_small, win_y_small; byte window_mode; enum { WINDOW_MODE_NORMAL, WINDOW_MODE_SMALL }; byte playback_mode; enum { PLAYBACK_MODE_STOPED, PLAYBACK_MODE_PLAYING }; //===================================================// // // // CODE // // // //===================================================// #include "get_files_list.h" #include "settings.h" void LoadLibraries() { load_dll(boxlib, #box_lib_init,0); load_dll(libio, #libio_init,1); load_dll(libimg, #libimg_init,1); load_dll(libini, #lib_init,1); load_dll(Proc_lib, #OpenDialog_init,0); OpenDialog_init stdcall (#o_dialog); } void main() { int tempstr; tempstr = abspath("pixie.ini"); strcpy(#pixie_ini_path, tempstr); list.SetFont(8, 14, 0x90); if (!param) notify("'Pixie Player\nPress O key to open MP3 file' -St"); LoadLibraries(); LoadIniConfig(); SetEventMask(0100111b); loop() { WaitEventTimeout(10); switch(EAX & 0xFF) { case evMouse: if (!CheckActiveProcess(Form.ID)) break; mouse.get(); scrollbar_v_mouse (#scroll1); if (list.first != scroll1.position) { list.first = scroll1.position; DrawPlayList(); break; } if (list.MouseOver(mouse.x, mouse.y)) { if (mouse.vert) && (list.MouseScroll(mouse.vert)) DrawPlayList(); if (mouse.dblclick) EventStartPlayingSelectedItem(); if (mouse.down) && (mouse.key&MOUSE_LEFT) && (list.ProcessMouse(mouse.x, mouse.y)) DrawPlayList(); if (mouse.down) && (mouse.key&MOUSE_RIGHT) notify(ABOUT_MESSAGE); } if(mouse.key&MOUSE_LEFT) && (mouse.y47) strcpy(#temp_filename+44, "..."); yyy = i*list.item_h+list.y; //this is selected file if (list.cur_y - list.first == i) { if (i>=list.count) continue; DrawBar(list.x, yyy, list.w, list.item_h, theme.color_list_active_bg); WriteText(12,yyy+list.text_y,list.font_type, theme.color_list_active_text, #temp_filename); } //this is not selected file else { if (i>=list.count) continue; DrawBar(list.x,yyy,list.w, list.item_h, theme.color_list_bg); WriteText(12,yyy+list.text_y,list.font_type, theme.color_list_text, #temp_filename); } //this is cur_y playing file if (i + list.first == current_playing_file_n) && (playback_mode == PLAYBACK_MODE_PLAYING) { WriteText(3, yyy+list.text_y+3,0x80, theme.color_list_active_pointer, "\x10"); WriteText(12,yyy+list.text_y,list.font_type, theme.color_list_active_text, #temp_filename); } } DrawBar(list.x,list.visible * list.item_h + list.y, list.w, -list.visible * list.item_h + list.h, theme.color_list_bg); DrawScroller(); } void draw_window() { GetProcessInfo(#Form, SelfInfo); DrawTopPanel(); IF (Form.status_window>=2) return; if (window_mode == WINDOW_MODE_NORMAL) { DrawPlayList(); DrawRectangle(0, skin.h-1, skin.w-1, list.h+1, theme.color_list_border); } } void DrawTopPanel() { char cur_y_playing_title[245]; int button_y; //if (playback_mode == PLAYBACK_MODE_STOPED) img_draw stdcall(skin.image, 13, 0, 22, skin.h, 300, 0); //Mode depended if (window_mode == WINDOW_MODE_NORMAL) { img_draw stdcall(skin.image, 0, 0, skin.w, skin.h, 0, 0); strcpy(#cur_y_playing_title, #current_filename); cur_y_playing_title[strlen(#cur_y_playing_title)-4] = '\0'; if (strlen(#cur_y_playing_title) > 36) strcpy(#cur_y_playing_title + 33, "..."); DrawPixieTitle(#work_folder + strrchr(#work_folder, '/')); WriteText(10, 26, list.font_type, theme.color_top_panel_text, #cur_y_playing_title); button_y = 45; DefineHiddenButton(Form.width - 56, button_y, 23, 23, BUTTON_OPEN_DIALOG); DefineHiddenButton(Form.width - 27, button_y, 23, 23, BUTTON_SHOW_VOLUME); } else if (window_mode == WINDOW_MODE_SMALL) { img_draw stdcall(skin.image, 0, 0, WIN_W_SMALL, WIN_H_SMALL, skin.w-1, 0); DefineHiddenButton(0, 0, WIN_W_SMALL, WIN_H_SMALL, 99 + BT_NOFRAME); button_y = 9; } if (!list.count) DrawPixieTitle("Pixie"); //Playing control buttons DefineHiddenButton(5, button_y, 23, 23, BUTTON_PLAYBACK_PREV); DefineHiddenButton(34, button_y-2, 27, 25, BUTTON_PLAYBACK_PLAY_PAUSE); DefineHiddenButton(65, button_y, 23, 23, BUTTON_PLAYBACK_NEXT); //Window control buttons DefineHiddenButton(Form.width - 18, 1, 15, 15, BUTTON_WINDOW_CLOSE); DefineHiddenButton(Form.width - 18, 16, 15, 15, BUTTON_WINDOW_REDUCE); DefineHiddenButton(Form.width - 32, 1, 15, 15, BUTTON_WINDOW_MINIMIZE); } void DrawScroller() { scroll1.max_area = list.count; scroll1.cur_area = list.visible; scroll1.position = list.first; scroll1.all_redraw = 0; scroll1.start_x = skin.w - scroll1.size_x-1; scroll1.start_y = list.y-1; scroll1.size_y = list.h+2; if (list.count > list.visible) scrollbar_v_draw(#scroll1); } void DrawPixieTitle(dword _title) { WriteTextB(10, 6, list.font_type, theme.color_top_panel_text, _title); } //===================================================// // // // EVENTS // // // //===================================================// void EventOpenFolder(dword _open_path) { if (ESBYTE[_open_path]) { strcpy(#work_folder, _open_path); work_folder[strrchr(#work_folder, '/')-1]='\0'; OpenDirectory(#work_folder); SetOpenedFileFirst(_open_path); } list.SetSizes(1, skin.h, skin.w-1, 22*15, 22); if (list.count <= list.visible) { list.h = list.count * list.item_h; list.visible = list.count; list.w -= 1; } else { list.w -= scroll1.size_x; } MoveSize(OLD, OLD, OLD, skin.h + list.h); list.KeyHome(); current_playing_file_n=0; EventStopPlayingMp3(); EventStartPlayingMp3(); } void EventStopPlayingMp3() { if (player_run_id) player_run_id = KillProcess(player_run_id); if (notify_run_id) notify_run_id = KillProcess(notify_run_id); playback_mode = PLAYBACK_MODE_STOPED; DrawTopPanel(); DrawPlayList(); } void EventStartPlayingMp3() { word i; char item_path[4096]; char notify_message[512]; EventStopPlayingMp3(); if (current_playing_file_n > list.count) { current_playing_file_n = list.count; return; } if (current_playing_file_n < 0) { current_playing_file_n = 0; return; } playback_mode = PLAYBACK_MODE_PLAYING; strlcpy(#current_filename, Getcur_yItemName(), sizeof(current_filename)); sprintf(#item_path,"\"%s/%s\"",#work_folder,#current_filename); DrawPlayList(); DrawTopPanel(); if (strcmpi(#item_path+strlen(#item_path)-4,".mp3")) player_run_id = RunProgram(abspath("minimp3"), #item_path); sprintf(#notify_message,"'Now playing:\n%s' -St",#current_filename); for (i=2; i