/xbmc/cores/paplayer/VGMCodec.cpp

http://github.com/xbmc/xbmc · C++ · 262 lines · 221 code · 20 blank · 21 comment · 156 complexity · aef0716a97863eb304fe4d9df2862176 MD5 · raw file

  1. /*
  2. * Copyright (C) 2005-2013 Team XBMC
  3. * http://xbmc.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 XBMC; see the file COPYING. If not, see
  17. * <http://www.gnu.org/licenses/>.
  18. *
  19. */
  20. #include "VGMCodec.h"
  21. #include "utils/log.h"
  22. #include "utils/URIUtils.h"
  23. VGMCodec::VGMCodec()
  24. {
  25. m_CodecName = "vgm";
  26. m_vgm = 0;
  27. m_iDataPos = -1;
  28. m_DataFormat = AE_FMT_INVALID;
  29. }
  30. VGMCodec::~VGMCodec()
  31. {
  32. DeInit();
  33. }
  34. bool VGMCodec::Init(const CStdString &strFile, unsigned int filecache)
  35. {
  36. if (!m_dll.Load())
  37. return false; // error logged previously
  38. m_dll.Init();
  39. //CStdString strFileToLoad = "filereader://"+strFile;
  40. XFILE::CFile::Cache(strFile,"special://temp/"+URIUtils::GetFileName(strFile));
  41. //m_vgm = m_dll.LoadVGM(strFileToLoad.c_str(),&m_SampleRate,&m_BitsPerSample,&m_Channels);
  42. m_vgm = m_dll.LoadVGM("special://temp/"+URIUtils::GetFileName(strFile),&m_SampleRate,&m_BitsPerSample,&m_Channels);
  43. if (!m_vgm)
  44. {
  45. CLog::Log(LOGERROR,"%s: error opening file %s!",__FUNCTION__,strFile.c_str());
  46. return false;
  47. }
  48. switch (m_BitsPerSample)
  49. {
  50. case 8: m_DataFormat = AE_FMT_U8 ; break;
  51. case 16: m_DataFormat = AE_FMT_S16NE; break;
  52. case 32: m_DataFormat = AE_FMT_FLOAT; break;
  53. }
  54. m_TotalTime = (int64_t)m_dll.GetLength(m_vgm);
  55. return true;
  56. }
  57. void VGMCodec::DeInit()
  58. {
  59. if (m_vgm)
  60. m_dll.FreeVGM(m_vgm);
  61. m_vgm = 0;
  62. }
  63. int64_t VGMCodec::Seek(int64_t iSeekTime)
  64. {
  65. int64_t result = (int64_t)m_dll.Seek(m_vgm,(unsigned long)iSeekTime);
  66. m_iDataPos = result/1000*m_SampleRate*m_BitsPerSample*m_Channels/8;
  67. return result;
  68. }
  69. int VGMCodec::ReadPCM(BYTE *pBuffer, int size, int *actualsize)
  70. {
  71. if (m_iDataPos == -1)
  72. {
  73. m_iDataPos = 0;
  74. }
  75. if (m_iDataPos >= m_TotalTime/1000*m_SampleRate*m_BitsPerSample*m_Channels/8)
  76. {
  77. return READ_EOF;
  78. }
  79. if ((*actualsize=m_dll.FillBuffer(m_vgm,(char*)pBuffer,size))> 0)
  80. {
  81. m_iDataPos += *actualsize;
  82. return READ_SUCCESS;
  83. }
  84. return READ_ERROR;
  85. }
  86. bool VGMCodec::CanInit()
  87. {
  88. return m_dll.CanLoad();
  89. }
  90. bool VGMCodec::IsSupportedFormat(const CStdString& strExt)
  91. {
  92. if (strExt == "aax" ||
  93. strExt == "acm" ||
  94. strExt == "adp" ||
  95. strExt == "ads" ||
  96. strExt == "adx" ||
  97. strExt == "afc" ||
  98. strExt == "agsc" ||
  99. strExt == "ahx" ||
  100. strExt == "aifc" ||
  101. strExt == "aix" ||
  102. strExt == "amts" ||
  103. strExt == "as4" ||
  104. strExt == "asd" ||
  105. strExt == "asf" ||
  106. strExt == "asr" ||
  107. strExt == "ass" ||
  108. strExt == "ast" ||
  109. strExt == "aud" ||
  110. strExt == "aus" ||
  111. strExt == "bg00" ||
  112. strExt == "bgw" ||
  113. strExt == "bh2pcm" ||
  114. strExt == "bmdx" ||
  115. strExt == "brstm" ||
  116. strExt == "capdsp" ||
  117. strExt == "ccc" ||
  118. strExt == "cfn" ||
  119. strExt == "cnk" ||
  120. strExt == "dcs" ||
  121. strExt == "de2" ||
  122. strExt == "dsp" ||
  123. strExt == "dvi" ||
  124. strExt == "dxh" ||
  125. strExt == "eam" ||
  126. strExt == "emff" ||
  127. strExt == "enth" ||
  128. strExt == "fag" ||
  129. strExt == "filp" ||
  130. strExt == "fsb" ||
  131. strExt == "gbts" ||
  132. strExt == "gca" ||
  133. strExt == "gcm" ||
  134. strExt == "gcw" ||
  135. strExt == "genh" ||
  136. strExt == "gms" ||
  137. strExt == "gsb" ||
  138. strExt == "hgc1" ||
  139. strExt == "hps" ||
  140. strExt == "idsp" ||
  141. strExt == "idvi" ||
  142. strExt == "ikm" ||
  143. strExt == "ild" ||
  144. strExt == "int" ||
  145. strExt == "isd" ||
  146. strExt == "ivb" ||
  147. strExt == "joe" ||
  148. strExt == "kces" ||
  149. strExt == "kcey" ||
  150. strExt == "kraw" ||
  151. strExt == "leg" ||
  152. strExt == "logg" ||
  153. strExt == "lwav" ||
  154. strExt == "matx" ||
  155. strExt == "mi4" ||
  156. strExt == "mib" ||
  157. strExt == "mic" ||
  158. strExt == "mihb" ||
  159. strExt == "mpdsp" ||
  160. strExt == "mss" ||
  161. strExt == "msvp" ||
  162. strExt == "mus" ||
  163. strExt == "musc" ||
  164. strExt == "musx" ||
  165. strExt == "mwv" ||
  166. strExt == "npsf" ||
  167. strExt == "nwa" ||
  168. strExt == "omu" ||
  169. strExt == "p2bt" ||
  170. strExt == "pcm" ||
  171. strExt == "pdt" ||
  172. strExt == "pnb" ||
  173. strExt == "pos" ||
  174. strExt == "psh" ||
  175. strExt == "psw" ||
  176. strExt == "raw" ||
  177. strExt == "rkv" ||
  178. strExt == "rnd" ||
  179. strExt == "rsd" ||
  180. strExt == "rsf" ||
  181. strExt == "rstm" ||
  182. strExt == "rwsd" ||
  183. strExt == "rwav" ||
  184. strExt == "rws" ||
  185. strExt == "rwx" ||
  186. strExt == "rxw" ||
  187. strExt == "sad" ||
  188. strExt == "sdt" ||
  189. strExt == "seg" ||
  190. strExt == "sfl" ||
  191. strExt == "sfs" ||
  192. strExt == "sl3" ||
  193. strExt == "sli" ||
  194. strExt == "smp" ||
  195. strExt == "sng" ||
  196. strExt == "spd" ||
  197. strExt == "spsd" ||
  198. strExt == "spw" ||
  199. strExt == "ss2" ||
  200. strExt == "ss7" ||
  201. strExt == "ssm" ||
  202. strExt == "stma" ||
  203. strExt == "str" ||
  204. strExt == "strm" ||
  205. strExt == "sts" ||
  206. strExt == "svag" ||
  207. strExt == "svs" ||
  208. strExt == "swd" ||
  209. strExt == "tec" ||
  210. strExt == "thp" ||
  211. strExt == "tydsp" ||
  212. strExt == "um3" ||
  213. strExt == "vag" ||
  214. strExt == "vas" ||
  215. strExt == "vgs" ||
  216. strExt == "vig" ||
  217. strExt == "vpk" ||
  218. strExt == "vs" ||
  219. strExt == "waa" ||
  220. strExt == "wac" ||
  221. strExt == "wad" ||
  222. strExt == "wam" ||
  223. strExt == "wavm" ||
  224. strExt == "wp2" ||
  225. strExt == "wsi" ||
  226. strExt == "wvs" ||
  227. strExt == "xa" ||
  228. strExt == "xa2" ||
  229. strExt == "xa30" ||
  230. strExt == "xmu" ||
  231. strExt == "xsf" ||
  232. strExt == "xss" ||
  233. strExt == "xvas" ||
  234. strExt == "xwav" ||
  235. strExt == "xwb" ||
  236. strExt == "ydsp" ||
  237. strExt == "ymf" ||
  238. strExt == "zwdsp"
  239. )
  240. return true;
  241. return false;
  242. }