···179179 * when this happens please take the opportunity to sort in
180180 * any new functions "waiting" at the end of the list.
181181 */
182182-#define PLUGIN_API_VERSION 281
182182+#define PLUGIN_API_VERSION 282
183183184184/* 239 Marks the removal of ARCHOS HWCODEC and CHARCELL */
185185···790790 unsigned int amplitude);
791791 size_t (*mixer_channel_get_bytes_waiting)(enum pcm_mixer_channel channel);
792792 void (*mixer_channel_set_buffer_hook)(enum pcm_mixer_channel channel,
793793- chan_buffer_hook_fn_type fn);
793793+ const struct mixer_buffer_cbs* cbs);
794794 void (*mixer_set_frequency)(unsigned int samplerate);
795795 unsigned int (*mixer_get_frequency)(void);
796796 void (*pcmbuf_fade)(bool fade, bool in);
+6-2
apps/plugins/oscilloscope.c
···14411441 waveform_buffer_have = have + copy;
14421442}
1443144314441444+static const struct mixer_buffer_cbs buf_cbs = {
14451445+ .next_buffer = waveform_buffer_callback,
14461446+};
14471447+14441448static void waveform_buffer_reset(void)
14451449{
14461450 /* only called when callback is off */
···19091913 if (osc.graphmode == GRAPH_WAVEFORM)
19101914 {
19111915 rb->mixer_channel_set_buffer_hook(channel,
19121912- waveform_buffer_callback);
19161916+ &buf_cbs);
19131917#ifdef HAVE_SCHEDULER_BOOSTCTRL
19141918 rb->trigger_cpu_boost(); /* Just looks better */
19151919#endif
···2013201720142018#ifdef OSCILLOSCOPE_GRAPHMODE
20152019 if (osc.graphmode == GRAPH_WAVEFORM)
20162016- rb->mixer_channel_set_buffer_hook(channel, waveform_buffer_callback);
20202020+ rb->mixer_channel_set_buffer_hook(channel, &buf_cbs);
20172021#endif
20182022}
20192023#endif /* USB_ENABLE_AUDIO */
···133133void mixer_adjust_channel_address(enum pcm_mixer_channel channel,
134134 off_t offset);
135135136136-/* Set a hook that is called upon getting a new source buffer for a channel
137137- NOTE: Called for each buffer, not each mixer chunk */
138138-typedef void (*chan_buffer_hook_fn_type)(const void *start, size_t size);
136136+struct mixer_buffer_cbs {
137137+ /* Called for each buffer, not each mixer chunk */
138138+ void (*next_buffer)(const void *start, size_t size);
139139+ void (*sampr_changed)(uint32_t sampr);
140140+};
139141142142+/* Set a hook that is called upon getting a new source buffer for a channel */
140143void mixer_channel_set_buffer_hook(enum pcm_mixer_channel channel,
141141- chan_buffer_hook_fn_type fn);
144144+ const struct mixer_buffer_cbs* cbs);
142145143146/* Stop ALL channels and PCM and reset state */
144147void mixer_reset(void);
+28-21
firmware/pcm_mixer.c
···4242/* Descriptor for each channel */
4343struct mixer_channel
4444{
4545- const void *start; /* Buffer pointer */
4646- size_t size; /* Bytes remaining */
4747- size_t last_size; /* Size of consumed data in prev. cycle */
4848- const struct mixer_play_cbs* cbs; /* Registered callbacks */
4949- enum channel_status status; /* Playback status */
5050- uint32_t amplitude; /* Amp. factor: 0x0000 = mute, 0x10000 = unity */
5151- chan_buffer_hook_fn_type buffer_hook; /* Callback for new buffer */
4545+ const void *start; /* Buffer pointer */
4646+ size_t size; /* Bytes remaining */
4747+ size_t last_size; /* Size of consumed data in prev. cycle */
4848+ const struct mixer_play_cbs* play_cbs; /* Registered callbacks */
4949+ enum channel_status status; /* Playback status */
5050+ uint32_t amplitude; /* Amp. factor: 0x0000 = mute, 0x10000 = unity */
5151+ const struct mixer_buffer_cbs* buf_cbs; /* Callback for new buffer */
5252};
53535454#if (defined(HW_HAVE_192) || defined(HW_HAVE_176))
···119119120120static inline void chan_call_buffer_hook(struct mixer_channel *chan)
121121{
122122- if (UNLIKELY(chan->buffer_hook))
123123- chan->buffer_hook(chan->start, chan->size);
122122+ if (UNLIKELY(chan->buf_cbs && chan->buf_cbs->next_buffer))
123123+ chan->buf_cbs->next_buffer(chan->start, chan->size);
124124}
125125126126/* Buffering callback - calls sub-callbacks and mixes the data for next
···154154155155 if (chan->size == 0)
156156 {
157157- if (chan->cbs->get_more)
157157+ if (chan->play_cbs->get_more)
158158 {
159159- chan->cbs->get_more(&chan->start, &chan->size);
159159+ chan->play_cbs->get_more(&chan->start, &chan->size);
160160 ALIGN_AUDIOBUF(chan->start, chan->size);
161161 }
162162···317317 chan->start = start;
318318 chan->size = size;
319319 chan->last_size = 0;
320320- chan->cbs = cbs;
320320+ chan->play_cbs = cbs;
321321322322 mixer_activate_channel(chan);
323323 chan_call_buffer_hook(chan);
···429429 pcm_play_unlock();
430430}
431431432432-/* Set a hook that is called upon getting a new source buffer for a channel
433433- NOTE: Called for each buffer, not each mixer chunk */
432432+/* Set a hook that is called upon getting a new source buffer for a channel */
434433void mixer_channel_set_buffer_hook(enum pcm_mixer_channel channel,
435435- chan_buffer_hook_fn_type fn)
434434+ const struct mixer_buffer_cbs* cbs)
436435{
437436 struct mixer_channel *chan = &channels[channel];
438437439438 pcm_play_lock();
440440- chan->buffer_hook = fn;
439439+ chan->buf_cbs = cbs;
441440 pcm_play_unlock();
442441}
443442···471470 struct mixer_channel* chan = active_channels[i];
472471473472 /* Notify upstreams */
474474- if (chan->cbs)
473473+ if (chan->play_cbs)
475474 {
476476- if (chan->cbs->sampr_changed)
475475+ if (chan->play_cbs->sampr_changed)
477476 {
478478- chan->cbs->sampr_changed(samplerate);
477477+ chan->play_cbs->sampr_changed(samplerate);
479478 }
480480- if (chan->cbs->get_more)
479479+ if (chan->play_cbs->get_more)
481480 {
482481 /* Remake buffer */
483482 const void *start = NULL;
484483 size_t size;
485485- chan->cbs->get_more(&start, &size);
484484+ chan->play_cbs->get_more(&start, &size);
486485 if (start && size) {
487486 chan->start = start;
488487 chan->size = size;
···490489 } else {
491490 channel_stopped(chan);
492491 }
492492+ }
493493+ }
494494+ /* Notify buffer monitor */
495495+ if (chan->buf_cbs)
496496+ {
497497+ if (chan->buf_cbs->sampr_changed)
498498+ {
499499+ chan->buf_cbs->sampr_changed(samplerate);
493500 }
494501 }
495502 }