From 4db3e8965270dfe813a14c5ee9bcd0b645eb2edf Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Thu, 1 Sep 2011 12:15:43 +0000 Subject: Shuffle some functions around so that interfacing with playback.c in particular isn't required. Though playback does finish the audio init, pcm doesn't care who does it. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30403 a1c6a512-1295-4272-9138-f99709370657 --- firmware/pcm.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'firmware/pcm.c') diff --git a/firmware/pcm.c b/firmware/pcm.c index c2ebc67687..b0a91fb64e 100644 --- a/firmware/pcm.c +++ b/firmware/pcm.c @@ -43,6 +43,7 @@ * Semi-private - * pcm_play_get_more_callback * pcm_play_dma_init + * pcm_play_dma_postinit * pcm_play_dma_start * pcm_play_dma_stop * pcm_play_dma_pause @@ -79,6 +80,9 @@ * */ +/* 'true' when all stages of pcm initialization have completed */ +static bool pcm_is_ready = false; + /* the registered callback function to ask for more mp3 data */ static pcm_play_callback_type pcm_callback_for_more SHAREDBSS_ATTR = NULL; void (* pcm_play_dma_started)(void) SHAREDBSS_ATTR = NULL; @@ -105,6 +109,12 @@ static void pcm_play_stopped(void) pcm_playing = false; } +static void pcm_wait_for_init(void) +{ + while (!pcm_is_ready) + sleep(0); +} + /** * Perform peak calculation on a buffer of packed 16-bit samples. * @@ -230,6 +240,23 @@ void pcm_init(void) pcm_play_dma_init(); } +/* Finish delayed init */ +void pcm_postinit(void) +{ + logf("pcm_postinit"); + + logf(" pcm_play_dma_postinit"); + + pcm_play_dma_postinit(); + + pcm_is_ready = true; +} + +bool pcm_is_initialized(void) +{ + return pcm_is_ready; +} + /* Common code to pcm_play_data and pcm_play_pause */ static void pcm_play_data_start(unsigned char *start, size_t size) { @@ -402,6 +429,8 @@ void pcm_apply_settings(void) { logf("pcm_apply_settings"); + pcm_wait_for_init(); + if (pcm_sampr != pcm_curr_sampr) { logf(" pcm_dma_apply_settings"); @@ -487,6 +516,8 @@ void pcm_init_recording(void) { logf("pcm_init_recording"); + pcm_wait_for_init(); + /* Stop the beasty before attempting recording */ mixer_reset(); -- cgit v1.2.3