Advertisement
Guest User

Untitled

a guest
Dec 25th, 2011
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.16 KB | None | 0 0
  1. #include "wavPlayer.h"
  2. #include<cstdio>
  3.  
  4. extern "C" void AS_StereoDesinterleave(void *input, void *outputL, void *outputR, u32 samples);
  5.  
  6. static void error(const char* c)
  7. {
  8.     fprintf(stderr, "%s\n", c);
  9. //  exit(1);
  10. }
  11.  
  12. void AS_SetTimer(int freq)
  13. {
  14.     if(freq) {
  15.         TIMER0_DATA = 0x10000 - (0x1000000 / freq) * 2;
  16.         TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1;
  17.         TIMER1_DATA = 0;
  18.         TIMER1_CR = TIMER_ENABLE | TIMER_CASCADE | TIMER_DIV_1;
  19.     } else {
  20.         TIMER0_DATA = 0;
  21.         TIMER0_CR = 0;
  22.         TIMER1_DATA = 0;
  23.         TIMER1_CR = 0;
  24.     }
  25. }
  26.  
  27. void wavPlayer::stop()
  28. {
  29.     soundKill(leftSoundID);
  30.     soundKill(rightSoundID);
  31.     stopped = true;
  32. }
  33.  
  34. void wavPlayer::regenStreamAtPos(int pos, int len)
  35. {
  36. //  fprintf(stdout, "str %x %x\n", pos, len);
  37.    
  38.     if(len == 0) return;
  39.    
  40.     //Now, read into the buffer
  41.     u32 left = len*channels;
  42.    
  43.     left -= fread(mainbuffer, 1, left, fh);
  44.     while(left != 0)
  45.     {
  46.         fseek(fh, 0, SEEK_SET);
  47.         left -= fread(mainbuffer, 1, left, fh);
  48.     }
  49.  
  50.     if(channels==1)
  51.     {
  52.         memcpy(audiobufferLeft+pos, mainbuffer, len);
  53.         memcpy(audiobufferRight+pos, mainbuffer, len);
  54.     }
  55.     else
  56.     {
  57.         AS_StereoDesinterleave(mainbuffer, audiobufferLeft+pos, audiobufferRight+pos, len/2);
  58.     }
  59. }
  60.  
  61. void wavPlayer::update()
  62. {
  63.     if(destroyed) return;
  64.    
  65.     //Find out how many new samples should we push to the buffer.
  66.     int curtimer = TIMER1_DATA;
  67.    
  68.     int newdata = curtimer - prevtimer;
  69.     if(newdata < 0)
  70.         newdata += 65536;
  71.    
  72.     newdata *= 2; //samples are 16bit
  73.    
  74.     printf("\x1b[5;1HBUFFER:  %3d %%        ", 100-newdata*100/audiobuffer_size);
  75.    
  76.     if(newdata > audiobuffer_size) newdata = audiobuffer_size; //do noo overflow
  77. //  if(newdata > 0x600)  newdata = 0x600;
  78.  
  79.     printf("\x1b[4;1HFRAME:  %3d %%        ", newdata*100/audiobuffer_size);
  80.    
  81. //  fprintf(stdout, "nw %x\n", newdata);
  82.    
  83.     prevtimer = curtimer;
  84.     if(soundcursor + newdata >= audiobuffer_size) //New chunks of data are split
  85.     {
  86.         regenStreamAtPos(soundcursor, audiobuffer_size-soundcursor);
  87.         int remain = newdata - (audiobuffer_size-soundcursor);
  88.         regenStreamAtPos(0, remain);
  89. //      iprintf("!");
  90.     }
  91.     else
  92.     {
  93.         regenStreamAtPos(soundcursor, newdata);
  94. //      iprintf(".");
  95.     }
  96.    
  97.     soundcursor += newdata;
  98.     if(soundcursor >= audiobuffer_size)
  99.         soundcursor -= audiobuffer_size;
  100. }
  101.  
  102. wavPlayer::wavPlayer(const char* filename)
  103. {
  104.     int err;
  105.     stopped = false;
  106.    
  107.     fh = fopen(filename, "rb");
  108.  
  109.     rate = 32000;
  110.     channels = 2;
  111.  
  112.     audiobuffer_size = 8192*4;
  113.     audiobufferLeft = new u8[audiobuffer_size];
  114.    
  115.     audiobufferRight = new u8[audiobuffer_size];
  116.     mainbuffer_size = audiobuffer_size*channels;
  117.     mainbuffer = new u8[mainbuffer_size];
  118.  
  119.     memset(audiobufferLeft, 0, audiobuffer_size);
  120.     memset(audiobufferRight, 0, audiobuffer_size);
  121.     memset(mainbuffer, 0, mainbuffer_size);
  122.     fprintf(stderr, "main buffersize %i \n", mainbuffer_size);
  123.     fprintf(stderr, "audio buffersize %i \n", audiobuffer_size);
  124.    
  125.     leftSoundID = soundPlaySample(audiobufferLeft, SoundFormat_16Bit, audiobuffer_size, rate, 127, 0, true, 0);
  126.     rightSoundID = soundPlaySample(audiobufferRight, SoundFormat_16Bit, audiobuffer_size, rate, 127, 127, true, 0);
  127.     AS_SetTimer(rate);
  128.    
  129.     soundcursor = 0;
  130.     prevtimer = 0;
  131.  
  132.     destroyed = false;
  133. }
  134.  
  135. wavPlayer::~wavPlayer()
  136. {
  137.     destroyed = true;
  138.     fclose(fh);
  139.     delete[] audiobufferLeft;
  140.     delete[] audiobufferRight;
  141.     delete[] mainbuffer;
  142.     AS_SetTimer(0);
  143. }
  144.  
  145.  
  146. // desinterleave a stereo source (thanks to Thoduv for the code)
  147. asm (
  148. "@--------------------------------------------------------------------------------------\n"
  149. "    .text                                                                              \n"
  150. "    .arm                                                                               \n"
  151. "                                                                                       \n"
  152. "@ desinterleave an mp3 stereo source                                                   \n"
  153. "@ r0 = interleaved data, r1 = left, r2 = right, r3 = len                               \n"
  154. "                                                                                       \n"
  155. "    .global AS_StereoDesinterleave                                                     \n"
  156. "                                                                                       \n"
  157. "AS_StereoDesinterleave:                                                                \n"
  158. "    stmfd sp!, {r4-r11}                                                                \n"
  159. "                                                                                       \n"
  160. "_loop:                                                                                 \n"
  161. "                                                                                       \n"
  162. "    ldmia r0!, {r4-r12}                                                                \n"
  163. "                                                                                       \n"
  164. "    strh r4, [r1], #2                                                                  \n"
  165. "    mov r4, r4, lsr #16                                                                \n"
  166. "    strh  r4, [r2], #2                                                                 \n"
  167. "    subs r3, #1                                                                        \n"
  168. "    beq _done                                                                          \n"
  169. "                                                                                       \n"
  170. "    strh r5, [r1], #2                                                                  \n"
  171. "    mov r5, r5, lsr #16                                                                \n"
  172. "    strh  r5, [r2], #2                                                                 \n"
  173. "    subs r3, #1                                                                        \n"
  174. "    beq _done                                                                          \n"
  175. "                                                                                       \n"
  176. "    strh r6, [r1], #2                                                                  \n"
  177. "    mov r6, r6, lsr #16                                                                \n"
  178. "    strh  r6, [r2], #2                                                                 \n"
  179. "    subs r3, #1                                                                        \n"
  180. "    beq _done                                                                          \n"
  181. "                                                                                       \n"
  182. "    strh r7, [r1], #2                                                                  \n"
  183. "    mov r7, r7, lsr #16                                                                \n"
  184. "    strh  r7, [r2], #2                                                                 \n"
  185. "    subs r3, #1                                                                        \n"
  186. "    beq _done                                                                          \n"
  187. "                                                                                       \n"
  188. "    strh r8, [r1], #2                                                                  \n"
  189. "    mov r8, r8, lsr #16                                                                \n"
  190. "    strh  r8, [r2], #2                                                                 \n"
  191. "    subs r3, #1                                                                        \n"
  192. "    beq _done                                                                          \n"
  193. "                                                                                       \n"
  194. "    strh r9, [r1], #2                                                                  \n"
  195. "    mov r9, r9, lsr #16                                                                \n"
  196. "    strh  r9, [r2], #2                                                                 \n"
  197. "    subs r3, #1                                                                        \n"
  198. "    beq _done                                                                          \n"
  199. "                                                                                       \n"
  200. "    strh r10, [r1], #2                                                                 \n"
  201. "    mov r10, r10, lsr #16                                                              \n"
  202. "    strh  r10, [r2], #2                                                                \n"
  203. "    subs r3, #1                                                                        \n"
  204. "    beq _done                                                                          \n"
  205. "                                                                                       \n"
  206. "    strh r11, [r1], #2                                                                 \n"
  207. "    mov r11, r11, lsr #16                                                              \n"
  208. "    strh  r11, [r2], #2                                                                \n"
  209. "    subs r3, #1                                                                        \n"
  210. "    beq _done                                                                          \n"
  211. "                                                                                       \n"
  212. "    strh r12, [r1], #2                                                                 \n"
  213. "    mov r12, r12, lsr #16                                                              \n"
  214. "    strh  r12, [r2], #2                                                                \n"
  215. "    subs r3, #1                                                                        \n"
  216. "    bne _loop                                                                          \n"
  217. "_done:                                                                                 \n"
  218. "                                                                                       \n"
  219. "    ldmia sp!, {r4-r11}                                                                \n"
  220. "    bx lr                                                                              \n"
  221. "@--------------------------------------------------------------------------------------\n"
  222. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement