Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

pcm_mixer: introduce mixer_buffer_cbs

intended to add sampr_changed callback to buffer hook as well as mixer
playback

Change-Id: I9df6194a884cfb813342a827b7fdc3bccbe3d60c

authored by

mojyack and committed by
Solomon Peachy
e2040cc9 cb04b816

+44 -30
+2 -2
apps/plugin.h
··· 179 179 * when this happens please take the opportunity to sort in 180 180 * any new functions "waiting" at the end of the list. 181 181 */ 182 - #define PLUGIN_API_VERSION 281 182 + #define PLUGIN_API_VERSION 282 183 183 184 184 /* 239 Marks the removal of ARCHOS HWCODEC and CHARCELL */ 185 185 ··· 790 790 unsigned int amplitude); 791 791 size_t (*mixer_channel_get_bytes_waiting)(enum pcm_mixer_channel channel); 792 792 void (*mixer_channel_set_buffer_hook)(enum pcm_mixer_channel channel, 793 - chan_buffer_hook_fn_type fn); 793 + const struct mixer_buffer_cbs* cbs); 794 794 void (*mixer_set_frequency)(unsigned int samplerate); 795 795 unsigned int (*mixer_get_frequency)(void); 796 796 void (*pcmbuf_fade)(bool fade, bool in);
+6 -2
apps/plugins/oscilloscope.c
··· 1441 1441 waveform_buffer_have = have + copy; 1442 1442 } 1443 1443 1444 + static const struct mixer_buffer_cbs buf_cbs = { 1445 + .next_buffer = waveform_buffer_callback, 1446 + }; 1447 + 1444 1448 static void waveform_buffer_reset(void) 1445 1449 { 1446 1450 /* only called when callback is off */ ··· 1909 1913 if (osc.graphmode == GRAPH_WAVEFORM) 1910 1914 { 1911 1915 rb->mixer_channel_set_buffer_hook(channel, 1912 - waveform_buffer_callback); 1916 + &buf_cbs); 1913 1917 #ifdef HAVE_SCHEDULER_BOOSTCTRL 1914 1918 rb->trigger_cpu_boost(); /* Just looks better */ 1915 1919 #endif ··· 2013 2017 2014 2018 #ifdef OSCILLOSCOPE_GRAPHMODE 2015 2019 if (osc.graphmode == GRAPH_WAVEFORM) 2016 - rb->mixer_channel_set_buffer_hook(channel, waveform_buffer_callback); 2020 + rb->mixer_channel_set_buffer_hook(channel, &buf_cbs); 2017 2021 #endif 2018 2022 } 2019 2023 #endif /* USB_ENABLE_AUDIO */
+1 -1
docs/PLUGIN_API
··· 1624 1624 \param amplitude 1625 1625 \description 1626 1626 1627 - void mixer_channel_set_buffer_hook(enum pcm_mixer_channel channel, chan_buffer_hook_fn_type fn) 1627 + void mixer_channel_set_buffer_hook(enum pcm_mixer_channel channel, const struct mixer_buffer_cbs* cbs) 1628 1628 \param channel 1629 1629 \param fn 1630 1630 \description
+7 -4
firmware/export/pcm_mixer.h
··· 133 133 void mixer_adjust_channel_address(enum pcm_mixer_channel channel, 134 134 off_t offset); 135 135 136 - /* Set a hook that is called upon getting a new source buffer for a channel 137 - NOTE: Called for each buffer, not each mixer chunk */ 138 - typedef void (*chan_buffer_hook_fn_type)(const void *start, size_t size); 136 + struct mixer_buffer_cbs { 137 + /* Called for each buffer, not each mixer chunk */ 138 + void (*next_buffer)(const void *start, size_t size); 139 + void (*sampr_changed)(uint32_t sampr); 140 + }; 139 141 142 + /* Set a hook that is called upon getting a new source buffer for a channel */ 140 143 void mixer_channel_set_buffer_hook(enum pcm_mixer_channel channel, 141 - chan_buffer_hook_fn_type fn); 144 + const struct mixer_buffer_cbs* cbs); 142 145 143 146 /* Stop ALL channels and PCM and reset state */ 144 147 void mixer_reset(void);
+28 -21
firmware/pcm_mixer.c
··· 42 42 /* Descriptor for each channel */ 43 43 struct mixer_channel 44 44 { 45 - const void *start; /* Buffer pointer */ 46 - size_t size; /* Bytes remaining */ 47 - size_t last_size; /* Size of consumed data in prev. cycle */ 48 - const struct mixer_play_cbs* cbs; /* Registered callbacks */ 49 - enum channel_status status; /* Playback status */ 50 - uint32_t amplitude; /* Amp. factor: 0x0000 = mute, 0x10000 = unity */ 51 - chan_buffer_hook_fn_type buffer_hook; /* Callback for new buffer */ 45 + const void *start; /* Buffer pointer */ 46 + size_t size; /* Bytes remaining */ 47 + size_t last_size; /* Size of consumed data in prev. cycle */ 48 + const struct mixer_play_cbs* play_cbs; /* Registered callbacks */ 49 + enum channel_status status; /* Playback status */ 50 + uint32_t amplitude; /* Amp. factor: 0x0000 = mute, 0x10000 = unity */ 51 + const struct mixer_buffer_cbs* buf_cbs; /* Callback for new buffer */ 52 52 }; 53 53 54 54 #if (defined(HW_HAVE_192) || defined(HW_HAVE_176)) ··· 119 119 120 120 static inline void chan_call_buffer_hook(struct mixer_channel *chan) 121 121 { 122 - if (UNLIKELY(chan->buffer_hook)) 123 - chan->buffer_hook(chan->start, chan->size); 122 + if (UNLIKELY(chan->buf_cbs && chan->buf_cbs->next_buffer)) 123 + chan->buf_cbs->next_buffer(chan->start, chan->size); 124 124 } 125 125 126 126 /* Buffering callback - calls sub-callbacks and mixes the data for next ··· 154 154 155 155 if (chan->size == 0) 156 156 { 157 - if (chan->cbs->get_more) 157 + if (chan->play_cbs->get_more) 158 158 { 159 - chan->cbs->get_more(&chan->start, &chan->size); 159 + chan->play_cbs->get_more(&chan->start, &chan->size); 160 160 ALIGN_AUDIOBUF(chan->start, chan->size); 161 161 } 162 162 ··· 317 317 chan->start = start; 318 318 chan->size = size; 319 319 chan->last_size = 0; 320 - chan->cbs = cbs; 320 + chan->play_cbs = cbs; 321 321 322 322 mixer_activate_channel(chan); 323 323 chan_call_buffer_hook(chan); ··· 429 429 pcm_play_unlock(); 430 430 } 431 431 432 - /* Set a hook that is called upon getting a new source buffer for a channel 433 - NOTE: Called for each buffer, not each mixer chunk */ 432 + /* Set a hook that is called upon getting a new source buffer for a channel */ 434 433 void mixer_channel_set_buffer_hook(enum pcm_mixer_channel channel, 435 - chan_buffer_hook_fn_type fn) 434 + const struct mixer_buffer_cbs* cbs) 436 435 { 437 436 struct mixer_channel *chan = &channels[channel]; 438 437 439 438 pcm_play_lock(); 440 - chan->buffer_hook = fn; 439 + chan->buf_cbs = cbs; 441 440 pcm_play_unlock(); 442 441 } 443 442 ··· 471 470 struct mixer_channel* chan = active_channels[i]; 472 471 473 472 /* Notify upstreams */ 474 - if (chan->cbs) 473 + if (chan->play_cbs) 475 474 { 476 - if (chan->cbs->sampr_changed) 475 + if (chan->play_cbs->sampr_changed) 477 476 { 478 - chan->cbs->sampr_changed(samplerate); 477 + chan->play_cbs->sampr_changed(samplerate); 479 478 } 480 - if (chan->cbs->get_more) 479 + if (chan->play_cbs->get_more) 481 480 { 482 481 /* Remake buffer */ 483 482 const void *start = NULL; 484 483 size_t size; 485 - chan->cbs->get_more(&start, &size); 484 + chan->play_cbs->get_more(&start, &size); 486 485 if (start && size) { 487 486 chan->start = start; 488 487 chan->size = size; ··· 490 489 } else { 491 490 channel_stopped(chan); 492 491 } 492 + } 493 + } 494 + /* Notify buffer monitor */ 495 + if (chan->buf_cbs) 496 + { 497 + if (chan->buf_cbs->sampr_changed) 498 + { 499 + chan->buf_cbs->sampr_changed(samplerate); 493 500 } 494 501 } 495 502 }