summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/codecs.h12
-rw-r--r--apps/playback.c34
-rw-r--r--apps/playback.h2
-rw-r--r--firmware/export/pcm_playback.h6
-rw-r--r--firmware/pcm_playback.c35
5 files changed, 47 insertions, 42 deletions
diff --git a/apps/codecs.h b/apps/codecs.h
index c373bdb8ba..c50af3030e 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -139,24 +139,24 @@ struct codec_api {
int seek_time;
/* Returns buffer to malloc array. Only codeclib should need this. */
- void* (*get_codec_memory)(size_t *size);
+ void* (*get_codec_memory)(long *size);
/* Insert PCM data into audio buffer for playback. Playback will start
automatically. */
- bool (*audiobuffer_insert)(char *data, size_t length);
- bool (*audiobuffer_insert_split)(void *ch1, void *ch2, size_t length);
+ bool (*audiobuffer_insert)(char *data, long length);
+ bool (*audiobuffer_insert_split)(void *ch1, void *ch2, long length);
/* Set song position in WPS (value in ms). */
void (*set_elapsed)(unsigned int value);
/* Read next <size> amount bytes from file buffer to <ptr>.
Will return number of bytes read or 0 if end of file. */
- size_t (*read_filebuf)(void *ptr, size_t size);
+ long (*read_filebuf)(void *ptr, long size);
/* Request pointer to file buffer which can be used to read
<realsize> amount of data. <reqsize> tells the buffer system
how much data it should try to allocate. If <realsize> is 0,
end of file is reached. */
- void* (*request_buffer)(size_t *realsize, size_t reqsize);
+ void* (*request_buffer)(long *realsize, long reqsize);
/* Advance file buffer position by <amount> amount of bytes. */
- void (*advance_buffer)(size_t amount);
+ void (*advance_buffer)(long amount);
/* Advance file buffer to a pointer location inside file buffer. */
void (*advance_buffer_loc)(void *ptr);
/* Seek file buffer to position <newpos> beginning of file. */
diff --git a/apps/playback.c b/apps/playback.c
index 429141f759..5721e7c21b 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -145,7 +145,7 @@ static bool track_changed;
static int current_fd;
/* Information about how many bytes left on the buffer re-fill run. */
-static size_t fill_bytesleft;
+static long fill_bytesleft;
/* Track info structure about songs in the file buffer. */
static struct track_info tracks[MAX_TRACK];
@@ -172,7 +172,7 @@ int mp3_get_file_pos(void);
/* Simulator stubs. */
#ifdef SIMULATOR
-bool pcm_insert_buffer(char *buf, size_t length)
+bool pcm_insert_buffer(char *buf, long length)
{
(void)buf;
(void)length;
@@ -180,13 +180,13 @@ bool pcm_insert_buffer(char *buf, size_t length)
return true;
}
-void pcm_flush_buffer(size_t length)
+void pcm_flush_buffer(long length)
{
(void)length;
}
-void* pcm_request_buffer(size_t length, size_t *realsize)
+void* pcm_request_buffer(long length, long *realsize)
{
(void)length;
(void)realsize;
@@ -244,10 +244,10 @@ int ata_sleep(void)
}
#endif
-bool codec_audiobuffer_insert_callback(char *buf, size_t length)
+bool codec_audiobuffer_insert_callback(char *buf, long length)
{
char *dest;
- size_t realsize;
+ long realsize;
int factor;
int next_channel = 0;
int processed_length;
@@ -292,10 +292,10 @@ bool codec_audiobuffer_insert_callback(char *buf, size_t length)
}
bool codec_audiobuffer_insert_split_callback(void *ch1, void *ch2,
- size_t length)
+ long length)
{
char *dest;
- size_t realsize;
+ long realsize;
int factor;
int processed_length;
@@ -330,7 +330,7 @@ bool codec_audiobuffer_insert_split_callback(void *ch1, void *ch2,
return true;
}
-void* get_codec_memory_callback(size_t *size)
+void* get_codec_memory_callback(long *size)
{
*size = MALLOC_BUFSIZE;
return &audiobuf[0];
@@ -353,7 +353,7 @@ void codec_set_elapsed_callback(unsigned int value)
}
}
-size_t codec_filebuf_callback(void *ptr, size_t size)
+long codec_filebuf_callback(void *ptr, long size)
{
char *buf = (char *)ptr;
int copy_n;
@@ -389,9 +389,9 @@ size_t codec_filebuf_callback(void *ptr, size_t size)
return copy_n;
}
-void* codec_request_buffer_callback(size_t *realsize, size_t reqsize)
+void* codec_request_buffer_callback(long *realsize, long reqsize)
{
- size_t part_n;
+ long part_n;
if (ci.stop_codec || !playing) {
*realsize = 0;
@@ -423,7 +423,7 @@ void* codec_request_buffer_callback(size_t *realsize, size_t reqsize)
return (char *)&codecbuf[buf_ridx];
}
-void codec_advance_buffer_callback(size_t amount)
+void codec_advance_buffer_callback(long amount)
{
if ((int)amount > cur_ti->available + cur_ti->filerem)
amount = cur_ti->available + cur_ti->filerem;
@@ -457,7 +457,7 @@ void codec_advance_buffer_callback(size_t amount)
void codec_advance_buffer_loc_callback(void *ptr)
{
- size_t amount;
+ long amount;
amount = (int)ptr - (int)&codecbuf[buf_ridx];
codec_advance_buffer_callback(amount);
@@ -560,7 +560,7 @@ void yield_codecs(void)
void audio_fill_file_buffer(void)
{
- size_t i, size;
+ long i, size;
int rc;
if (current_fd < 0)
@@ -587,10 +587,10 @@ void audio_fill_file_buffer(void)
buf_widx -= codecbuflen;
i += rc;
tracks[track_widx].available += rc;
+ codecbufused += rc;
fill_bytesleft -= rc;
}
- codecbufused += i;
tracks[track_widx].filerem -= i;
tracks[track_widx].filepos += i;
/*logf("Filled:%d/%d", tracks[track_widx].available,
@@ -1176,7 +1176,7 @@ void audio_thread(void)
void codec_thread(void)
{
struct event ev;
- size_t codecsize;
+ long codecsize;
int status;
int wrap;
diff --git a/apps/playback.h b/apps/playback.h
index 672ddae440..f0ae9eae42 100644
--- a/apps/playback.h
+++ b/apps/playback.h
@@ -49,7 +49,7 @@ struct track_info {
struct mp3entry id3; /* TAG metadata */
struct mp3info mp3data; /* MP3 metadata */
char *codecbuf; /* Pointer to codec buffer */
- size_t codecsize; /* Codec length in bytes */
+ long codecsize; /* Codec length in bytes */
off_t filerem; /* Remaining bytes of file NOT in buffer */
off_t filesize; /* File total length */
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h
index 3fe60670b3..07e33e96bf 100644
--- a/firmware/export/pcm_playback.h
+++ b/firmware/export/pcm_playback.h
@@ -48,9 +48,9 @@ bool pcm_is_lowdata(void);
bool pcm_crossfade_init(void);
void audiobuffer_add_event(void (*event_handler)(void));
unsigned int audiobuffer_get_latency(void);
-bool pcm_insert_buffer(char *buf, size_t length);
-void pcm_flush_buffer(size_t length);
-void* pcm_request_buffer(size_t length, size_t *realsize);
+bool pcm_insert_buffer(char *buf, long length);
+void pcm_flush_buffer(long length);
+void* pcm_request_buffer(long length, long *realsize);
bool pcm_is_crossfade_enabled(void);
void pcm_crossfade_enable(bool on_off);
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 89e72c76a0..b0bdfbbb32 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -55,9 +55,9 @@ static bool pcm_paused;
static int pcm_freq = 0x6; /* 44.1 is default */
static char *audiobuffer;
-static size_t audiobuffer_pos;
-size_t audiobuffer_free;
-static size_t audiobuffer_fillpos;
+static long audiobuffer_pos;
+long audiobuffer_free;
+static long audiobuffer_fillpos;
static bool boost_mode;
static bool crossfade_enabled;
@@ -457,7 +457,7 @@ int crossfade(short *buf, const short *buf2, int length)
return size;
}
-inline static bool prepare_insert(size_t length)
+inline static bool prepare_insert(long length)
{
crossfade_start();
if (audiobuffer_free < length + audiobuffer_fillpos
@@ -476,7 +476,7 @@ inline static bool prepare_insert(size_t length)
return true;
}
-void* pcm_request_buffer(size_t length, size_t *realsize)
+void* pcm_request_buffer(long length, long *realsize)
{
void *ptr = NULL;
@@ -487,13 +487,15 @@ void* pcm_request_buffer(size_t length, size_t *realsize)
if (crossfade_active) {
*realsize = MIN(length, PCMBUF_GUARD);
+ //logf("cfb:%d/%d", *realsize, length);
ptr = &guardbuf[0];
} else {
*realsize = MIN(length, PCMBUF_SIZE - audiobuffer_pos
- audiobuffer_fillpos);
if (*realsize < length) {
+ //logf("gbr1:%d/%d", *realsize, length);
*realsize += MIN((long)(length - *realsize), PCMBUF_GUARD);
- //logf("gbr:%d/%d", *realsize, length);
+ //logf("gbr2:%d/%d", *realsize, length);
}
ptr = &audiobuffer[audiobuffer_pos + audiobuffer_fillpos];
}
@@ -501,16 +503,18 @@ void* pcm_request_buffer(size_t length, size_t *realsize)
return ptr;
}
-void pcm_flush_buffer(size_t length)
+void pcm_flush_buffer(long length)
{
int copy_n;
char *buf;
if (crossfade_active) {
+ //logf("cfbf");
buf = &guardbuf[0];
length = MIN(length, PCMBUF_GUARD);
while (length > 0 && crossfade_active) {
- copy_n = MIN(length, PCMBUF_SIZE - (unsigned int)crossfade_pos);
+ //logf("cfl:%d", length);
+ copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos);
copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos],
(const short *)buf, copy_n/2);
buf += copy_n;
@@ -521,7 +525,8 @@ void pcm_flush_buffer(size_t length)
}
while (length > 0) {
- copy_n = MIN(length, PCMBUF_SIZE - (unsigned)audiobuffer_pos);
+ //logf("cfl2:%d", length);
+ copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos);
memcpy(&audiobuffer[audiobuffer_pos], buf, copy_n);
audiobuffer_fillpos = copy_n;
buf += copy_n;
@@ -538,12 +543,12 @@ void pcm_flush_buffer(size_t length)
- audiobuffer_pos - audiobuffer_fillpos > 0)
return ;
- copy_n = MIN((long)(audiobuffer_fillpos - (PCMBUF_SIZE
- - audiobuffer_pos)), PCMBUF_GUARD);
+ copy_n = audiobuffer_fillpos - (PCMBUF_SIZE - audiobuffer_pos);
if (copy_n > 0) {
- //logf("guard buf used:%d", copy_n);
+ //logf("gbu:%d/%d/%d", copy_n, audiobuffer_fillpos, audiobuffer_pos);
audiobuffer_fillpos -= copy_n;
pcm_flush_fillpos();
+ copy_n = MIN(copy_n, PCMBUF_GUARD);
memcpy(&audiobuffer[0], &guardbuf[0], copy_n);
audiobuffer_fillpos = copy_n;
goto try_flush;
@@ -551,16 +556,16 @@ void pcm_flush_buffer(size_t length)
pcm_flush_fillpos();
}
-bool pcm_insert_buffer(char *buf, size_t length)
+bool pcm_insert_buffer(char *buf, long length)
{
- size_t copy_n = 0;
+ long copy_n = 0;
if (!prepare_insert(length))
return false;
while (length > 0) {
if (crossfade_active) {
- copy_n = MIN(length, PCMBUF_SIZE - (unsigned int)crossfade_pos);
+ copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos);
copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos],
(const short *)buf, copy_n/2);