From fd8bbb0a4543f141ac5e744eede6d3eb7a990059 Mon Sep 17 00:00:00 2001 From: alexander_matveev Date: Wed, 15 Apr 2020 13:33:33 -0700 Subject: [PATCH] 8242530: [macos] Some audio files miss spectrum data when another audio file plays first --- .../gst-plugins-good/gst/spectrum/gstspectrum.c | 9 +++++++++ .../gst-plugins-good/gst/spectrum/gstspectrum.h | 10 ++++++++++ .../jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp | 8 ++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.c b/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.c index 598cd03347d..dbd35e97e41 100644 --- a/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.c +++ b/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.c @@ -270,6 +270,7 @@ gst_spectrum_init (GstSpectrum * spectrum) spectrum->bps_user = 0; spectrum->bpf_user = 0; spectrum->user_data = NULL; + spectrum->post_message_callback = NULL; #endif // GSTREAMER_LITE and OSX g_mutex_init (&spectrum->lock); @@ -1060,7 +1061,15 @@ gst_spectrum_transform_ip (GstBaseTransform * trans, GstBuffer * buffer) m = gst_spectrum_message_new (spectrum, spectrum->message_ts, spectrum->interval); +#if defined (GSTREAMER_LITE) && defined (OSX) + if (spectrum->post_message_callback != NULL) { + spectrum->post_message_callback(GST_ELEMENT (spectrum), m); + } else { + gst_element_post_message (GST_ELEMENT (spectrum), m); + } +#else // GSTREAMER_LITE && OSX gst_element_post_message (GST_ELEMENT (spectrum), m); +#endif // GSTREAMER_LITE && OSX #ifndef GSTREAMER_LITE } #endif // GSTREAMER_LITE diff --git a/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.h b/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.h index bad3e70977d..270ad2efc69 100644 --- a/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.h +++ b/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/spectrum/gstspectrum.h @@ -40,6 +40,15 @@ typedef struct _GstSpectrumChannel GstSpectrumChannel; typedef void (*GstSpectrumInputData)(const guint8 * in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft); +#if defined (GSTREAMER_LITE) && defined (OSX) +// Used to overwrite post_message callback to get spectrum messages in OSXPlatform. +// We cannot use GST_ELEMENT_GET_CLASS(spectrum)->post_message, since it will +// change callback for all instances of spectrum elements and it will conflict +// with GStreamer platform. +typedef gboolean (*PostMessageCallbackProc)(GstElement * element, + GstMessage * message); +#endif // GSTREAMER_LITE and OSX + struct _GstSpectrumChannel { gfloat *input; @@ -86,6 +95,7 @@ struct _GstSpectrum guint bps_user; // User provided values to avoid more complex spectrum initialization guint bpf_user; void *user_data; + PostMessageCallbackProc post_message_callback; #endif // GSTREAMER_LITE and OSX }; diff --git a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp index 130bd5f1f16..7e2b963a114 100644 --- a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp +++ b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp @@ -272,10 +272,10 @@ void AVFAudioSpectrumUnit::SetupSpectralProcessor() { mSpectrum = GST_SPECTRUM(mSpectrumElement); mSpectrum->user_data = (void*)this; - // Set our own callback for post message - GstElementClass *klass; - klass = GST_ELEMENT_GET_CLASS(mSpectrumElement); - klass->post_message = PostMessageCallback; + // Set our own callback for post message, do not use + // GST_ELEMENT_GET_CLASS(mSpectrumElement)->post_message, since it will change + // callback for all instances of spectrum element. + mSpectrum->post_message_callback = PostMessageCallback; // Configure spectrum element // Do send magnitude and phase information, off by default