pcmbuf: moved some functions around, no functional changes yet
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23565 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
487d088e12
commit
b6f15f2c95
2 changed files with 79 additions and 79 deletions
156
apps/pcmbuf.c
156
apps/pcmbuf.c
|
@ -41,14 +41,6 @@
|
|||
#include "dsp.h"
|
||||
#include "thread.h"
|
||||
|
||||
/* Clip sample to signed 16 bit range */
|
||||
static inline int32_t clip_sample_16(int32_t sample)
|
||||
{
|
||||
if ((int16_t)sample != sample)
|
||||
sample = 0x7fff ^ (sample >> 31);
|
||||
return sample;
|
||||
}
|
||||
|
||||
#define PCMBUF_TARGET_CHUNK 32768 /* This is the target fill size of chunks
|
||||
on the pcm buffer */
|
||||
#define PCMBUF_MINAVG_CHUNK 24576 /* This is the minimum average size of
|
||||
|
@ -142,7 +134,6 @@ extern unsigned int codec_thread_id;
|
|||
#define LOW_DATA(quarter_secs) \
|
||||
(pcmbuf_unplayed_bytes < NATIVE_FREQUENCY * quarter_secs)
|
||||
|
||||
static bool pcmbuf_flush_fillpos(void);
|
||||
static void pcmbuf_finish_track_change(void);
|
||||
#ifdef HAVE_CROSSFADE
|
||||
static void crossfade_start(void);
|
||||
|
@ -152,6 +143,7 @@ static bool pcmbuf_crossfade_init(bool manual_skip);
|
|||
static void pcmbuf_finish_crossfade_enable(void);
|
||||
static bool pcmbuf_is_crossfade_enabled(void);
|
||||
|
||||
|
||||
/**************************************/
|
||||
|
||||
/* define this to show detailed pcmbufdesc usage information on the sim console */
|
||||
|
@ -253,6 +245,75 @@ static void pcmbuf_under_watermark(bool under)
|
|||
}
|
||||
}
|
||||
|
||||
/* This is really just part of pcmbuf_flush_fillpos, but is easier to keep
|
||||
* in a separate function for the moment */
|
||||
static inline void pcmbuf_add_chunk(void)
|
||||
{
|
||||
register size_t size = audiobuffer_fillpos;
|
||||
/* Grab the next description to write, and change the write pointer */
|
||||
register struct pcmbufdesc *pcmbuf_current = pcmbuf_write;
|
||||
pcmbuf_write = pcmbuf_current->link;
|
||||
/* Fill in the values in the new buffer chunk */
|
||||
pcmbuf_current->addr = &audiobuffer[audiobuffer_pos];
|
||||
pcmbuf_current->size = size;
|
||||
pcmbuf_current->end_of_track = end_of_track;
|
||||
pcmbuf_current->link = NULL;
|
||||
end_of_track = false; /* This is single use only */
|
||||
if (pcmbuf_read != NULL) {
|
||||
if (pcmbuf_flush)
|
||||
{
|
||||
pcmbuf_write_end->link = pcmbuf_read->link;
|
||||
pcmbuf_read->link = pcmbuf_current;
|
||||
while (pcmbuf_write_end->link)
|
||||
{
|
||||
pcmbuf_write_end = pcmbuf_write_end->link;
|
||||
pcmbuf_unplayed_bytes -= pcmbuf_write_end->size;
|
||||
}
|
||||
pcmbuf_flush = false;
|
||||
}
|
||||
/* If there is already a read buffer setup, add to it */
|
||||
else
|
||||
pcmbuf_read_end->link = pcmbuf_current;
|
||||
} else {
|
||||
/* Otherwise create the buffer */
|
||||
pcmbuf_read = pcmbuf_current;
|
||||
}
|
||||
/* This is now the last buffer to read */
|
||||
pcmbuf_read_end = pcmbuf_current;
|
||||
|
||||
/* Update bytes counters */
|
||||
pcmbuf_unplayed_bytes += size;
|
||||
|
||||
audiobuffer_pos += size;
|
||||
if (audiobuffer_pos >= pcmbuf_size)
|
||||
audiobuffer_pos -= pcmbuf_size;
|
||||
|
||||
audiobuffer_fillpos = 0;
|
||||
DISPLAY_DESC("add_chunk");
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit samples waiting to the pcm buffer.
|
||||
*/
|
||||
static bool pcmbuf_flush_fillpos(void)
|
||||
{
|
||||
if (audiobuffer_fillpos) {
|
||||
/* Never use the last buffer descriptor */
|
||||
while (pcmbuf_write == pcmbuf_write_end) {
|
||||
/* If this happens, something is being stupid */
|
||||
if (!pcm_is_playing()) {
|
||||
logf("pcmbuf_flush_fillpos error");
|
||||
pcmbuf_play_start();
|
||||
}
|
||||
/* Let approximately one chunk of data playback */
|
||||
sleep(HZ*PCMBUF_TARGET_CHUNK/(NATIVE_FREQUENCY*4));
|
||||
}
|
||||
pcmbuf_add_chunk();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool prepare_insert(size_t length)
|
||||
{
|
||||
if (low_latency_mode)
|
||||
|
@ -344,75 +405,6 @@ void pcmbuf_write_complete(int count)
|
|||
}
|
||||
}
|
||||
|
||||
/* This is really just part of pcmbuf_flush_fillpos, but is easier to keep
|
||||
* in a separate function for the moment */
|
||||
static inline void pcmbuf_add_chunk(void)
|
||||
{
|
||||
register size_t size = audiobuffer_fillpos;
|
||||
/* Grab the next description to write, and change the write pointer */
|
||||
register struct pcmbufdesc *pcmbuf_current = pcmbuf_write;
|
||||
pcmbuf_write = pcmbuf_current->link;
|
||||
/* Fill in the values in the new buffer chunk */
|
||||
pcmbuf_current->addr = &audiobuffer[audiobuffer_pos];
|
||||
pcmbuf_current->size = size;
|
||||
pcmbuf_current->end_of_track = end_of_track;
|
||||
pcmbuf_current->link = NULL;
|
||||
end_of_track = false; /* This is single use only */
|
||||
if (pcmbuf_read != NULL) {
|
||||
if (pcmbuf_flush)
|
||||
{
|
||||
pcmbuf_write_end->link = pcmbuf_read->link;
|
||||
pcmbuf_read->link = pcmbuf_current;
|
||||
while (pcmbuf_write_end->link)
|
||||
{
|
||||
pcmbuf_write_end = pcmbuf_write_end->link;
|
||||
pcmbuf_unplayed_bytes -= pcmbuf_write_end->size;
|
||||
}
|
||||
pcmbuf_flush = false;
|
||||
}
|
||||
/* If there is already a read buffer setup, add to it */
|
||||
else
|
||||
pcmbuf_read_end->link = pcmbuf_current;
|
||||
} else {
|
||||
/* Otherwise create the buffer */
|
||||
pcmbuf_read = pcmbuf_current;
|
||||
}
|
||||
/* This is now the last buffer to read */
|
||||
pcmbuf_read_end = pcmbuf_current;
|
||||
|
||||
/* Update bytes counters */
|
||||
pcmbuf_unplayed_bytes += size;
|
||||
|
||||
audiobuffer_pos += size;
|
||||
if (audiobuffer_pos >= pcmbuf_size)
|
||||
audiobuffer_pos -= pcmbuf_size;
|
||||
|
||||
audiobuffer_fillpos = 0;
|
||||
DISPLAY_DESC("add_chunk");
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit samples waiting to the pcm buffer.
|
||||
*/
|
||||
static bool pcmbuf_flush_fillpos(void)
|
||||
{
|
||||
if (audiobuffer_fillpos) {
|
||||
/* Never use the last buffer descriptor */
|
||||
while (pcmbuf_write == pcmbuf_write_end) {
|
||||
/* If this happens, something is being stupid */
|
||||
if (!pcm_is_playing()) {
|
||||
logf("pcmbuf_flush_fillpos error");
|
||||
pcmbuf_play_start();
|
||||
}
|
||||
/* Let approximately one chunk of data playback */
|
||||
sleep(HZ*PCMBUF_TARGET_CHUNK/(NATIVE_FREQUENCY*4));
|
||||
}
|
||||
pcmbuf_add_chunk();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* Init */
|
||||
|
||||
|
@ -665,6 +657,14 @@ static void pcmbuf_finish_track_change(void)
|
|||
|
||||
/* Crossfade */
|
||||
|
||||
/* Clip sample to signed 16 bit range */
|
||||
static inline int32_t clip_sample_16(int32_t sample)
|
||||
{
|
||||
if ((int16_t)sample != sample)
|
||||
sample = 0x7fff ^ (sample >> 31);
|
||||
return sample;
|
||||
}
|
||||
|
||||
/**
|
||||
* Low memory targets don't have crossfade, so don't compile crossfade
|
||||
* specific code in order to save some memory. */
|
||||
|
|
|
@ -52,7 +52,7 @@ int pcmbuf_used_descs(void);
|
|||
unsigned char *pcmbuf_get_meminfo(size_t *length);
|
||||
#endif
|
||||
|
||||
/* misc */
|
||||
/* Misc */
|
||||
bool pcmbuf_is_lowdata(void);
|
||||
void pcmbuf_set_low_latency(bool state);
|
||||
unsigned long pcmbuf_get_latency(void);
|
||||
|
|
Loading…
Reference in a new issue