mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-05-12 11:43:16 -04:00
pcm: implement pcm_switch_sink
Change-Id: Iace01c2e97950cc794f3cf755dc358da6f3daa7f
This commit is contained in:
parent
8ac866a749
commit
be4b0591ee
2 changed files with 35 additions and 0 deletions
|
|
@ -64,6 +64,7 @@ bool pcm_is_initialized(void);
|
|||
|
||||
enum pcm_sink_ids pcm_current_sink(void);
|
||||
const struct pcm_sink_caps* pcm_sink_caps(enum pcm_sink_ids sink);
|
||||
bool pcm_switch_sink(enum pcm_sink_ids sink);
|
||||
|
||||
/* shortcut for plugins */
|
||||
const struct pcm_sink_caps* pcm_current_sink_caps(void);
|
||||
|
|
|
|||
|
|
@ -291,6 +291,40 @@ const struct pcm_sink_caps* pcm_current_sink_caps(void)
|
|||
return pcm_sink_caps(pcm_current_sink());
|
||||
}
|
||||
|
||||
bool pcm_switch_sink(enum pcm_sink_ids sink)
|
||||
{
|
||||
logf("pcm_switch_sink %d to %d", cur_sink, sink);
|
||||
if(sink >= ARRAYLEN(sinks)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(cur_sink == sink) {
|
||||
return true;
|
||||
}
|
||||
/* save current sink before switching */
|
||||
struct pcm_sink* old_sink = sinks[cur_sink];
|
||||
/* update sink index */
|
||||
cur_sink = sink;
|
||||
/* synchronize frequency */
|
||||
unsigned long cur_sampr = old_sink->caps.samprs[old_sink->pending_freq];
|
||||
pcm_set_frequency(cur_sampr);
|
||||
pcm_apply_settings();
|
||||
/* when playing, continue playing on new sink */
|
||||
if(pcm_playing) {
|
||||
old_sink->ops.stop();
|
||||
/* need more */
|
||||
const void *start;
|
||||
size_t size;
|
||||
if(pcm_get_more_int(&start, &size)) {
|
||||
pcm_play_dma_start_int(start, size);
|
||||
} else {
|
||||
pcm_play_stop_int();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void pcm_play_data(pcm_play_callback_type get_more,
|
||||
pcm_status_callback_type status_cb,
|
||||
const void *start, size_t size)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue