⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playlist.cpp

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    }	RefreshList();}void wxPlaylist::OnSelDown(wxCommandEvent &WXUNUSED(event)) {	s32 i;	if (!m_FileList->GetSelectedItemCount()) return;	long item = -1;	for (;;) {		item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);		if (item == -1) break;	}	if ((u32) item + 1 == gf_list_count(m_entries)) return;		item = -1;	for (;;) {        item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);		if (item == -1) break;		PLEntry *ple = (PLEntry *) m_FileList->GetItemData(item);		i = gf_list_del_item(m_entries, ple);		assert(i>=1);		gf_list_insert(m_entries, ple, i+1);		ple->m_bIsSelected = 1;    }	RefreshList();}void wxPlaylist::OnSave(wxCommandEvent & WXUNUSED(event)) {	Bool save_m3u;	char szPath[GF_MAX_PATH];	if (!gf_list_count(m_entries)) return;	wxFileDialog dlg(this, wxT("Select file(s)"), wxT(""), wxT(""), wxT("M3U Playlists|*.m3u|ShoutCast Playlists|*.pls|"), wxSAVE | wxCHANGE_DIR | wxOVERWRITE_PROMPT);	if (dlg.ShowModal() != wxID_OK) return;	strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));	strlwr(szPath);	save_m3u = (dlg.GetFilterIndex()==0) ? 1 : 0;	if (save_m3u) {		if (!strstr(szPath, ".m3u")) {			strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));			strcat(szPath, ".m3u");		} else {			strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));		}	} else {		if (!strstr(szPath, ".pls")) {			strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));			strcat(szPath, ".pls");		} else {			strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));		}	}	Save(szPath, save_m3u);}void wxPlaylist::Save(char *szPath, Bool save_m3u){	FILE *out = fopen(szPath, "wt");	if (!save_m3u) 		fprintf(out, "[playlist]\nNumberOfEntries=%d\n", gf_list_count(m_entries));	for (u32 i=0; i<gf_list_count(m_entries); i++) {		PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);		if (save_m3u) {			fprintf(out, "%s\n", ple->m_url);		} else {			fprintf(out, "File%d=%s\n", i+1, ple->m_url);			fprintf(out, "Title%d=%s\n", i+1, ple->m_disp_name);			if (ple->m_duration) fprintf(out, "Length%d=%d\n", i+1, ple->m_duration);			else fprintf(out, "Length%d=-1\n", i+1);		}	}	if (!save_m3u) fprintf(out, "Version=2\n");	fprintf(out, "\n");	fclose(out);}void wxPlaylist::OnOpen(wxCommandEvent & WXUNUSED(event)) {	wxFileDialog dlg(this, wxT("Select file(s)"), wxT(""), wxT(""), wxT("M3U & PLS Playlists|*.m3u;*.pls|M3U Playlists|*.m3u|ShoutCast Playlists|*.pls|"), wxOPEN | wxCHANGE_DIR/* | wxHIDE_READONLY*/);	if (dlg.ShowModal() != wxID_OK) return;	Clear();	OpenPlaylist(dlg.GetPath());	m_cur_entry = 0;	Play();}void wxPlaylist::OpenPlaylist(wxString filename){	FILE *pl;	PLEntry *ple;	Bool load_m3u, go;	char szLine[GF_MAX_PATH];	pl = fopen(filename.mb_str(wxConvUTF8) , "rt");	if (!pl) return;	ple = NULL;	load_m3u = 1;	while (!feof(pl)) {		fgets(szLine, GF_MAX_PATH, pl);		go = 1;		while (go) {			switch (szLine[strlen(szLine)-1]) {			case '\n':			case '\r':			case ' ':				szLine[strlen(szLine)-1] = 0;				break;			default:				go = 0;				break;			}		}		if (!strlen(szLine)) continue;		if (!stricmp(szLine, "[playlist]")) {			load_m3u = 0;		} else if (load_m3u) {			ple = new PLEntry(wxString(szLine, wxConvUTF8) );			gf_list_add(m_entries, ple);		} else if (!strnicmp(szLine, "file", 4)) {			char *st = strchr(szLine, '=');			if (!st) ple = NULL;			else {				ple = new PLEntry(wxString(st + 1, wxConvUTF8) );				gf_list_add(m_entries, ple);			}		} else if (ple && !strnicmp(szLine, "Length", 6)) {			char *st = strchr(szLine, '=');			s32 d = atoi(st + 1);			if (d>0) ple->m_duration = d;		} else if (ple && !strnicmp(szLine, "Title", 5)) {			char *st = strchr(szLine, '=');			free(ple->m_disp_name);			ple->m_disp_name = strdup(st + 6);		}	}	fclose(pl);	m_all_dead_entries = -1;	m_cur_entry = -1;	RefreshList();}void wxPlaylist::OnRightClick(wxListEvent & event) {	if (!m_FileList->GetItemCount()) return;	wxMenu *popup = new wxMenu();		if (m_FileList->GetSelectedItemCount()==1) {		popup->Append(ID_PL_PLAY, wxT("Play"));		popup->AppendSeparator();	}	popup->Append(ID_PL_SEL_REV, wxT("Inverse Selection"));	if (m_FileList->GetSelectedItemCount()) popup->Append(ID_PL_REM_FILE, wxT("Remove File(s)"));	if (m_FileList->GetItemCount()>1) {		popup->AppendSeparator();		popup->Append(ID_PL_SORT_TITLE, wxT("Sort By Title"));		popup->Append(ID_PL_SORT_FILE, wxT("Sort By File Name"));		popup->Append(ID_PL_SORT_DUR, wxT("Sort By Duration"));		popup->AppendSeparator();		popup->Append(ID_PL_REVERSE, wxT("Reverse List"));		popup->Append(ID_PL_RANDOMIZE, wxT("Randomize"));	}		PopupMenu(popup, event.GetPoint());	delete popup;}void wxPlaylist::OnReverseSelection(wxCommandEvent &WXUNUSED(event) ) {	u32 i;	long item = -1;	for (;;) {		item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);		if (item == -1) break;		PLEntry *ple = (PLEntry *) m_FileList->GetItemData(item);		ple->m_bIsSelected = 1;	}	for (i=0; i<gf_list_count(m_entries); i++) {		PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);		ple->m_bIsSelected = !ple->m_bIsSelected;	}	RefreshList();}void wxPlaylist::OnReverseList(wxCommandEvent &WXUNUSED(event) ){	u32 count = gf_list_count(m_entries);	u32 hcount = count / 2;	count--;	for (u32 i=0; i<hcount; i++) {		PLEntry *ple1 = (PLEntry *) gf_list_get(m_entries, i);		PLEntry *ple2 = (PLEntry *) gf_list_get(m_entries, count-i);		gf_list_rem(m_entries, i);		gf_list_insert(m_entries, ple2, i);		gf_list_rem(m_entries, count-i);		gf_list_insert(m_entries, ple1, count-i);	}	RefreshList();}void wxPlaylist::OnRandomize(wxCommandEvent &WXUNUSED(event) ){	GF_List *new_entries = gf_list_new();	gf_rand_init(0);	while (gf_list_count(m_entries)>1) {		u32 pos = gf_rand() % (gf_list_count(m_entries)-1);		PLEntry *ple = (PLEntry *)gf_list_get(m_entries, pos);		gf_list_rem(m_entries, pos);		gf_list_add(new_entries, ple);	}	PLEntry *ple = (PLEntry *)gf_list_get(m_entries, 0);	gf_list_rem(m_entries, 0);	gf_list_add(new_entries, ple);	gf_list_del(m_entries);	m_entries = new_entries;	m_cur_entry = -1;	RefreshList();}void wxPlaylist::Sort(u32 type){	u32 i, j, smallest;	for (i=0; i<gf_list_count(m_entries)-1; i++) {		smallest = i;		for (j=i+1; j<gf_list_count(m_entries); j++) {			PLEntry *ple2 = (PLEntry *) gf_list_get(m_entries, smallest);			PLEntry *ple1 = (PLEntry *) gf_list_get(m_entries, j);			s32 test = 0;			switch (type) {			case 0:                test = stricmp(ple1->m_url, ple2->m_url);				break;			case 1:                test = stricmp(ple1->m_disp_name, ple2->m_disp_name);				break;			case 2:                test = ple1->m_duration - ple2->m_duration;				break;			}			if (test<0) smallest = j;		}		PLEntry *ple = (PLEntry *)gf_list_get(m_entries, smallest);		gf_list_rem(m_entries, smallest);		gf_list_insert(m_entries, ple, i);	}	m_cur_entry = -1;	RefreshList();}void wxPlaylist::OnSortFile(wxCommandEvent &WXUNUSED(event) ) { Sort(0); }void wxPlaylist::OnSortTitle(wxCommandEvent &WXUNUSED(event) ) { Sort(1); }void wxPlaylist::OnSortDuration(wxCommandEvent &WXUNUSED(event) ) { Sort(2); }void wxPlaylist::RefreshCurrent(){	PLEntry *ple;	if (m_cur_entry<0) return;	ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);	if (ple && ple->m_bIsPlaying) {		ple->m_bIsPlaying = 0;		UpdateEntry(m_cur_entry);	}}Bool wxPlaylist::HasValidEntries(){	u32 nb_dead = 0;	if (m_all_dead_entries==-1) {		for (u32 i=0; i<gf_list_count(m_entries); i++) {			PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);			ple->m_bIsPlaying = 0;			if (ple->m_bIsDead) nb_dead ++;		}		m_all_dead_entries = (nb_dead==gf_list_count(m_entries)) ? 1 : 0;	}	return !m_all_dead_entries;}void wxPlaylist::Play(){	PLEntry *ple;	if (!HasValidEntries()) return;	RefreshCurrent();	if (m_cur_entry >= (s32)gf_list_count(m_entries)) {		if (!m_pApp->m_loop) return;		m_cur_entry = 0;	}	ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);	if (!ple || ple->m_bIsDead) {		m_cur_entry++;		Play();	} else {		char szPLE[20];		ple->m_bIsPlaying = 1;		UpdateEntry(m_cur_entry);		sprintf(szPLE, "%d", m_cur_entry);		gf_cfg_set_key(m_pApp->m_user.config, "General", "PLEntry", szPLE);		m_pApp->DoConnect();	}}void wxPlaylist::OnItemActivate(wxListEvent &WXUNUSED(event) ) {	long item = m_FileList->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);	if (item==-1) return;	RefreshCurrent();	m_cur_entry = item;	Play();}void wxPlaylist::OnPlay(wxCommandEvent &WXUNUSED(event)){	long item = m_FileList->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);	if (item==-1) return;	RefreshCurrent();	m_cur_entry = item;	Play();}void wxPlaylist::Truncate(){	if (m_cur_entry<0) return;	while ((u32) m_cur_entry+1 < gf_list_count(m_entries)) {		PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry+1);		gf_list_rem(m_entries, m_cur_entry+1);		delete ple;	}	RefreshList();}void wxPlaylist::QueueURL(wxString filename){	char *ext = strrchr(filename.mb_str(wxConvUTF8), '.');	if (ext && (!stricmp(ext, ".m3u") || !stricmp(ext, ".pls")) ) {		OpenPlaylist(filename);	} else {		PLEntry *ple = new PLEntry(filename);		gf_list_add(m_entries, ple);	}}void wxPlaylist::PlayNext(){	RefreshCurrent();	if (1+m_cur_entry < (s32)gf_list_count(m_entries)) {		m_cur_entry++;		Play();	}}void wxPlaylist::PlayPrev(){	RefreshCurrent();	if (m_cur_entry>0) {		m_cur_entry--;		Play();	}}void wxPlaylist::SetDead(){	PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);	if (ple) {		ple->m_bIsDead = 1;		UpdateEntry(m_cur_entry);		if (ple->m_bIsPlaying) PlayNext();		m_all_dead_entries = -1;	}}void wxPlaylist::SetDuration(u32 duration){	PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);	if (ple) {		ple->m_duration = duration;		UpdateEntry(m_cur_entry);	}}wxString wxPlaylist::GetDisplayName(){	if (m_cur_entry>=0) {		PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);		if (ple) return wxString(wxString(ple->m_disp_name, wxConvUTF8) );	}	return wxT("");}wxString wxPlaylist::GetURL(){	PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);	if (ple) return wxString(ple->m_url, wxConvUTF8);	return wxT("");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -