Playlist.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include "mplayerc.h"
  23. #include "playlist.h"
  24. //
  25. // CPlaylistItem
  26. //
  27. UINT CPlaylistItem::m_globalid  = 0;
  28. CPlaylistItem::CPlaylistItem()
  29. : m_type(file)
  30. , m_fInvalid(false)
  31. , m_duration(0)
  32. , m_vinput(-1)
  33. , m_vchannel(-1)
  34. , m_ainput(-1)
  35. {
  36. m_id = m_globalid++;
  37. }
  38. CPlaylistItem::~CPlaylistItem()
  39. {
  40. }
  41. CPlaylistItem::CPlaylistItem(const CPlaylistItem& pli)
  42. {
  43. *this = pli;
  44. }
  45. CPlaylistItem& CPlaylistItem::operator = (const CPlaylistItem& pli)
  46. {
  47. m_id = pli.m_id;
  48. m_label = pli.m_label;
  49. m_fns.RemoveAll();
  50. m_fns.AddTailList(&pli.m_fns);
  51. m_subs.RemoveAll();
  52. m_subs.AddTailList(&pli.m_subs);
  53. m_type = pli.m_type;
  54. m_fInvalid = pli.m_fInvalid;
  55. m_duration = pli.m_duration;
  56. m_vinput = pli.m_vinput;
  57. m_vchannel = pli.m_vchannel;
  58. m_ainput = pli.m_ainput;
  59. return(*this);
  60. }
  61. POSITION CPlaylistItem::FindFile(CString path)
  62. {
  63. POSITION pos = m_fns.GetHeadPosition();
  64. while(pos && !m_fns.GetAt(pos).CompareNoCase(path)) m_fns.GetNext(pos);
  65. return(NULL);
  66. }
  67. static CString StripPath(CString path)
  68. {
  69. CString p = path;
  70. p.Replace('\', '/');
  71. p = p.Mid(p.ReverseFind('/')+1);
  72. return(p.IsEmpty() ? path : p);
  73. }
  74. CString CPlaylistItem::GetLabel(int i)
  75. {
  76. CString str;
  77. if(i == 0)
  78. {
  79. if(!m_label.IsEmpty()) str = m_label;
  80. else if(!m_fns.IsEmpty()) str = StripPath(m_fns.GetHead());
  81. }
  82. else if(i == 1)
  83. {
  84. if(m_fInvalid) return _T("Invalid");
  85. if(m_type == file)
  86. {
  87. REFERENCE_TIME rt = m_duration;
  88. if(rt > 0)
  89. {
  90. rt /= 10000000;
  91. int ss = int(rt%60);
  92. rt /= 60;
  93. int mm = int(rt%60);
  94. rt /= 60;
  95. int hh = int(rt);
  96. str.Format(_T("%02d:%02d:%02d"), hh, mm, ss);
  97. }
  98. }
  99. else if(m_type == device)
  100. {
  101. // TODO
  102. }
  103. }
  104. return str;
  105. }
  106. //
  107. // CPlaylist
  108. //
  109. CPlaylist::CPlaylist()
  110. : m_pos(NULL)
  111. {
  112. }
  113. CPlaylist::~CPlaylist()
  114. {
  115. }
  116. void CPlaylist::RemoveAll()
  117. {
  118. __super::RemoveAll();
  119. m_pos = NULL;
  120. }
  121. bool CPlaylist::RemoveAt(POSITION pos)
  122. {
  123. if(pos)
  124. {
  125. __super::RemoveAt(pos);
  126. if(m_pos == pos) {m_pos = NULL; return(true);}
  127. }
  128. return(false);
  129. }
  130. typedef struct {UINT n; POSITION pos;} plsort_t;
  131. static int compare(const void* arg1, const void* arg2)
  132. {
  133. UINT a1 = ((plsort_t*)arg1)->n;
  134. UINT a2 = ((plsort_t*)arg2)->n;
  135. return a1 > a2 ? 1 : a1 < a2 ? -1 : 0;
  136. }
  137. typedef struct {LPCTSTR str; POSITION pos;} plsort2_t;
  138. int compare2(const void* arg1, const void* arg2)
  139. {
  140. return _tcsicmp(((plsort2_t*)arg1)->str, ((plsort2_t*)arg2)->str);
  141. }
  142. void CPlaylist::SortById()
  143. {
  144. CAtlArray<plsort_t> a;
  145. a.SetCount(GetCount());
  146. POSITION pos = GetHeadPosition();
  147. for(int i = 0; pos; i++, GetNext(pos))
  148. a[i].n = GetAt(pos).m_id, a[i].pos = pos;
  149. qsort(a.GetData(), a.GetCount(), sizeof(plsort_t), compare);
  150. for(int i = 0; i < a.GetCount(); i++)
  151. {
  152. AddTail(GetAt(a[i].pos));
  153. __super::RemoveAt(a[i].pos);
  154. if(m_pos == a[i].pos) m_pos = GetTailPosition(); 
  155. }
  156. }
  157. void CPlaylist::SortByName()
  158. {
  159. CAtlArray<plsort2_t> a;
  160. a.SetCount(GetCount());
  161. POSITION pos = GetHeadPosition();
  162. for(int i = 0; pos; i++, GetNext(pos))
  163. {
  164. CString& fn = GetAt(pos).m_fns.GetHead();
  165. a[i].str = (LPCTSTR)fn + max(fn.ReverseFind('/'), fn.ReverseFind('\')) + 1;
  166. a[i].pos = pos;
  167. }
  168. qsort(a.GetData(), a.GetCount(), sizeof(plsort2_t), compare2);
  169. for(int i = 0; i < a.GetCount(); i++)
  170. {
  171. AddTail(GetAt(a[i].pos));
  172. __super::RemoveAt(a[i].pos);
  173. if(m_pos == a[i].pos) m_pos = GetTailPosition(); 
  174. }
  175. }
  176. void CPlaylist::SortByPath()
  177. {
  178. CAtlArray<plsort2_t> a;
  179. a.SetCount(GetCount());
  180. POSITION pos = GetHeadPosition();
  181. for(int i = 0; pos; i++, GetNext(pos))
  182. a[i].str = GetAt(pos).m_fns.GetHead(), a[i].pos = pos;
  183. qsort(a.GetData(), a.GetCount(), sizeof(plsort2_t), compare2);
  184. for(int i = 0; i < a.GetCount(); i++)
  185. {
  186. AddTail(GetAt(a[i].pos));
  187. __super::RemoveAt(a[i].pos);
  188. if(m_pos == a[i].pos) m_pos = GetTailPosition(); 
  189. }
  190. }
  191. void CPlaylist::Randomize()
  192. {
  193. CAtlArray<plsort_t> a;
  194. a.SetCount(GetCount());
  195. srand((unsigned int)time(NULL));
  196. POSITION pos = GetHeadPosition();
  197. for(int i = 0; pos; i++, GetNext(pos))
  198. a[i].n = rand(), a[i].pos = pos;
  199. qsort(a.GetData(), a.GetCount(), sizeof(plsort_t), compare);
  200. CList<CPlaylistItem> pl;
  201. for(int i = 0; i < a.GetCount(); i++)
  202. {
  203. AddTail(GetAt(a[i].pos));
  204. __super::RemoveAt(a[i].pos);
  205. if(m_pos == a[i].pos)
  206. m_pos = GetTailPosition(); 
  207. }
  208. }
  209. POSITION CPlaylist::GetPos()
  210. {
  211. return(m_pos);
  212. }
  213. void CPlaylist::SetPos(POSITION pos)
  214. {
  215. m_pos = pos;
  216. }
  217. CPlaylistItem& CPlaylist::GetNextWrap(POSITION& pos)
  218. {
  219. GetNext(pos);
  220. if(!pos)
  221. {
  222. // FIXME: add param: , bool fShuffle
  223. if(GetCount() > 2 && AfxGetApp()->GetProfileInt(ResStr(IDS_R_SETTINGS), _T("ShufflePlaylistItems"), FALSE))
  224. Randomize();
  225. pos = GetHeadPosition();
  226. }
  227. return(GetAt(pos));
  228. }
  229. CPlaylistItem& CPlaylist::GetPrevWrap(POSITION& pos)
  230. {
  231. GetPrev(pos);
  232. if(!pos) pos = GetTailPosition();
  233. return(GetAt(pos));
  234. }