PCM mixer: Simplify mixer_channel_play_data.
Streamline it to do fewer PCM lock calls in the case of having a prepared buffer. Change-Id: I7fca2b95cc5da314ae257522bb6f1ad7aec6634a
This commit is contained in:
parent
565a4b5baa
commit
39eec730b0
1 changed files with 16 additions and 27 deletions
|
@ -256,26 +256,31 @@ static void mixer_start_pcm(void)
|
||||||
pcm_play_data(mixer_pcm_callback, start, MIX_FRAME_SIZE);
|
pcm_play_data(mixer_pcm_callback, start, MIX_FRAME_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the channel and start it if it has data */
|
/** Public interfaces **/
|
||||||
static void mixer_channel_play_start(struct mixer_channel *chan,
|
|
||||||
pcm_play_callback_type get_more,
|
/* Start playback on a channel */
|
||||||
unsigned char *start, size_t size)
|
void mixer_channel_play_data(enum pcm_mixer_channel channel,
|
||||||
|
pcm_play_callback_type get_more,
|
||||||
|
unsigned char *start, size_t size)
|
||||||
{
|
{
|
||||||
pcm_play_unlock(); /* Allow playback while doing any callback */
|
struct mixer_channel *chan = &channels[channel];
|
||||||
|
|
||||||
ALIGN_AUDIOBUF(start, size);
|
ALIGN_AUDIOBUF(start, size);
|
||||||
|
|
||||||
if (!(start && size))
|
if (!(start && size) && get_more)
|
||||||
{
|
{
|
||||||
/* Initial buffer not passed - call the callback now */
|
/* Initial buffer not passed - call the callback now */
|
||||||
|
pcm_play_lock();
|
||||||
|
mixer_deactivate_channel(chan); /* Protect chan struct if active */
|
||||||
|
pcm_play_unlock(); /* Allow playback while doing callback */
|
||||||
|
|
||||||
size = 0;
|
size = 0;
|
||||||
if (get_more)
|
get_more(&start, &size);
|
||||||
{
|
ALIGN_AUDIOBUF(start, size);
|
||||||
get_more(&start, &size);
|
|
||||||
ALIGN_AUDIOBUF(start, size);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcm_play_lock();
|
||||||
|
|
||||||
if (start && size)
|
if (start && size)
|
||||||
{
|
{
|
||||||
/* We have data - start the channel */
|
/* We have data - start the channel */
|
||||||
|
@ -285,31 +290,15 @@ static void mixer_channel_play_start(struct mixer_channel *chan,
|
||||||
chan->last_size = 0;
|
chan->last_size = 0;
|
||||||
chan->get_more = get_more;
|
chan->get_more = get_more;
|
||||||
|
|
||||||
pcm_play_lock();
|
|
||||||
mixer_activate_channel(chan);
|
mixer_activate_channel(chan);
|
||||||
mixer_start_pcm();
|
mixer_start_pcm();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Never had anything - stop it now */
|
/* Never had anything - stop it now */
|
||||||
pcm_play_lock();
|
|
||||||
channel_stopped(chan);
|
channel_stopped(chan);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Public interfaces **/
|
|
||||||
|
|
||||||
/* Start playback on a channel */
|
|
||||||
void mixer_channel_play_data(enum pcm_mixer_channel channel,
|
|
||||||
pcm_play_callback_type get_more,
|
|
||||||
unsigned char *start, size_t size)
|
|
||||||
{
|
|
||||||
struct mixer_channel *chan = &channels[channel];
|
|
||||||
|
|
||||||
pcm_play_lock();
|
|
||||||
mixer_deactivate_channel(chan);
|
|
||||||
mixer_channel_play_start(chan, get_more, start, size);
|
|
||||||
pcm_play_unlock();
|
pcm_play_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue