Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/arm7SndMod/source/main.c b/arm7SndMod/source/main.c
- index 6e606d3..3bd525e 100644
- --- a/arm7SndMod/source/main.c
- +++ b/arm7SndMod/source/main.c
- @@ -23,7 +23,7 @@ void FifoMsgHandler(int num_bytes, void *userdata)
- case FIFO_AUDIO_START:
- if(channels <=2 && channels > 0) {
- for(i=0; i<channels; i++) {
- - SCHANNEL_TIMER(i) = SOUND_FREQ((u16)(msg.property));
- + SCHANNEL_TIMER(i) = SOUND_FREQ((int)msg.property&0xFFFF);
- SCHANNEL_SOURCE(i) = (u32)(msg.buffer+msg.bufLen*i*2);
- SCHANNEL_LENGTH(i) = msg.bufLen/2; // length is counted in words, sample is halfword
- SCHANNEL_REPEAT_POINT(i) = 0;
- diff --git a/codecs/flac/source/flac.c b/codecs/flac/source/flac.c
- index 2072a44..2a39c9c 100644
- --- a/codecs/flac/source/flac.c
- +++ b/codecs/flac/source/flac.c
- @@ -1,14 +1,16 @@
- #if HAVE_CONFIG_H
- #include <config.h>
- #endif
- +#include <string.h>
- #include <stdio.h>
- +#include <stdlib.h>
- #include "FLAC/stream_decoder.h"
- #include "flac.h"
- typedef struct {
- - const FLAC__Frame *frame;
- - const FLAC__int32 * const *buffer;
- - int pos;
- + const FLAC__Frame *frame;
- + const FLAC__int32 * const *buffer;
- + int pos;
- } FLACinfo;
- FLAC__StreamDecoder *decoder = NULL;
- @@ -21,139 +23,154 @@ static int bps = 0; //bits per sample
- FILE * fp;
- static FLAC__StreamDecoderWriteStatus write_callback(
- - const FLAC__StreamDecoder *decoder,
- - const FLAC__Frame *frame,
- - const FLAC__int32 * const buffer[],
- - void *client_data);
- + const FLAC__StreamDecoder *decoder,
- + const FLAC__Frame *frame,
- + const FLAC__int32 * const buffer[],
- + void *client_data);
- static void metadata_callback(
- - const FLAC__StreamDecoder *decoder,
- - const FLAC__StreamMetadata *metadata,
- - void *client_data);
- + const FLAC__StreamDecoder *decoder,
- + const FLAC__StreamMetadata *metadata,
- + void *client_data);
- static void error_callback(const FLAC__StreamDecoder *decoder,
- - FLAC__StreamDecoderErrorStatus status,
- - void *client_data);
- + FLAC__StreamDecoderErrorStatus status,
- + void *client_data);
- int openFile(const char * name)
- {
- - FLAC__StreamDecoderInitStatus init_status;
- + FLAC__StreamDecoderInitStatus init_status;
- - finfo.frame = NULL;
- - finfo.buffer = NULL;
- - finfo.pos = 0;
- + finfo.frame = NULL;
- + finfo.buffer = NULL;
- + finfo.pos = 0;
- - if((decoder = FLAC__stream_decoder_new()) == NULL)
- - return 0;
- + if((decoder = FLAC__stream_decoder_new()) == NULL)
- + return 0;
- - init_status = FLAC__stream_decoder_init_file(
- - decoder, name,
- - write_callback, metadata_callback, error_callback,
- - NULL);
- - if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
- - return 0;
- + init_status = FLAC__stream_decoder_init_file(
- + decoder, name,
- + write_callback, metadata_callback, error_callback,
- + NULL);
- + if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
- + return 0;
- - return FLAC__stream_decoder_process_until_end_of_metadata(decoder);
- + return FLAC__stream_decoder_process_until_end_of_metadata(decoder);
- }
- -int getSampleRate(void) {
- - return sample_rate;
- +int getSampleRate(void)
- +{
- + return sample_rate;
- }
- -int getnChannels(void) {
- - return channels;
- +int getnChannels(void)
- +{
- + return (channels);// | (1<<16));
- }
- -int seekPercentage(int perc) {
- - return 0;
- +int seekPercentage(int perc)
- +{
- + return 0;
- }
- -int getPercentage(void) {
- - return 0;
- +int getPercentage(void)
- +{
- + return 0;
- }
- -void freeDecoder(void) {
- - FLAC__stream_decoder_delete(decoder);
- - decoder = NULL;
- +void freeDecoder(void)
- +{
- + FLAC__stream_decoder_delete(decoder);
- + decoder = NULL;
- }
- -int decSamples(int length, short * destBuf) {
- - int decoded = 0;
- - FLAC__bool success = false;
- - FLAC__StreamDecoderState state;
- -
- - if(length <= 0)
- - return 0;
- -
- - state = FLAC__stream_decoder_get_state(decoder);
- - if(state == FLAC__STREAM_DECODER_END_OF_STREAM
- - || state == FLAC__STREAM_DECODER_ABORTED)
- - return -1;
- -
- - while(decoded < length) {
- - if(finfo.frame == NULL || finfo.pos == finfo.frame->header.blocksize) {
- - success = FLAC__stream_decoder_process_single(decoder);
- - if(success == false)
- - return -1;
- - state = FLAC__stream_decoder_get_state(decoder);
- - if(state == FLAC__STREAM_DECODER_END_OF_STREAM
- - || state == FLAC__STREAM_DECODER_ABORTED)
- - return decoded;
- - }
- -
- - for(;
- - decoded < length && finfo.pos < finfo.frame->header.blocksize;
- - finfo.pos++, decoded++) {
- - /* write to the buffer here; convert from BE to LE */
- - destBuf[decoded*2] = finfo.buffer[0][finfo.pos];
- - destBuf[decoded*2+1] = finfo.buffer[1][finfo.pos];
- - }
- - }
- -
- - return decoded;
- +int decSamples(int length, short * destBuf)
- +{
- + int decoded = 0;
- + FLAC__bool success = false;
- + FLAC__StreamDecoderState state;
- +
- + if(length <= 0)
- + return 0;
- +
- + state = FLAC__stream_decoder_get_state(decoder);
- + if(state == FLAC__STREAM_DECODER_END_OF_STREAM
- + || state == FLAC__STREAM_DECODER_ABORTED)
- + return -1;
- +
- + while(decoded < length) {
- + if(finfo.frame == NULL || finfo.pos == finfo.frame->header.blocksize) {
- + success = FLAC__stream_decoder_process_single(decoder);
- + if(success == false)
- + return -1;
- + state = FLAC__stream_decoder_get_state(decoder);
- + if(state == FLAC__STREAM_DECODER_END_OF_STREAM
- + || state == FLAC__STREAM_DECODER_ABORTED)
- + return decoded;
- + }
- +
- + int toCopy = (length-decoded);
- +
- + if(toCopy + finfo.pos > finfo.frame->header.blocksize){
- + toCopy = finfo.frame->header.blocksize - finfo.pos;
- + }
- +
- + memcpy(destBuf, &finfo.buffer[0][finfo.pos], toCopy*2);
- + memcpy(&destBuf[length], &finfo.buffer[1][finfo.pos], toCopy*2);
- + decoded += toCopy;
- + finfo.pos+= toCopy;
- + destBuf +=toCopy;
- + }
- + return decoded;
- }
- -FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) {
- - if(total_samples == 0) {
- - fprintf(stderr, "No samples to decode!\n");
- - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
- - }
- - if(channels != 2 || bps != 16) {
- - fprintf(stderr, "Not stereo 16-bit!\n");
- - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
- - }
- -
- - finfo.frame = frame;
- - finfo.buffer = buffer;
- - finfo.pos = 0;
- -
- - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
- +FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
- +{
- + if(total_samples == 0) {
- + fprintf(stderr, "No samples to decode!\n");
- + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
- + }
- + if(channels != 2 || bps != 16) {
- + fprintf(stderr, "Not stereo 16-bit!\n");
- + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
- + }
- +
- + finfo.frame = frame;
- + finfo.buffer = buffer;
- + finfo.pos = 0;
- +
- + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
- }
- -void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) {
- - if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
- - /* save for later */
- - total_samples = metadata->data.stream_info.total_samples;
- - sample_rate = metadata->data.stream_info.sample_rate;
- - channels = metadata->data.stream_info.channels;
- - bps = metadata->data.stream_info.bits_per_sample;
- - }
- +void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
- +{
- + if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
- + /* save for later */
- + total_samples = metadata->data.stream_info.total_samples;
- + sample_rate = metadata->data.stream_info.sample_rate;
- + channels = metadata->data.stream_info.channels;
- + bps = metadata->data.stream_info.bits_per_sample;
- + }
- }
- -void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) {
- - char *err;
- - switch(status) {
- - case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
- - err = "Lost sync"; break;
- - case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
- - err = "Bad header"; break;
- - case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
- - err = "Frame CRC mismatch"; break;
- - case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:
- - err = "Unparseable stream"; break;
- - default:
- - err = "???";
- - }
- -
- - fprintf(stderr, "error: %s\n", err);
- +void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
- +{
- + char *err;
- + switch(status) {
- + case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
- + err = "Lost sync";
- + break;
- + case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
- + err = "Bad header";
- + break;
- + case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
- + err = "Frame CRC mismatch";
- + break;
- + case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:
- + err = "Unparseable stream";
- + break;
- + default:
- + err = "???";
- + }
- +
- + fprintf(stderr, "error: %s\n", err);
- }
- -
- diff --git a/source/SndStream.arm.c b/source/SndStream.arm.c
- index e03521e..c6ee663 100644
- --- a/source/SndStream.arm.c
- +++ b/source/SndStream.arm.c
- @@ -91,7 +91,7 @@ int updateStream(CODEC_INTERFACE * cdc)
- return 0;
- }
- if(ret) {
- - copySamples(workBuf.buffer, 1, ret);
- + copySamples(workBuf.buffer, 0 , ret);
- smpNc -= ret;
- }
- @@ -109,7 +109,7 @@ void preFill(CODEC_INTERFACE * cdc)
- if(ret<=0) {
- break;
- }
- - copySamples(workBuf.buffer, 1, ret);
- + copySamples(workBuf.buffer, 0, ret);
- smpNc -=ret;
- }
- }
- @@ -131,10 +131,7 @@ void deFragReadbuf(unsigned char * readBuf, unsigned char ** readOff, int dataLe
- void copySamples(short * inBuf, int deinterleave, int samples)
- {
- int toEnd = ((outBuf.bufOff + samples) > STREAM_BUF_SIZE? STREAM_BUF_SIZE - outBuf.bufOff : samples);
- -
- - DC_FlushAll();
- - FeOS_DrainWriteBuffer();
- -
- + int totalSamps = samples;
- copy:
- if(toEnd) {
- @@ -143,7 +140,7 @@ copy:
- //. Right channel
- case 2:
- if(!deinterleave)
- - memcpy(&outBuf.buffer[STREAM_BUF_SIZE+outBuf.bufOff], &inBuf[toEnd], toEnd*2);
- + memcpy(&outBuf.buffer[STREAM_BUF_SIZE+outBuf.bufOff], &inBuf[totalSamps], toEnd*2);
- // has to be stereo
- else {
- _deInterleave(inBuf, &outBuf.buffer[outBuf.bufOff], toEnd);
- @@ -156,15 +153,20 @@ copy:
- }
- }
- -
- samples -= toEnd;
- if(samples) {
- outBuf.bufOff = 0;
- - inBuf += toEnd*nChans;
- + if(!deinterleave && nChans == 2)
- + inBuf+=toEnd;
- + else
- + inBuf += toEnd*nChans;
- toEnd = samples;
- goto copy;
- }
- +
- outBuf.bufOff += toEnd;
- -
- +
- + DC_FlushAll();
- + FeOS_DrainWriteBuffer();
- }
- diff --git a/source/main.c b/source/main.c
- index 648d560..119df94 100644
- --- a/source/main.c
- +++ b/source/main.c
- @@ -54,7 +54,7 @@ int main(int argc, char ** argv)
- int i;
- initSoundStreamer();
- - if(argc == 1)
- + /*if(argc == 1)
- path = pickFile("/", filter, compar);
- else
- path = strdup(argv[1]);
- @@ -71,9 +71,9 @@ int main(int argc, char ** argv)
- free(path);
- return 0;
- }
- -
- - startStream(&codec, type, path);
- -
- + */
- + //startStream(&codec, type, path);
- + startStream(&codec, "flac", "sample.flac");
- while(1) {
- FeOS_WaitForVBlank();
- if(!updateStream(&codec)) {
Add Comment
Please, Sign In to add comment