Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "wavPlayer.h"
- #include<cstdio>
- extern "C" void AS_StereoDesinterleave(void *input, void *outputL, void *outputR, u32 samples);
- static void error(const char* c)
- {
- fprintf(stderr, "%s\n", c);
- // exit(1);
- }
- void AS_SetTimer(int freq)
- {
- if(freq) {
- TIMER0_DATA = 0x10000 - (0x1000000 / freq) * 2;
- TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1;
- TIMER1_DATA = 0;
- TIMER1_CR = TIMER_ENABLE | TIMER_CASCADE | TIMER_DIV_1;
- } else {
- TIMER0_DATA = 0;
- TIMER0_CR = 0;
- TIMER1_DATA = 0;
- TIMER1_CR = 0;
- }
- }
- void wavPlayer::stop()
- {
- soundKill(leftSoundID);
- soundKill(rightSoundID);
- stopped = true;
- }
- void wavPlayer::regenStreamAtPos(int pos, int len)
- {
- // fprintf(stdout, "str %x %x\n", pos, len);
- if(len == 0) return;
- //Now, read into the buffer
- u32 left = len*channels;
- left -= fread(mainbuffer, 1, left, fh);
- while(left != 0)
- {
- fseek(fh, 0, SEEK_SET);
- left -= fread(mainbuffer, 1, left, fh);
- }
- if(channels==1)
- {
- memcpy(audiobufferLeft+pos, mainbuffer, len);
- memcpy(audiobufferRight+pos, mainbuffer, len);
- }
- else
- {
- AS_StereoDesinterleave(mainbuffer, audiobufferLeft+pos, audiobufferRight+pos, len/2);
- }
- }
- void wavPlayer::update()
- {
- if(destroyed) return;
- //Find out how many new samples should we push to the buffer.
- int curtimer = TIMER1_DATA;
- int newdata = curtimer - prevtimer;
- if(newdata < 0)
- newdata += 65536;
- newdata *= 2; //samples are 16bit
- printf("\x1b[5;1HBUFFER: %3d %% ", 100-newdata*100/audiobuffer_size);
- if(newdata > audiobuffer_size) newdata = audiobuffer_size; //do noo overflow
- // if(newdata > 0x600) newdata = 0x600;
- printf("\x1b[4;1HFRAME: %3d %% ", newdata*100/audiobuffer_size);
- // fprintf(stdout, "nw %x\n", newdata);
- prevtimer = curtimer;
- if(soundcursor + newdata >= audiobuffer_size) //New chunks of data are split
- {
- regenStreamAtPos(soundcursor, audiobuffer_size-soundcursor);
- int remain = newdata - (audiobuffer_size-soundcursor);
- regenStreamAtPos(0, remain);
- // iprintf("!");
- }
- else
- {
- regenStreamAtPos(soundcursor, newdata);
- // iprintf(".");
- }
- soundcursor += newdata;
- if(soundcursor >= audiobuffer_size)
- soundcursor -= audiobuffer_size;
- }
- wavPlayer::wavPlayer(const char* filename)
- {
- int err;
- stopped = false;
- fh = fopen(filename, "rb");
- rate = 32000;
- channels = 2;
- audiobuffer_size = 8192*4;
- audiobufferLeft = new u8[audiobuffer_size];
- audiobufferRight = new u8[audiobuffer_size];
- mainbuffer_size = audiobuffer_size*channels;
- mainbuffer = new u8[mainbuffer_size];
- memset(audiobufferLeft, 0, audiobuffer_size);
- memset(audiobufferRight, 0, audiobuffer_size);
- memset(mainbuffer, 0, mainbuffer_size);
- fprintf(stderr, "main buffersize %i \n", mainbuffer_size);
- fprintf(stderr, "audio buffersize %i \n", audiobuffer_size);
- leftSoundID = soundPlaySample(audiobufferLeft, SoundFormat_16Bit, audiobuffer_size, rate, 127, 0, true, 0);
- rightSoundID = soundPlaySample(audiobufferRight, SoundFormat_16Bit, audiobuffer_size, rate, 127, 127, true, 0);
- AS_SetTimer(rate);
- soundcursor = 0;
- prevtimer = 0;
- destroyed = false;
- }
- wavPlayer::~wavPlayer()
- {
- destroyed = true;
- fclose(fh);
- delete[] audiobufferLeft;
- delete[] audiobufferRight;
- delete[] mainbuffer;
- AS_SetTimer(0);
- }
- // desinterleave a stereo source (thanks to Thoduv for the code)
- asm (
- "@--------------------------------------------------------------------------------------\n"
- " .text \n"
- " .arm \n"
- " \n"
- "@ desinterleave an mp3 stereo source \n"
- "@ r0 = interleaved data, r1 = left, r2 = right, r3 = len \n"
- " \n"
- " .global AS_StereoDesinterleave \n"
- " \n"
- "AS_StereoDesinterleave: \n"
- " stmfd sp!, {r4-r11} \n"
- " \n"
- "_loop: \n"
- " \n"
- " ldmia r0!, {r4-r12} \n"
- " \n"
- " strh r4, [r1], #2 \n"
- " mov r4, r4, lsr #16 \n"
- " strh r4, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r5, [r1], #2 \n"
- " mov r5, r5, lsr #16 \n"
- " strh r5, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r6, [r1], #2 \n"
- " mov r6, r6, lsr #16 \n"
- " strh r6, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r7, [r1], #2 \n"
- " mov r7, r7, lsr #16 \n"
- " strh r7, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r8, [r1], #2 \n"
- " mov r8, r8, lsr #16 \n"
- " strh r8, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r9, [r1], #2 \n"
- " mov r9, r9, lsr #16 \n"
- " strh r9, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r10, [r1], #2 \n"
- " mov r10, r10, lsr #16 \n"
- " strh r10, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r11, [r1], #2 \n"
- " mov r11, r11, lsr #16 \n"
- " strh r11, [r2], #2 \n"
- " subs r3, #1 \n"
- " beq _done \n"
- " \n"
- " strh r12, [r1], #2 \n"
- " mov r12, r12, lsr #16 \n"
- " strh r12, [r2], #2 \n"
- " subs r3, #1 \n"
- " bne _loop \n"
- "_done: \n"
- " \n"
- " ldmia sp!, {r4-r11} \n"
- " bx lr \n"
- "@--------------------------------------------------------------------------------------\n"
- );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement