fspl_panel.cc
来自「pixil 最新的嵌入linux 應用程序集,別的地方很難下載」· CC 代码 · 共 1,226 行 · 第 1/2 页
CC
1,226 行
if (strstr(namelist[idx]->d_name, ".m3u") || strstr(namelist[idx]->d_name, ".M3U")) { strcpy(name, dir); strcat(name, namelist[idx]->d_name); playList[listNum] = (char *) calloc(strlen(namelist[idx]->d_name) + strlen(dir) + 2, sizeof(char)); char list_name[255]; strcpy(list_name, namelist[idx]->d_name); strcpy(playList[listNum], dir); strcat(playList[listNum], "/"); strcat(playList[listNum], namelist[idx]->d_name); f_ext = strstr(list_name, ".m3u"); if (!f_ext) f_ext = strstr(list_name, ".M3U"); f_ext[0] = '\0'; playListMenu->add(list_name); listNum++; } free(namelist[idx]); } } free(namelist); struct dirent *dent; DIR *p_dir = opendir(dir); struct stat stat_buf; char *f_name; while ((dent = readdir(p_dir)) != NULL) { if (0 == strcmp("..", dent->d_name) || 0 == strcmp(".", dent->d_name)) continue; f_name = (char *) calloc(strlen(dir) + strlen(dent->d_name) + 2, sizeof(char)); sprintf(f_name, "%s/%s", dir, dent->d_name); stat(f_name, &stat_buf); if (S_ISDIR(stat_buf.st_mode)) get_files(f_name); if (NULL != f_name) free(f_name); } if (p_dir) closedir(p_dir);}voidfspl_panel::reload_browser(char *file){ get_files_from_list(file); free_play_list(); for (int idx = 0; idx < nodes; idx++) { musics.AddPlayList(titles[idx], paths[idx]); }}static char *get_mnt_pt(char *mount){ int idx = 0; if (mount) { while (mount[idx] != ' ') idx++; mount[idx] = '\0'; return mount; } return NULL;}voidfspl_panel::load_browser(){ get_files(defaultMusicPath); char buf[MAX_NAME_LENGTH]; FILE *fp = fopen("/proc/mounts", "r"); char *mount; if (fp) { while (fgets(buf, MAX_NAME_LENGTH, fp)) { if ((mount = strstr(buf, "/mnt/cf"))) { if ((mount = get_mnt_pt(mount))) get_files(mount); } if ((mount = strstr(buf, "/fs/hd/"))) { if ((mount = get_mnt_pt(mount))) get_files(mount); } } } if (fp) fclose(fp); free_play_list(); for (int idx = 0; idx < nodes; idx++) { musics.AddPlayList(titles[idx], paths[idx]); }}////////////////////////////////////////////////////////////////////////////////// Callback methods////////////////////////////////////////////////////////////////////////////////voidfspl_panel::menu_callback(Fl_Widget * w, void *o){ fspl_panel *p_This = (fspl_panel *) (NxApp::Instance()); NxMenuButton *m_Button = (NxMenuButton *) w; if (menuValue == m_Button->value()) return; stop_callback(stopButton, (void *) 1); usleep(200000); menuValue = m_Button->value(); m_Button->label(m_Button->text()); m_Button->hide(); m_Button->show(); //p_This->free_play_list(); p_This->clear_browser(); p_This->free_paths(); if (0 != strcmp("All", m_Button->label())) p_This->reload_browser(playList[m_Button->value() - 1]); else p_This->load_browser(); mp3Browser->select_range(mp3Browser->traverse_start(), mp3Browser->traverse_start()); if (mp3Browser->traverse_start()) selPlay = 1; else selPlay = 0;}//--------------------------------------------------------------------------------voidfspl_panel::pause_callback(Fl_Widget *, void *){ if (music_ispause()) { music_unpause(); } else { music_pause(); }}//--------------------------------------------------------------------------------voidfspl_panel::stop_callback(Fl_Widget * w, void *o){ int *val = (int *) o; fspl_panel *p_This = (fspl_panel *) (NxApp::Instance()); music_stop(); if (val) stopPressed = 1; if (playNode) { int index = musics.SearchPlayList(titles[curPlaying - 1]); if (-1 != index) { char file_name[MAX_NAME_LENGTH]; char time_label[16]; char *path = musics.GetPlayListPath(index); strcpy(file_name, path); int s = p_This->get_song_length(file_name); if (-1 != s) { int m = s / 60; s = s % 60; if (s < 10) sprintf(time_label, "%d:0%d", m, s); else sprintf(time_label, "%d:%d", m, s); } else sprintf(time_label, "--:--"); playNode->pixmap(NULL); playNode->time_label(time_label); mp3Browser->redraw(); } } curPlaying = 0; playNode = NULL; p_This->stopButton->hide(); p_This->playButton->show();}//--------------------------------------------------------------------------------voidfspl_panel::play_callback(Fl_Widget *, void *o){ if (!musics.stop) { return; } if (selPlay <= 0 || mp3Browser->selected() == NULL) return; //Fl_ToggleNode *sel_node = mp3Browser->selected(); fspl_panel *p_This = (fspl_panel *) o; char *playing = new char[MAX_NAME_LENGTH]; char *buffer = new char[MAX_NAME_LENGTH]; if (doubleClicked || curPlaying) { strcpy(playing, titles[curPlaying - 1]); } else { Fl_Toggle_Node *node = mp3Browser->traverse_start(); int idx = 1; while (node) { if (idx == selPlay) { playNode = (Mp3_Node *) node; playNode->pixmap(musicNote); mp3Browser->select_range(playNode, playNode); break; } node = mp3Browser->traverse_forward(); idx++; } strcpy(playing, titles[selPlay - 1]); if (!node) { delete[]playing; delete[]buffer; buffer = playing = 0; return; } curPlaying = idx; strcpy(playing, titles[selPlay - 1]); } p_This->StripFormatCodes(playing); strncpy(buffer, "@C4@s@.", MAX_NAME_LENGTH - 1); strcat(buffer, playing); SetPlayList(playing); music_play(); stopPressed = 0; doubleClicked = 0; delete[]playing; playing = 0; delete[]buffer; buffer = 0; p_This->playButton->hide(); p_This->stopButton->show();}//--------------------------------------------------------------------------------voidfspl_panel::back_callback(Fl_Widget *, void *){ if (curPlaying) { int play_me = curPlaying; stop_callback(stopButton, 0); usleep(200000); if (play_me == 1) { curPlaying = nodes; Fl_Toggle_Node *node = mp3Browser->traverse_start(); int idx = 1; while (node) { if (idx == nodes) break; node = mp3Browser->traverse_forward(); idx++; } playNode = (Mp3_Node *) (node); } else { int idx = 1; Fl_Toggle_Node *node; curPlaying = --play_me; node = mp3Browser->traverse_start(); while (node) { if (play_me == idx) { playNode = (Mp3_Node *) node; break; } idx++; node = mp3Browser->traverse_forward(); } } selPlay = curPlaying; mp3Browser->select_range(playNode, playNode); playNode->pixmap(musicNote); play_callback(); } else { Fl_Toggle_Node *node = mp3Browser->traverse_start(); if (selPlay == 1) { int idx = 1; while (node) { if (idx == nodes) break; node = mp3Browser->traverse_forward(); idx++; } selPlay = nodes; mp3Browser->select_range(node, node); } else { int idx = 1; selPlay--; while (node) { if (idx == selPlay) { mp3Browser->select_range(node, node); break; } node = mp3Browser->traverse_forward(); idx++; } } } mp3Browser->redraw();}//--------------------------------------------------------------------------------voidfspl_panel::forward_callback(Fl_Widget * w, void *o){ if (curPlaying) { int play_me = curPlaying; stop_callback(stopButton, 0); usleep(200000); if (play_me == nodes) { curPlaying = 1; playNode = (Mp3_Node *) (mp3Browser->traverse_start()); } else { int idx = 1; Fl_Toggle_Node *node; curPlaying = ++play_me; node = mp3Browser->traverse_start(); while (node) { if (play_me == idx) { playNode = (Mp3_Node *) node; break; } idx++; node = mp3Browser->traverse_forward(); } } selPlay = curPlaying; mp3Browser->select_range(playNode, playNode); playNode->pixmap(musicNote); play_callback(); } else { Fl_Toggle_Node *node = mp3Browser->traverse_start(); if (selPlay == nodes) { selPlay = 1; mp3Browser->select_range(node, node); } else { int idx = 1; selPlay++; while (node) { if (idx == selPlay) { mp3Browser->select_range(node, node); break; } node = mp3Browser->traverse_forward(); idx++; } } } mp3Browser->redraw();}//--------------------------------------------------------------------------------voidfspl_panel::volume_callback(Fl_Widget * o, void *){ // FIXME need to get value off of a valuator int volume = (int) ((NxSlider *) o)->value(); int handle; int r; handle = open("/dev/mixer", O_RDWR); if (volume > 100) volume = 100; if (volume >= 0) { r = (volume << 8) | volume; ioctl(handle, MIXER_WRITE(SOUND_MIXER_VOLUME), &r); } ioctl(handle, MIXER_READ(SOUND_MIXER_VOLUME), &r); close(handle);}//--------------------------------------------------------------------------------voidfspl_panel::sspectra_callback(Fl_Widget * o, void *){}//--------------------------------------------------------------------------------voidfspl_panel::progress_callback(Fl_Widget * o, void *){}//--------------------------------------------------------------------------------voidfspl_panel::timer_callback(void *){ Fl::add_timeout(0.25, timer_callback); char time_label[10]; if (1 == musics.updatestats) { musics.updatestats = 0; } if (!musics.stop && curPlaying) { int s = musics.currentframe * musics.pcmperframe / musics.freq; int ms = musics.maxframe * musics.pcmperframe / musics.freq; s = ms - s; int m = s / 60; s = s % 60; if (s < 10) sprintf(time_label, "%d:0%d", m, s); else sprintf(time_label, "%d:%d", m, s); if (playNode) playNode->time_label(time_label); mp3Browser->redraw(); } else if (musics.stop && curPlaying) { forward_callback(); } else { if (curPlaying) { stop_callback(stopButton, (void *) 0); } }}//--------------------------------------------------------------------------------voidfspl_panel::normal_callback(Fl_Widget *, void *){ SetDsp(0);}//--------------------------------------------------------------------------------voidfspl_panel::add_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::fileok_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::filecan_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::addall_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::del_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::delall_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::hideshowpl_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::browser_callback(Fl_Widget *, void *){ Fl_Toggle_Node *sel_node = mp3Browser->selected(); Fl_Toggle_Node *node = mp3Browser->traverse_start(); int idx = 1; if (Fl::event_clicks()) { stop_callback(stopButton, (void *) 0); usleep(200000); doubleClicked = 1; while (node) { if (node == sel_node) { playNode = (Mp3_Node *) node; curPlaying = idx; selPlay = idx; } node->pixmap(NULL); node = mp3Browser->traverse_forward(); idx++; } if (sel_node) { sel_node->pixmap(musicNote); } play_callback(); } else { doubleClicked = 0; while (node) { if (node == sel_node) { selPlay = idx; break; } node = mp3Browser->traverse_forward(); idx++; } }}//--------------------------------------------------------------------------------voidfspl_panel::http_callback(Fl_Widget *, void *){}//--------------------------------------------------------------------------------voidfspl_panel::StripFormatCodes(char *title){ char *buffer = new char[MAX_NAME_LENGTH]; for (int i = 0; i < MAX_NAME_LENGTH; i++) { if (title[i] == '@') { if (title[i + 1] == '.') { int k = 0; for (int j = i + 2; j < MAX_NAME_LENGTH + 2; j++, k++) { buffer[k] = title[j]; } strcpy(title, buffer); break; } } } delete[]buffer; buffer = 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?