diff options
Diffstat (limited to 'apps/plugins/mpegplayer/pcm_output.c')
| -rw-r--r-- | apps/plugins/mpegplayer/pcm_output.c | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/apps/plugins/mpegplayer/pcm_output.c b/apps/plugins/mpegplayer/pcm_output.c index fb7ff43..8db9531 100644 --- a/apps/plugins/mpegplayer/pcm_output.c +++ b/apps/plugins/mpegplayer/pcm_output.c @@ -23,6 +23,9 @@ #include "plugin.h" #include "mpegplayer.h" +/* PCM channel we're using */ +#define MPEG_PCM_CHANNEL PCM_MIXER_CHAN_PLAYBACK + /* Pointers */ /* Start of buffer */ @@ -217,24 +220,22 @@ bool pcm_output_empty(void) /* Flushes the buffer - clock keeps counting */ void pcm_output_flush(void) { - bool playing, paused; - rb->pcm_play_lock(); - playing = rb->pcm_is_playing(); - paused = rb->pcm_is_paused(); + enum channel_status status = rb->mixer_channel_status(MPEG_PCM_CHANNEL); /* Stop PCM to clear current buffer */ - if (playing) - rb->pcm_play_stop(); + if (status != CHANNEL_STOPPED) + rb->mixer_channel_stop(MPEG_PCM_CHANNEL); + + rb->pcm_play_unlock(); pcm_reset_buffer(); /* Restart if playing state was current */ - if (playing && !paused) - rb->pcm_play_data(get_more, NULL, 0); - - rb->pcm_play_unlock(); + if (status == CHANNEL_PLAYING) + rb->mixer_channel_play_data(MPEG_PCM_CHANNEL, + get_more, NULL, 0); } /* Seek the reference clock to the specified time - next audio data ready to @@ -264,10 +265,12 @@ uint32_t pcm_output_get_clock(void) do { time = clock_time; - rem = rb->pcm_get_bytes_waiting() >> 2; + rem = rb->mixer_channel_get_bytes_waiting(MPEG_PCM_CHANNEL) >> 2; } while (UNLIKELY(time != clock_time || - (rem == 0 && rb->pcm_is_playing() && !rb->pcm_is_paused()))); + (rem == 0 && + rb->mixer_channel_status(MPEG_PCM_CHANNEL) == CHANNEL_PLAYING)) + ); return time - rem; @@ -283,10 +286,12 @@ uint32_t pcm_output_get_ticks(uint32_t *start) do { tick = clock_tick; - rem = rb->pcm_get_bytes_waiting() >> 2; + rem = rb->mixer_channel_get_bytes_waiting(MPEG_PCM_CHANNEL) >> 2; } while (UNLIKELY(tick != clock_tick || - (rem == 0 && rb->pcm_is_playing() && !rb->pcm_is_paused()))); + (rem == 0 && + rb->mixer_channel_status(MPEG_PCM_CHANNEL) == CHANNEL_PLAYING)) + ); if (start) *start = clock_start; @@ -299,16 +304,22 @@ void pcm_output_play_pause(bool play) { rb->pcm_play_lock(); - if (rb->pcm_is_playing()) + if (rb->mixer_channel_status(MPEG_PCM_CHANNEL) != CHANNEL_STOPPED) { - rb->pcm_play_pause(play); + rb->mixer_channel_play_pause(MPEG_PCM_CHANNEL, play); + rb->pcm_play_unlock(); } - else if (play) + else { - rb->pcm_play_data(get_more, NULL, 0); - } + rb->pcm_play_unlock(); - rb->pcm_play_unlock(); + if (play) + { + rb->mixer_channel_set_amplitude(MPEG_PCM_CHANNEL, MIX_AMP_UNITY); + rb->mixer_channel_play_data(MPEG_PCM_CHANNEL, + get_more, NULL, 0); + } + } } /* Stops all playback and resets the clock */ @@ -316,13 +327,13 @@ void pcm_output_stop(void) { rb->pcm_play_lock(); - if (rb->pcm_is_playing()) - rb->pcm_play_stop(); + if (rb->mixer_channel_status(MPEG_PCM_CHANNEL) != CHANNEL_STOPPED) + rb->mixer_channel_stop(MPEG_PCM_CHANNEL); + + rb->pcm_play_unlock(); pcm_output_flush(); pcm_output_set_clock(0); - - rb->pcm_play_unlock(); } /* Drains any data if the start threshold hasn't been reached */ @@ -343,11 +354,6 @@ bool pcm_output_init(void) pcm_reset_buffer(); - /* Some targets could play at the movie frequency without resampling but - * as of now DSP assumes a certain frequency (always 44100Hz) so - * resampling will be needed for other movie audio rates. */ - rb->pcm_set_frequency(NATIVE_FREQUENCY); - #if INPUT_SRC_CAPS != 0 /* Select playback */ rb->audio_set_input_source(AUDIO_SRC_PLAYBACK, SRCF_PLAYBACK); @@ -379,5 +385,4 @@ bool pcm_output_init(void) void pcm_output_exit(void) { - rb->pcm_set_frequency(HW_SAMPR_DEFAULT); } |