sloader.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:11k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* MikMod sound library
  2. (c) 1998, 1999, 2000, 2001 Miodrag Vallat and others - see file AUTHORS
  3. for complete list.
  4. This library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of
  7. the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with this library; if not, write to the Free Software
  16. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  17. 02111-1307, USA.
  18. */
  19. /*==============================================================================
  20.   $Id: sloader.c,v 1.1.1.1 2004/01/21 01:36:35 raph Exp $
  21.   Routines for loading samples. The sample loader utilizes the routines
  22.   provided by the "registered" sample loader.
  23. ==============================================================================*/
  24. #ifdef HAVE_CONFIG_H
  25. #include "config.h"
  26. #endif
  27. #ifdef HAVE_UNISTD_H
  28. #include <unistd.h>
  29. #endif
  30. #include "mikmod_internals.h"
  31. static int sl_rlength;
  32. static SWORD sl_old;
  33. static SWORD *sl_buffer=NULL;
  34. static SAMPLOAD *musiclist=NULL,*sndfxlist=NULL;
  35. /* size of the loader buffer in words */
  36. #define SLBUFSIZE 2048
  37. /* IT-Compressed status structure */
  38. typedef struct ITPACK {
  39. UWORD bits;    /* current number of bits */
  40. UWORD bufbits; /* bits in buffer */
  41. SWORD last;    /* last output */
  42. UBYTE buf;     /* bit buffer */
  43. } ITPACK;
  44. BOOL SL_Init(SAMPLOAD* s)
  45. {
  46. if(!sl_buffer)
  47. if(!(sl_buffer=_mm_malloc(SLBUFSIZE*sizeof(SWORD)))) return 0;
  48. sl_rlength = s->length;
  49. if(s->infmt & SF_16BITS) sl_rlength>>=1;
  50. sl_old = 0;
  51. return 1;
  52. }
  53. void SL_Exit(SAMPLOAD *s)
  54. {
  55. if(sl_rlength>0) _mm_fseek(s->reader,sl_rlength,SEEK_CUR);
  56. if(sl_buffer) {
  57. free(sl_buffer);
  58. sl_buffer=NULL;
  59. }
  60. }
  61. /* unpack a 8bit IT packed sample */
  62. static BOOL read_itcompr8(ITPACK* status,MREADER *reader,SWORD *sl_buffer,UWORD count,UWORD* incnt)
  63. {
  64. SWORD *dest=sl_buffer,*end=sl_buffer+count;
  65. UWORD x,y,needbits,havebits,new_count=0;
  66. UWORD bits = status->bits;
  67. UWORD bufbits = status->bufbits;
  68. SBYTE last = status->last;
  69. UBYTE buf = status->buf;
  70. while (dest<end) {
  71. needbits=new_count?3:bits;
  72. x=havebits=0;
  73. while (needbits) {
  74. /* feed buffer */
  75. if (!bufbits) {
  76. if((*incnt)--)
  77. buf=_mm_read_UBYTE(reader);
  78. else
  79. buf=0;
  80. bufbits=8;
  81. }
  82. /* get as many bits as necessary */
  83. y = needbits<bufbits?needbits:bufbits;
  84. x|= (buf & ((1<<y)- 1))<<havebits;
  85. buf>>=y;
  86. bufbits-=y;
  87. needbits-=y;
  88. havebits+=y;
  89. }
  90. if (new_count) {
  91. new_count = 0;
  92. if (++x >= bits)
  93. x++;
  94. bits = x;
  95. continue;
  96. }
  97. if (bits<7) {
  98. if (x==(1<<(bits-1))) {
  99. new_count = 1;
  100. continue;
  101. }
  102. }
  103. else if (bits<9) {
  104. y = (0xff >> (9-bits)) - 4;
  105. if ((x>y)&&(x<=y+8)) {
  106. if ((x-=y)>=bits)
  107. x++;
  108. bits = x;
  109. continue;
  110. }
  111. }
  112. else if (bits<10) {
  113. if (x>=0x100) {
  114. bits=x-0x100+1;
  115. continue;
  116. }
  117. } else {
  118. /* error in compressed data... */
  119. _mm_errno=MMERR_ITPACK_INVALID_DATA;
  120. return 0;
  121. }
  122. if (bits<8) /* extend sign */
  123. x = ((SBYTE)(x <<(8-bits))) >> (8-bits);
  124. *(dest++)= (last+=x) << 8; /* convert to 16 bit */
  125. }
  126. status->bits = bits;
  127. status->bufbits = bufbits;
  128. status->last = last;
  129. status->buf = buf;
  130. return dest-sl_buffer;
  131. }
  132. /* unpack a 16bit IT packed sample */
  133. static BOOL read_itcompr16(ITPACK *status,MREADER *reader,SWORD *sl_buffer,UWORD count,UWORD* incnt)
  134. {
  135. SWORD *dest=sl_buffer,*end=sl_buffer+count;
  136. SLONG x,y,needbits,havebits,new_count=0;
  137. UWORD bits = status->bits;
  138. UWORD bufbits = status->bufbits;
  139. SWORD last = status->last;
  140. UBYTE buf = status->buf;
  141. while (dest<end) {
  142. needbits=new_count?4:bits;
  143. x=havebits=0;
  144. while (needbits) {
  145. /* feed buffer */
  146. if (!bufbits) {
  147. if((*incnt)--)
  148. buf=_mm_read_UBYTE(reader);
  149. else
  150. buf=0;
  151. bufbits=8;
  152. }
  153. /* get as many bits as necessary */
  154. y=needbits<bufbits?needbits:bufbits;
  155. x|=(buf &((1<<y)-1))<<havebits;
  156. buf>>=y;
  157. bufbits-=y;
  158. needbits-=y;
  159. havebits+=y;
  160. }
  161. if (new_count) {
  162. new_count = 0;
  163. if (++x >= bits)
  164. x++;
  165. bits = x;
  166. continue;
  167. }
  168. if (bits<7) {
  169. if (x==(1<<(bits-1))) {
  170. new_count=1;
  171. continue;
  172. }
  173. }
  174. else if (bits<17) {
  175. y=(0xffff>>(17-bits))-8;
  176. if ((x>y)&&(x<=y+16)) {
  177. if ((x-=y)>=bits)
  178. x++;
  179. bits = x;
  180. continue;
  181. }
  182. }
  183. else if (bits<18) {
  184. if (x>=0x10000) {
  185. bits=x-0x10000+1;
  186. continue;
  187. }
  188. } else {
  189.  /* error in compressed data... */
  190. _mm_errno=MMERR_ITPACK_INVALID_DATA;
  191. return 0;
  192. }
  193. if (bits<16) /* extend sign */
  194. x = ((SWORD)(x<<(16-bits)))>>(16-bits);
  195. *(dest++)=(last+=x);
  196. }
  197. status->bits = bits;
  198. status->bufbits = bufbits;
  199. status->last = last;
  200. status->buf = buf;
  201. return dest-sl_buffer;
  202. }
  203. static BOOL SL_LoadInternal(void* buffer,UWORD infmt,UWORD outfmt,int scalefactor,ULONG length,MREADER* reader,BOOL dither)
  204. {
  205. SBYTE *bptr = (SBYTE*)buffer;
  206. SWORD *wptr = (SWORD*)buffer;
  207. int stodo,t,u;
  208. int result,c_block=0; /* compression bytes until next block */
  209. ITPACK status;
  210. UWORD incnt;
  211. while(length) {
  212. stodo=(length<SLBUFSIZE)?length:SLBUFSIZE;
  213. if(infmt&SF_ITPACKED) {
  214. sl_rlength=0;
  215. if (!c_block) {
  216. status.bits = (infmt & SF_16BITS) ? 17 : 9;
  217. status.last = status.bufbits = 0;
  218. incnt=_mm_read_I_UWORD(reader);
  219. c_block = (infmt & SF_16BITS) ? 0x4000 : 0x8000;
  220. if(infmt&SF_DELTA) sl_old=0;
  221. }
  222. if (infmt & SF_16BITS) {
  223. if(!(result=read_itcompr16(&status,reader,sl_buffer,stodo,&incnt)))
  224. return 1;
  225. } else {
  226. if(!(result=read_itcompr8(&status,reader,sl_buffer,stodo,&incnt)))
  227. return 1;
  228. }
  229. if(result!=stodo) {
  230. _mm_errno=MMERR_ITPACK_INVALID_DATA;
  231. return 1;
  232. }
  233. c_block -= stodo;
  234. } else {
  235. if(infmt&SF_16BITS) {
  236. if(infmt&SF_BIG_ENDIAN)
  237. _mm_read_M_SWORDS(sl_buffer,stodo,reader);
  238. else
  239. _mm_read_I_SWORDS(sl_buffer,stodo,reader);
  240. } else {
  241. SBYTE *src;
  242. SWORD *dest;
  243. reader->Read(reader,sl_buffer,sizeof(SBYTE)*stodo);
  244. src = (SBYTE*)sl_buffer;
  245. dest  = sl_buffer;
  246. src += stodo;dest += stodo;
  247. for(t=0;t<stodo;t++) {
  248. src--;dest--;
  249. *dest = (*src)<<8;
  250. }
  251. }
  252. sl_rlength-=stodo;
  253. }
  254. if(infmt & SF_DELTA)
  255. for(t=0;t<stodo;t++) {
  256. sl_buffer[t] += sl_old;
  257. sl_old = sl_buffer[t];
  258. }
  259. if((infmt^outfmt) & SF_SIGNED) 
  260. for(t=0;t<stodo;t++)
  261. sl_buffer[t]^= 0x8000;
  262. if(scalefactor) {
  263. int idx = 0;
  264. SLONG scaleval;
  265. /* Sample Scaling... average values for better results. */
  266. t= 0;
  267. while(t<stodo && length) {
  268. scaleval = 0;
  269. for(u=scalefactor;u && t<stodo;u--,t++)
  270. scaleval+=sl_buffer[t];
  271. sl_buffer[idx++]=scaleval/(scalefactor-u);
  272. length--;
  273. }
  274. stodo = idx;
  275. } else
  276. length -= stodo;
  277. if (dither) {
  278. if((infmt & SF_STEREO) && !(outfmt & SF_STEREO)) {
  279. /* dither stereo to mono, average together every two samples */
  280. SLONG avgval;
  281. int idx = 0;
  282. t=0;
  283. while(t<stodo && length) {
  284. avgval=sl_buffer[t++];
  285. avgval+=sl_buffer[t++];
  286. sl_buffer[idx++]=avgval>>1;
  287. length-=2;
  288. }
  289. stodo = idx;
  290. }
  291. }
  292. if(outfmt & SF_16BITS) {
  293. for(t=0;t<stodo;t++)
  294. *(wptr++)=sl_buffer[t];
  295. } else {
  296. for(t=0;t<stodo;t++)
  297. *(bptr++)=sl_buffer[t]>>8;
  298. }
  299. }
  300. return 0;
  301. }
  302. BOOL SL_Load(void* buffer,SAMPLOAD *smp,ULONG length)
  303. {
  304. return SL_LoadInternal(buffer,smp->infmt,smp->outfmt,smp->scalefactor,
  305.                        length,smp->reader,0);
  306. }
  307. /* Registers a sample for loading when SL_LoadSamples() is called. */
  308. SAMPLOAD* SL_RegisterSample(SAMPLE* s,int type,MREADER* reader)
  309. {
  310. SAMPLOAD *news,**samplist,*cruise;
  311. if(type==MD_MUSIC) {
  312. samplist = &musiclist;
  313. cruise = musiclist;
  314. } else
  315.   if (type==MD_SNDFX) {
  316. samplist = &sndfxlist;
  317. cruise = sndfxlist;
  318. } else
  319. return NULL;
  320. /* Allocate and add structure to the END of the list */
  321. if(!(news=(SAMPLOAD*)_mm_malloc(sizeof(SAMPLOAD)))) return NULL;
  322. if(cruise) {
  323. while(cruise->next) cruise=cruise->next;
  324. cruise->next = news;
  325. } else
  326. *samplist = news;
  327. news->infmt     = s->flags & SF_FORMATMASK;
  328. news->outfmt    = news->infmt;
  329. news->reader    = reader;
  330. news->sample    = s;
  331. news->length    = s->length;
  332. news->loopstart = s->loopstart;
  333. news->loopend   = s->loopend;
  334. return news;
  335. }
  336. static void FreeSampleList(SAMPLOAD* s)
  337. {
  338. SAMPLOAD *old;
  339. while(s) {
  340. old = s;
  341. s = s->next;
  342. free(old);
  343. }
  344. }
  345. /* Returns the total amount of memory required by the samplelist queue. */
  346. static ULONG SampleTotal(SAMPLOAD* samplist,int type)
  347. {
  348. int total = 0;
  349. while(samplist) {
  350. samplist->sample->flags=
  351.   (samplist->sample->flags&~SF_FORMATMASK)|samplist->outfmt;
  352. total += MD_SampleLength(type,samplist->sample);
  353. samplist=samplist->next;
  354. }
  355. return total;
  356. }
  357. static ULONG RealSpeed(SAMPLOAD *s)
  358. {
  359. return(s->sample->speed/(s->scalefactor?s->scalefactor:1));
  360. }    
  361. static BOOL DitherSamples(SAMPLOAD* samplist,int type)
  362. {
  363. SAMPLOAD *c2smp=NULL;
  364. ULONG maxsize, speed;
  365. SAMPLOAD *s;
  366. if(!samplist) return 0;
  367. if((maxsize=MD_SampleSpace(type)*1024)) 
  368. while(SampleTotal(samplist,type)>maxsize) {
  369. /* First Pass - check for any 16 bit samples */
  370. s = samplist;
  371. while(s) {
  372. if(s->outfmt & SF_16BITS) {
  373. SL_Sample16to8(s);
  374. break;
  375. }
  376. s=s->next;
  377. }
  378. /* Second pass (if no 16bits found above) is to take the sample with
  379.    the highest speed and dither it by half. */
  380. if(!s) {
  381. s = samplist;
  382. speed = 0;
  383. while(s) {
  384. if((s->sample->length) && (RealSpeed(s)>speed)) {
  385. speed=RealSpeed(s);
  386. c2smp=s;
  387. }
  388. s=s->next;
  389. }
  390. if (c2smp)
  391. SL_HalveSample(c2smp,2);
  392. }
  393. }
  394. /* Samples dithered, now load them ! */
  395. s = samplist;
  396. while(s) {
  397. /* sample has to be loaded ? -> increase number of samples, allocate
  398.    memory and load sample. */
  399. if(s->sample->length) {
  400. if(s->sample->seekpos)
  401. _mm_fseek(s->reader, s->sample->seekpos, SEEK_SET);
  402. /* Call the sample load routine of the driver module. It has to
  403.    return a 'handle' (>=0) that identifies the sample. */
  404. s->sample->handle = MD_SampleLoad(s, type);
  405. s->sample->flags  = (s->sample->flags & ~SF_FORMATMASK) | s->outfmt;
  406. if(s->sample->handle<0) {
  407. FreeSampleList(samplist);
  408. if(_mm_errorhandler) _mm_errorhandler();
  409. return 1;
  410. }
  411. }
  412. s = s->next;
  413. }
  414. FreeSampleList(samplist);
  415. return 0;
  416. }
  417. BOOL SL_LoadSamples(void)
  418. {
  419. BOOL ok;
  420. _mm_critical = 0;
  421. if((!musiclist)&&(!sndfxlist)) return 0;
  422. ok=DitherSamples(musiclist,MD_MUSIC)||DitherSamples(sndfxlist,MD_SNDFX);
  423. musiclist=sndfxlist=NULL;
  424. return ok;
  425. }
  426. void SL_Sample16to8(SAMPLOAD* s)
  427. {
  428. s->outfmt &= ~SF_16BITS;
  429. s->sample->flags = (s->sample->flags&~SF_FORMATMASK) | s->outfmt;
  430. }
  431. void SL_Sample8to16(SAMPLOAD* s)
  432. {
  433. s->outfmt |= SF_16BITS;
  434. s->sample->flags = (s->sample->flags&~SF_FORMATMASK) | s->outfmt;
  435. }
  436. void SL_SampleSigned(SAMPLOAD* s)
  437. {
  438. s->outfmt |= SF_SIGNED;
  439. s->sample->flags = (s->sample->flags&~SF_FORMATMASK) | s->outfmt;
  440. }
  441. void SL_SampleUnsigned(SAMPLOAD* s)
  442. {
  443. s->outfmt &= ~SF_SIGNED;
  444. s->sample->flags = (s->sample->flags&~SF_FORMATMASK) | s->outfmt;
  445. }
  446. void SL_HalveSample(SAMPLOAD* s,int factor)
  447. {
  448. s->scalefactor=factor>0?factor:2;
  449. s->sample->divfactor = s->scalefactor;
  450. s->sample->length    = s->length / s->scalefactor;
  451. s->sample->loopstart = s->loopstart / s->scalefactor;
  452. s->sample->loopend   = s->loopend / s->scalefactor;
  453. }
  454. /* ex:set ts=4: */