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

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: pcm_soft.c 585 2006-01-16 09:48:55Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #include "../dyncode/dyncode.h"
  25. #include "pcm_soft.h"
  26. static INLINE int PCMShift(const audio* Format)
  27. {
  28. int Bit = 0;
  29. if (Format->Bits>8) Bit = 1;
  30. if (Format->Bits>16) Bit = 2;
  31. if (!(Format->Flags & PCM_PLANES) && Format->Channels==2)
  32. ++Bit;
  33. return Bit;
  34. }
  35. void PCM_Init()
  36. {
  37. }
  38. void PCM_Done()
  39. {
  40. pcm_soft* p;
  41. while ((p = Context()->PCM)!=NULL)
  42. {
  43. Context()->PCM = p->Next;
  44. CodeDone(&p->Code);
  45. free(p);
  46. }
  47. }
  48. #if (!defined(ARM) && !defined(SH3) && !defined(MIPS)) || !defined(CONFIG_DYNCODE)
  49. void PCM_S16_To_S16_Stereo(pcm_soft* This,const planes DstPtr,const constplanes SrcPtr,int DstLength,pcmstate* State,int Volume)
  50. {
  51. const int32_t* Src = SrcPtr[0];
  52. int32_t* Dst = DstPtr[0];
  53. int32_t* DstEnd = Dst + (DstLength >> 2);
  54. if (State->Step == 256)
  55. memcpy(Dst,Src,DstLength);
  56. else
  57. {
  58. int Pos = State->Pos;
  59. int Step = State->Step;
  60. while (Dst != DstEnd)
  61. {
  62. *(Dst++) = Src[Pos >> 8];
  63. Pos += Step;
  64. }
  65. }
  66. }
  67. void PCM_P32_To_S16_Stereo(pcm_soft* This,const planes DstPtr,const constplanes SrcPtr,int DstLength,pcmstate* State,int Volume)
  68. {
  69. const int32_t* SrcA = SrcPtr[0];
  70. const int32_t* SrcB = SrcPtr[1];
  71. int16_t* Dst = DstPtr[0];
  72. int16_t* DstEnd = Dst + (DstLength >> 1);
  73. int UpLimit = (1 << This->Src.FracBits) - 1;
  74. int DownLimit = -(1 << This->Src.FracBits);
  75. int Shift = This->Src.FracBits - This->Dst.FracBits;
  76. if (State->Step == 256)
  77. {
  78. while (Dst != DstEnd)
  79. {
  80. int Left = *(SrcA++);
  81. int Right = *(SrcB++);
  82. if (Left > UpLimit) Left = UpLimit;
  83. if (Left < DownLimit) Left = DownLimit;
  84. if (Right > UpLimit) Right = UpLimit;
  85. if (Right < DownLimit) Right = DownLimit;
  86. Dst[0] = (int16_t)(Left >> Shift);
  87. Dst[1] = (int16_t)(Right >> Shift);
  88. Dst += 2;
  89. }
  90. }
  91. else
  92. {
  93. int Pos = State->Pos;
  94. int Step = State->Step;
  95. while (Dst != DstEnd)
  96. {
  97. int Left = SrcA[Pos >> 8];
  98. int Right = SrcB[Pos >> 8];
  99. if (Left > UpLimit) Left = UpLimit;
  100. if (Left < DownLimit) Left = DownLimit;
  101. if (Right > UpLimit) Right = UpLimit;
  102. if (Right < DownLimit) Right = DownLimit;
  103. Dst[0] = (int16_t)(Left >> Shift);
  104. Dst[1] = (int16_t)(Right >> Shift);
  105. Dst += 2;
  106. Pos += Step;
  107. }
  108. }
  109. }
  110. void PCMUniversal(pcm_soft* This,const planes DstPtr,const constplanes SrcPtr,int DstLength,pcmstate* State,int Volume)
  111. {
  112. const uint8_t* Src[2];
  113. const uint8_t* DstEnd;
  114. uint8_t* Dst[2];
  115. bool_t SrcSwap = This->SrcSwap;
  116. bool_t DstSwap = This->DstSwap;
  117. int DstType = This->DstType;
  118. int SrcType = This->SrcType;
  119. int DstStep = 1 << This->DstShift;
  120. int Pos = State->Pos;
  121. int Step = State->Step;
  122. float SrcScale = 0;
  123. float DstScale = 0;
  124. int SrcUnsigned = This->SrcUnsigned;
  125. int DstUnsigned = This->DstUnsigned;
  126. int UpLimit = (1 << This->Src.FracBits) - 1;
  127. int DownLimit = -(1 << This->Src.FracBits);
  128. int SrcShift = 31 - This->Src.FracBits;
  129. int DstShift = 31 - This->Dst.FracBits;
  130. bool_t OnlyLeft = (This->Dst.Flags & PCM_ONLY_LEFT) != 0;
  131. bool_t OnlyRight = (This->Dst.Flags & PCM_ONLY_RIGHT) != 0;
  132. bool_t VolumeShift = This->Src.Bits >= 23;
  133. if (!This->UseVolume)
  134. Volume = 256;
  135. if (SrcType >= 12) SrcScale = (float)(1 << This->Src.FracBits);
  136. if (DstType >= 12) DstScale = 1.0f/(1 << This->Dst.FracBits);
  137. Dst[0] = (uint8_t*) DstPtr[0];
  138. Dst[1] = (uint8_t*) DstPtr[1];
  139. Src[0] = (uint8_t*) SrcPtr[0];
  140. Src[1] = (uint8_t*) SrcPtr[1];
  141. DstEnd = Dst[0] + DstLength;
  142. // mono,packed
  143. // mono,planar
  144. // stereo,packed
  145. // stereo,planar
  146. while (Dst[0] != DstEnd)
  147. {
  148. int Left;
  149. int Right;
  150. if (SrcUnsigned)
  151. switch (SrcType)
  152. {
  153. default:
  154. case 0:
  155. case 1:
  156. Left = Right = ((uint8_t*)Src[0])[Pos >> 8] - SrcUnsigned;
  157. break;
  158. case 2:
  159. Left =  ((uint8_t*)Src[0])[(Pos >> 8)*2] - SrcUnsigned;
  160. Right = ((uint8_t*)Src[0])[(Pos >> 8)*2+1] - SrcUnsigned;
  161. break;
  162. case 3:
  163. Left =  ((uint8_t*)Src[0])[(Pos >> 8)] - SrcUnsigned;
  164. Right = ((uint8_t*)Src[1])[(Pos >> 8)] - SrcUnsigned;
  165. break;
  166. case 4:
  167. case 5:
  168. Left = ((uint16_t*)Src[0])[Pos >> 8];
  169. if (SrcSwap)
  170. Left = SWAP16(Left);
  171. Left -= SrcUnsigned;
  172. Right = Left;
  173. break;
  174. case 6:
  175. Left =  ((uint16_t*)Src[0])[(Pos >> 8)*2];
  176. Right = ((uint16_t*)Src[0])[(Pos >> 8)*2+1];
  177. if (SrcSwap)
  178. {
  179. Left = SWAP16(Left);
  180. Right = SWAP16(Right);
  181. }
  182. Left -= SrcUnsigned;
  183. Right -= SrcUnsigned;
  184. break;
  185. case 7:
  186. Left =  ((uint16_t*)Src[0])[(Pos >> 8)];
  187. Right = ((uint16_t*)Src[1])[(Pos >> 8)];
  188. if (SrcSwap)
  189. {
  190. Left = SWAP16(Left);
  191. Right = SWAP16(Right);
  192. }
  193. Left -= SrcUnsigned;
  194. Right -= SrcUnsigned;
  195. break;
  196. case 8:
  197. case 9:
  198. Left = ((uint32_t*)Src[0])[Pos >> 8];
  199. if (SrcSwap)
  200. Left = SWAP32(Left);
  201. Left -= SrcUnsigned;
  202. Right = Left;
  203. break;
  204. case 10:
  205. Left =  ((uint32_t*)Src[0])[(Pos >> 8)*2];
  206. Right = ((uint32_t*)Src[0])[(Pos >> 8)*2+1];
  207. if (SrcSwap)
  208. {
  209. Left = SWAP32(Left);
  210. Right = SWAP32(Right);
  211. }
  212. Left -= SrcUnsigned;
  213. Right -= SrcUnsigned;
  214. break;
  215. case 11:
  216. Left =  ((uint32_t*)Src[0])[(Pos >> 8)];
  217. Right = ((uint32_t*)Src[1])[(Pos >> 8)];
  218. if (SrcSwap)
  219. {
  220. Left = SWAP32(Left);
  221. Right = SWAP32(Right);
  222. }
  223. Left -= SrcUnsigned;
  224. Right -= SrcUnsigned;
  225. break;
  226. }
  227. else
  228. switch (SrcType)
  229. {
  230. default:
  231. case 0:
  232. case 1:
  233. Left = Right = ((int8_t*)Src[0])[Pos >> 8];
  234. break;
  235. case 2:
  236. Left =  ((int8_t*)Src[0])[(Pos >> 8)*2];
  237. Right = ((int8_t*)Src[0])[(Pos >> 8)*2+1];
  238. break;
  239. case 3:
  240. Left =  ((int8_t*)Src[0])[(Pos >> 8)];
  241. Right = ((int8_t*)Src[1])[(Pos >> 8)];
  242. break;
  243. case 4:
  244. case 5:
  245. Left = ((int16_t*)Src[0])[Pos >> 8];
  246. if (SrcSwap)
  247. Left = (int16_t)SWAP16(Left);
  248. Right = Left;
  249. break;
  250. case 6:
  251. Left = ((int16_t*)Src[0])[(Pos >> 8)*2];
  252. Right = ((int16_t*)Src[0])[(Pos >> 8)*2+1];
  253. if (SrcSwap)
  254. {
  255. Left = (int16_t)SWAP16(Left);
  256. Right = (int16_t)SWAP16(Right);
  257. }
  258. break;
  259. case 7:
  260. Left =  ((int16_t*)Src[0])[(Pos >> 8)];
  261. Right = ((int16_t*)Src[1])[(Pos >> 8)];
  262. if (SrcSwap)
  263. {
  264. Left = (int16_t)SWAP16(Left);
  265. Right = (int16_t)SWAP16(Right);
  266. }
  267. break;
  268. case 8:
  269. case 9:
  270. Left = ((int32_t*)Src[0])[Pos >> 8];
  271. if (SrcSwap)
  272. Left = (int32_t)SWAP32(Left);
  273. Right = Left;
  274. break;
  275. case 10:
  276. Left =  ((int32_t*)Src[0])[(Pos >> 8)*2];
  277. Right = ((int32_t*)Src[0])[(Pos >> 8)*2+1];
  278. if (SrcSwap)
  279. {
  280. Left = (int32_t)SWAP32(Left);
  281. Right = (int32_t)SWAP32(Right);
  282. }
  283. break;
  284. case 11:
  285. Left =  ((int32_t*)Src[0])[(Pos >> 8)];
  286. Right = ((int32_t*)Src[1])[(Pos >> 8)];
  287. if (SrcSwap)
  288. {
  289. Left = (int32_t)SWAP32(Left);
  290. Right = (int32_t)SWAP32(Right);
  291. }
  292. break;
  293. case 12:
  294. case 13:
  295. Left = (int)(((float*)Src[0])[Pos >> 8]*SrcScale);
  296. Right = Left;
  297. break;
  298. case 14:
  299. Left =  (int)(((float*)Src[0])[(Pos >> 8)*2]*SrcScale);
  300. Right = (int)(((float*)Src[0])[(Pos >> 8)*2+1]*SrcScale);
  301. break;
  302. case 15:
  303. Left =  (int)(((float*)Src[0])[(Pos >> 8)]*SrcScale);
  304. Right = (int)(((float*)Src[1])[(Pos >> 8)]*SrcScale);
  305. break;
  306. }
  307. if (Volume != 256)
  308. {
  309. if (VolumeShift)
  310. {
  311. Left = (Left >> 8) * Volume;
  312. Right = (Right >> 8) * Volume;
  313. }
  314. else
  315. {
  316. Left = (Left * Volume) >> 8;
  317. Right = (Right * Volume) >> 8;
  318. }
  319. }
  320. if (Left > UpLimit) Left = UpLimit;
  321. if (Left < DownLimit) Left = DownLimit;
  322. if (Right > UpLimit) Right = UpLimit;
  323. if (Right < DownLimit) Right = DownLimit;
  324. Left <<= SrcShift;
  325. Right <<= SrcShift;
  326. Left >>= DstShift;
  327. Right >>= DstShift;
  328. if (OnlyLeft)
  329. Right = Left;
  330. if (OnlyRight)
  331. Left = Right;
  332. if ((This->Src.Flags ^ This->Dst.Flags) & PCM_SWAPPEDSTEREO)
  333. SwapInt(&Left,&Right);
  334. switch (DstType)
  335. {
  336. default:
  337. case 0:
  338. case 1:
  339. ((int8_t*)Dst[0])[0] = (int8_t)(((Left + Right) >> 1) + DstUnsigned);
  340. break;
  341. case 2:
  342. ((int8_t*)Dst[0])[0] = (int8_t)(Left + DstUnsigned);
  343. ((int8_t*)Dst[0])[1] = (int8_t)(Right + DstUnsigned);
  344. break;
  345. case 3:
  346. ((int8_t*)Dst[0])[0] = (int8_t)(Left + DstUnsigned);
  347. ((int8_t*)Dst[1])[0] = (int8_t)(Right + DstUnsigned);
  348. break;
  349. case 4:
  350. case 5:
  351. Left = ((Left + Right) >> 1) + DstUnsigned;
  352. if (DstSwap)
  353. Left = SWAP16(Left);
  354. ((int16_t*)Dst[0])[0] = (int16_t)Left;
  355. break;
  356. case 6:
  357. Left += DstUnsigned;
  358. Right += DstUnsigned;
  359. if (DstSwap)
  360. {
  361. Left = SWAP16(Left);
  362. Right = SWAP16(Right);
  363. }
  364. ((int16_t*)Dst[0])[0] = (int16_t)Left;
  365. ((int16_t*)Dst[0])[1] = (int16_t)Right;
  366. break;
  367. case 7:
  368. Left += DstUnsigned;
  369. Right += DstUnsigned;
  370. if (DstSwap)
  371. {
  372. Left = SWAP16(Left);
  373. Right = SWAP16(Right);
  374. }
  375. ((int16_t*)Dst[0])[0] = (int16_t)Left;
  376. ((int16_t*)Dst[1])[0] = (int16_t)Right;
  377. break;
  378. case 8:
  379. case 9:
  380. Left = ((Left + Right) >> 1) + DstUnsigned;
  381. if (DstSwap)
  382. Left = SWAP32(Left);
  383. ((int32_t*)Dst[0])[0] = Left;
  384. break;
  385. case 10:
  386. Left += DstUnsigned;
  387. Right += DstUnsigned;
  388. if (DstSwap)
  389. {
  390. Left = SWAP32(Left);
  391. Right = SWAP32(Right);
  392. }
  393. ((int32_t*)Dst[0])[0] = Left;
  394. ((int32_t*)Dst[0])[1] = Right;
  395. break;
  396. case 11:
  397. Left += DstUnsigned;
  398. Right += DstUnsigned;
  399. if (DstSwap)
  400. {
  401. Left = SWAP32(Left);
  402. Right = SWAP32(Right);
  403. }
  404. ((int32_t*)Dst[0])[0] = Left;
  405. ((int32_t*)Dst[1])[0] = Right;
  406. break;
  407. case 12:
  408. case 13:
  409. Left = (Left + Right) >> 1;
  410. ((float*)Dst[0])[0] = (float)Left*DstScale;
  411. break;
  412. case 14:
  413. ((float*)Dst[0])[0] = (float)Left*DstScale;
  414. ((float*)Dst[0])[1] = (float)Right*DstScale;
  415. break;
  416. case 15:
  417. ((float*)Dst[0])[0] = (float)Left*DstScale;
  418. ((float*)Dst[1])[0] = (float)Right*DstScale;
  419. break;
  420. }
  421. Pos += Step;
  422. Dst[0] += DstStep;
  423. Dst[1] += DstStep;
  424. }
  425. }
  426. static int UniversalType(const audio* Format)
  427. {
  428. int Type = (Format->Channels - 1)*2;
  429. if (Format->Flags & PCM_PLANES) Type |= 1;
  430. if (Format->Flags & PCM_FLOAT) 
  431. Type += 12;
  432. else
  433. {
  434. if (Format->Bits>8) Type += 4;
  435. if (Format->Bits>16) Type += 4;
  436. }
  437. return Type;
  438. }
  439. #endif
  440. pcm_soft* PCMCreate(const audio* DstFormat, const audio* SrcFormat, bool_t Dither, bool_t UseVolume)
  441. {
  442. pcm_soft* p = Context()->PCM;
  443. if (p)
  444. Context()->PCM = p->Next;
  445. else
  446. {
  447. p = (pcm_soft*)malloc(sizeof(pcm_soft));
  448. if (!p)
  449. return NULL;
  450. memset(p,0,sizeof(pcm_soft));
  451. CodeInit(&p->Code);
  452. }
  453. if (!EqAudio(&p->Dst,DstFormat) ||
  454. !EqAudio(&p->Src,SrcFormat) ||
  455. p->UseVolume != UseVolume || 
  456. p->Dither != Dither)
  457. {
  458. p->Entry = NULL;
  459. p->Dst = *DstFormat;
  460. p->Src = *SrcFormat;
  461. p->Dither = Dither;
  462. p->UseVolume = UseVolume;
  463. // only PCM streams are supported
  464. if (p->Dst.Format==AUDIOFMT_PCM && p->Src.Format==AUDIOFMT_PCM) 
  465. {
  466. p->SrcSwap = (p->Src.Flags & PCM_SWAPEDBYTES)!=0 && (p->Src.Bits>8);
  467. p->DstSwap = (p->Dst.Flags & PCM_SWAPEDBYTES)!=0 && (p->Dst.Bits>8);
  468. p->SrcShift = PCMShift(&p->Src);
  469. p->DstShift = PCMShift(&p->Dst);
  470. p->SrcUnsigned = (p->Src.Flags & PCM_UNSIGNED) ? (1 << (p->Src.Bits-1)):0;
  471. p->DstUnsigned = (p->Dst.Flags & PCM_UNSIGNED) ? (1 << (p->Dst.Bits-1)):0;
  472. p->UseLeft = (p->Dst.Flags & PCM_ONLY_RIGHT)==0 || (p->Src.Channels <= 1);
  473. p->UseRight = (p->Dst.Flags & PCM_ONLY_LEFT)==0 && (p->Src.Channels > 1);
  474. p->SrcChannels = (p->UseLeft && p->UseRight) ? 2:1;
  475. p->Clip = (p->Src.Bits - p->Src.FracBits) - (p->Dst.Bits - p->Dst.FracBits);
  476. p->Stereo = p->SrcChannels > 1 && p->Dst.Channels > 1;
  477. p->Join = !p->Stereo && (p->SrcChannels > 1);
  478. p->Shift = p->Dst.FracBits - p->Src.FracBits - p->Join;
  479. p->LifeDriveFix = !p->UseVolume && !(p->Src.Flags & PCM_LIFEDRIVE_FIX) && (p->Dst.Flags & PCM_LIFEDRIVE_FIX) && p->Dst.Bits==16;
  480. p->ActualDither = !p->LifeDriveFix && !p->UseVolume && p->Dither && ((p->Clip>0) || (p->Shift<0));
  481. p->Limit2 = p->Src.Bits + p->Join - p->Clip - 1;
  482. if (p->UseVolume && p->Src.Bits < 23)
  483. {
  484. p->Shift -= 8;
  485. p->Limit2 += 8;
  486. }
  487. p->MaxLimit = (1 << p->Limit2) - 1;
  488. p->MinLimit = -(1 << p->Limit2);
  489. p->State.Speed = -1;
  490. p->State.Step = 256;
  491. #if (defined(ARM) || defined(SH3) || defined(MIPS)) && defined(CONFIG_DYNCODE)
  492. CodeStart(&p->Code);
  493. PCMCompile(p);
  494. CodeBuild(&p->Code);
  495. if (p->Code.Size)
  496. p->Entry = (pcmsoftentry)p->Code.Code;
  497. #else
  498. p->SrcType = UniversalType(&p->Src);
  499. p->DstType = UniversalType(&p->Dst);
  500. p->Entry = PCMUniversal;
  501. if (!p->UseVolume && !p->DstUnsigned && p->DstType==6 &&
  502. !((p->Src.Flags ^ p->Dst.Flags) & PCM_SWAPPEDSTEREO) &&
  503. !p->SrcSwap && !p->DstSwap && 
  504. !(p->Dst.Flags & (PCM_ONLY_LEFT|PCM_ONLY_RIGHT)))
  505. {
  506. if (p->Src.FracBits >= p->Dst.FracBits && !p->SrcUnsigned && p->SrcType==11 && !p->SrcSwap && !p->DstSwap)
  507. p->Entry = PCM_P32_To_S16_Stereo;
  508. else
  509. if (p->Src.FracBits == p->Dst.FracBits && !p->SrcUnsigned && p->SrcType==6)
  510. p->Entry = PCM_S16_To_S16_Stereo;
  511. }
  512. #endif
  513. }
  514. }
  515. if (!p->Entry)
  516. {
  517. PCMRelease(p);
  518. p = NULL;
  519. }
  520. PCMReset(p);
  521. return p;
  522. }
  523. void PCMRelease(pcm_soft* p)
  524. {
  525. if (p)
  526. {
  527. p->Next = Context()->PCM;
  528. Context()->PCM = p;
  529. }
  530. }
  531. int PCMDstLength(pcm_soft* p, int SrcLength)
  532. {
  533. return (SrcLength >> p->SrcShift) << p->DstShift;
  534. }
  535. void PCMConvert(pcm_soft* p, const planes Dst, const constplanes Src, int* DstLength, int* SrcLength, int Speed, int Volume)
  536. {
  537. int SrcSamples;
  538. int DstSamples;
  539. int AvailSamples;
  540. if (!p || !p->Entry) return;
  541. SrcSamples = *SrcLength >> p->SrcShift;
  542. DstSamples = *DstLength >> p->DstShift;
  543. if (p->State.Speed != Speed)
  544. {
  545. p->State.Speed = Speed;
  546. p->State.Step = Scale(Speed,p->Src.SampleRate,p->Dst.SampleRate*256);
  547. if (p->State.Step<=0)
  548. p->State.Step = 256;
  549. }
  550. if (p->State.Step != 256)
  551. {
  552. AvailSamples = ((SrcSamples << 8) - p->State.Pos + p->State.Step - 1) / p->State.Step;
  553. if (DstSamples > AvailSamples)
  554. DstSamples = AvailSamples;
  555. AvailSamples = (p->State.Pos + DstSamples * p->State.Step) >> 8;
  556. if (SrcSamples > AvailSamples)
  557. SrcSamples = AvailSamples;
  558. }
  559. else
  560. {
  561. if (DstSamples > SrcSamples)
  562. DstSamples = SrcSamples;
  563. SrcSamples = DstSamples;
  564. }
  565. *SrcLength = SrcSamples << p->SrcShift;
  566. *DstLength = DstSamples << p->DstShift;
  567. if (DstSamples)
  568. p->Entry(p,Dst,Src,*DstLength,&p->State,Volume);
  569. p->State.Pos += (DstSamples * p->State.Step) - (SrcSamples << 8);
  570. }
  571. void PCMReset(pcm_soft* p)
  572. {
  573. if (p)
  574. {
  575. p->State.Pos = 0;
  576. p->State.Dither[0] = 0;
  577. p->State.Dither[1] = 0;
  578. }
  579. }