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 + -
显示快捷键?