diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index c33c7ba0d..a3dc17ca4 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -888,6 +888,7 @@ void GstEngine::UpdateScope(const int chunk_length) { if (buffer_format_.startsWith("S16LE") || buffer_format_.startsWith("U16LE") || buffer_format_.startsWith("S24LE") || + buffer_format_.startsWith("S24_32LE") || buffer_format_.startsWith("S32LE") || buffer_format_.startsWith("F32LE") ) { diff --git a/src/engine/gstenginepipeline.cpp b/src/engine/gstenginepipeline.cpp index 9e6e1715b..234a91861 100644 --- a/src/engine/gstenginepipeline.cpp +++ b/src/engine/gstenginepipeline.cpp @@ -704,6 +704,31 @@ GstPadProbeReturn GstEnginePipeline::HandoffCallback(GstPad *pad, GstPadProbeInf instance->logged_unsupported_analyzer_format_ = false; } + else if (format.startsWith("S24_32LE")) { + + GstMapInfo map_info; + gst_buffer_map(buf, &map_info, GST_MAP_READ); + + int32_t *s32 = reinterpret_cast(map_info.data); + int32_t *s32e = s32 + map_info.size; + int32_t *s32p = s32; + int samples = static_cast((map_info.size / sizeof(int32_t)) / channels); + int buf16_size = samples * static_cast(sizeof(int16_t)) * channels; + int16_t *s16 = static_cast(g_malloc(buf16_size)); + memset(s16, 0, buf16_size); + for (int i = 0; i < (samples * channels); ++i) { + char *s24 = reinterpret_cast(s32p); + s16[i] = *(reinterpret_cast(s24+1)); + ++s32p; + if (s32p > s32e) break; + } + gst_buffer_unmap(buf, &map_info); + buf16 = gst_buffer_new_wrapped(s16, buf16_size); + GST_BUFFER_DURATION(buf16) = GST_FRAMES_TO_CLOCK_TIME(samples * sizeof(int16_t) * channels, rate); + buf = buf16; + + instance->logged_unsupported_analyzer_format_ = false; + } else if (!instance->logged_unsupported_analyzer_format_) { instance->logged_unsupported_analyzer_format_ = true; qLog(Error) << "Unsupported audio format for the analyzer" << format;