📄 playlist.cpp
字号:
} 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 + -