summaryrefslogtreecommitdiff
path: root/streamer.c
diff options
context:
space:
mode:
Diffstat (limited to 'streamer.c')
-rw-r--r--streamer.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/streamer.c b/streamer.c
index 89137d47..1348b617 100644
--- a/streamer.c
+++ b/streamer.c
@@ -142,6 +142,15 @@ static float audio_data[DDB_AUDIO_MEMORY_FRAMES];
// message queue
static struct handler_s *handler;
+// visualization stuff
+typedef struct wavedata_listener_s {
+ void *ctx;
+ void (*callback)(void *ctx, ddb_waveformat_t *fmt, const float *data, int nsamples);
+ struct wavedata_listener_s *next;
+} wavedata_listener_t;
+
+static wavedata_listener_t *wavedata_listeners;
+
#if DETECT_PL_LOCK_RC
volatile pthread_t streamer_lock_tid = 0;
#endif
@@ -2281,12 +2290,19 @@ streamer_read (char *bytes, int size) {
.is_float = 1,
.is_bigendian = 0
};
+
+ float temp_audio_data[in_frames * out_fmt.channels];
+ pcm_convert (&output->fmt, bytes, &out_fmt, (char *)temp_audio_data, sz);
if (in_frames < DDB_AUDIO_MEMORY_FRAMES) {
memmove (audio_data, audio_data + in_frames, (DDB_AUDIO_MEMORY_FRAMES-in_frames)*sizeof (float));
- pcm_convert (&output->fmt, bytes, &out_fmt, (char *)(audio_data + DDB_AUDIO_MEMORY_FRAMES - in_frames), sz);
+ memcpy (audio_data + DDB_AUDIO_MEMORY_FRAMES - in_frames, temp_audio_data, sz);
}
else {
- pcm_convert (&output->fmt, bytes + sz - DDB_AUDIO_MEMORY_FRAMES * in_frame_size, &out_fmt, (char *)audio_data, DDB_AUDIO_MEMORY_FRAMES * in_frame_size);
+ memcpy (audio_data, temp_audio_data, DDB_AUDIO_MEMORY_FRAMES * in_frame_size);
+ }
+
+ for (wavedata_listener_t *l = wavedata_listeners; l; l = l->next) {
+ l->callback (l->ctx, &out_fmt, temp_audio_data, in_frames);
}
calc_freq (audio_data, freq_data);
@@ -2576,6 +2592,31 @@ audio_get_waveform_data (int type, float *data) {
}
void
+register_continuous_wavedata_listener (void *ctx, void (*callback)(void *ctx, ddb_waveformat_t *fmt, const float *data, int nsamples)) {
+ wavedata_listener_t *l = malloc (sizeof (wavedata_listener_t));
+ memset (l, 0, sizeof (wavedata_listener_t));
+ l->ctx = ctx;
+ l->callback = callback;
+ l->next = wavedata_listeners;
+ wavedata_listeners = l;
+}
+
+void
+unregister_continuous_wavedata_listener (void *ctx) {
+ wavedata_listener_t *l, *prev = NULL;
+ for (l = wavedata_listeners; l && l->ctx != ctx; prev = l, l = l->next);
+ if (l) {
+ if (prev) {
+ prev->next = l->next;
+ }
+ else {
+ wavedata_listeners = l->next;
+ }
+ free (l);
+ }
+}
+
+void
streamer_set_streamer_playlist (playlist_t *plt) {
if (streamer_playlist) {
plt_unref (streamer_playlist);