pcmbuf cleanup

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23649 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jeffrey Goode 2009-11-16 04:42:34 +00:00
parent 3114f2c6db
commit ba9280d5f4
3 changed files with 25 additions and 29 deletions

View File

@ -50,11 +50,14 @@
#define PCMBUF_MIX_CHUNK 8192 /* This is the maximum size of one packet
for mixing (crossfade or voice) */
/* number of bytes played per second (sample rate * 2 channels * 2 bytes/sample) */
#define BYTERATE (NATIVE_FREQUENCY * 4)
#if MEMORYSIZE > 2
/* Keep watermark high for iPods at least (2s) */
#define PCMBUF_WATERMARK (NATIVE_FREQUENCY * 4 * 2)
#define PCMBUF_WATERMARK (BYTERATE * 2)
#else
#define PCMBUF_WATERMARK (NATIVE_FREQUENCY * 1) /* 0.25 seconds */
#define PCMBUF_WATERMARK (BYTERATE / 4) /* 0.25 seconds */
#endif
/* Structure we can use to queue pcm chunks in memory to be played
@ -137,7 +140,7 @@ extern unsigned int codec_thread_id;
#ifdef HAVE_CROSSFADE
static void crossfade_start(void);
static void write_to_crossfade(char *buf, size_t length);
static void write_to_crossfade(size_t length);
static void pcmbuf_finish_crossfade_enable(void);
#endif
@ -198,7 +201,7 @@ static void commit_chunk(bool flush_next_time)
pcmbuf_play_start();
}
/* Let approximately one chunk of data playback */
sleep(HZ*PCMBUF_TARGET_CHUNK/(NATIVE_FREQUENCY*4));
sleep(HZ * PCMBUF_TARGET_CHUNK / BYTERATE);
}
/* commit the chunk */
@ -398,7 +401,7 @@ void pcmbuf_write_complete(int count)
size_t length = (size_t)(unsigned int)count << 2;
#ifdef HAVE_CROSSFADE
if (crossfade_active)
write_to_crossfade(fadebuf, length);
write_to_crossfade(length);
else
#endif
{
@ -441,7 +444,7 @@ static size_t get_next_required_pcmbuf_size(void)
seconds += 2;
#endif
logf("pcmbuf len: %ld", (long)seconds);
return seconds * (NATIVE_FREQUENCY*4); /* 2 channels + 2 bytes/sample */
return seconds * BYTERATE;
}
/* Initialize the pcmbuffer the structure looks like this:
@ -575,9 +578,9 @@ static void pcmbuf_pcm_callback(unsigned char** start, size_t* size)
/* Take the finished chunk out of circulation */
read_chunk = pcmbuf_current->link;
/* if during a track transition, update the elapsed time */
/* if during a track transition, update the elapsed time in ms */
if (track_transition)
audio_pcmbuf_position_callback(last_chunksize);
audio_pcmbuf_position_callback(last_chunksize * 1000 / BYTERATE);
/* if last chunk in the track, stop updates and notify audio thread */
if (pcmbuf_current->end_of_track)
@ -781,10 +784,8 @@ static void crossfade_start(void)
crossfade_sample = 0;
/* Get fade out info from settings. */
fade_out_delay =
NATIVE_FREQUENCY * global_settings.crossfade_fade_out_delay * 4;
fade_out_rem =
NATIVE_FREQUENCY * global_settings.crossfade_fade_out_duration * 4;
fade_out_delay = global_settings.crossfade_fade_out_delay * BYTERATE;
fade_out_rem = global_settings.crossfade_fade_out_duration * BYTERATE;
crossfade_need = fade_out_delay + fade_out_rem;
if (crossfade_rem > crossfade_need)
@ -833,7 +834,7 @@ static void crossfade_start(void)
while (fade_out_rem > 0)
{
/* Each 1/10 second of audio will have the same fade applied */
size_t block_rem = MIN(NATIVE_FREQUENCY * 4 / 10, fade_out_rem);
size_t block_rem = MIN(BYTERATE / 10, fade_out_rem);
int factor = (fade_out_rem << 8) / total_fade_out;
fade_out_rem -= block_rem;
@ -848,12 +849,10 @@ static void crossfade_start(void)
}
/* Initialize fade-in counters */
crossfade_fade_in_total =
NATIVE_FREQUENCY * global_settings.crossfade_fade_in_duration * 4;
crossfade_fade_in_total = global_settings.crossfade_fade_in_duration * BYTERATE;
crossfade_fade_in_rem = crossfade_fade_in_total;
fade_in_delay =
NATIVE_FREQUENCY * global_settings.crossfade_fade_in_delay * 4;
fade_in_delay = global_settings.crossfade_fade_in_delay * BYTERATE;
/* Find the right chunk and sample to start fading in */
fade_in_delay += crossfade_sample * 2;
@ -862,10 +861,11 @@ static void crossfade_start(void)
}
/* Perform fade-in of new track */
static void write_to_crossfade(char *buf, size_t length)
static void write_to_crossfade(size_t length)
{
if (length)
{
char *buf = fadebuf;
if (crossfade_fade_in_rem)
{
size_t samples;
@ -941,7 +941,7 @@ static void pcmbuf_finish_crossfade_enable(void)
pcmbuf_watermark = (crossfade_enabled && pcmbuf_size) ?
/* If crossfading, try to keep the buffer full other than 1 second */
(pcmbuf_size - (NATIVE_FREQUENCY * 4 * 1)) :
(pcmbuf_size - BYTERATE) :
/* Otherwise, just use the default */
PCMBUF_WATERMARK;
}
@ -1038,7 +1038,7 @@ void pcmbuf_write_voice_complete(int count)
{
mix_chunk = read_chunk->link;
/* Start 1/8s into the next chunk */
pcmbuf_mix_sample = NATIVE_FREQUENCY * 4 / 16;
pcmbuf_mix_sample = BYTERATE / 16;
}
if (!mix_chunk)
@ -1142,9 +1142,7 @@ void pcmbuf_set_low_latency(bool state)
unsigned long pcmbuf_get_latency(void)
{
/* Be careful how this calculation is rearranged, it's easy to overflow */
size_t bytes = pcmbuf_unplayed_bytes + pcm_get_bytes_waiting();
return bytes / 4 * 1000 / NATIVE_FREQUENCY;
return (pcmbuf_unplayed_bytes + pcm_get_bytes_waiting()) * 1000 / BYTERATE;
}
#ifndef HAVE_HARDWARE_BEEP
@ -1176,7 +1174,7 @@ void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude)
return;
/* Give 5ms clearance. */
bufstart += NATIVE_FREQUENCY * 4 / 200;
bufstart += BYTERATE / 200;
#ifdef HAVE_PCM_DMA_ADDRESS
/* Returned peak addresses are DMA addresses */

View File

@ -228,11 +228,9 @@ static void audio_stop_playback(void);
"elapsed" value of the previous (to the codec, but current to the
user/PCM/WPS) track, so that the progressbar reaches the end.
During that transition, the WPS will display othertrack_id3. */
void audio_pcmbuf_position_callback(size_t size)
void audio_pcmbuf_position_callback(unsigned int time)
{
/* This is called from an ISR, so be quick */
unsigned int time = size * 1000 / 4 / NATIVE_FREQUENCY +
othertrack_id3->elapsed;
time += othertrack_id3->elapsed;
if (time >= othertrack_id3->length)
{

View File

@ -71,7 +71,7 @@ enum
};
bool audio_restore_playback(int type); /* Restores the audio buffer to handle the requested playback */
size_t audio_get_filebuflen(void);
void audio_pcmbuf_position_callback(size_t size) ICODE_ATTR;
void audio_pcmbuf_position_callback(unsigned int time) ICODE_ATTR;
void audio_post_track_change(bool pcmbuf);
int get_audio_hid(void);
int *get_codec_hid(void);