Add interface about sound stream information 64/299964/3 accepted/tizen/7.0/unified/20231017.165716
authorYoungwoo Cho <young222.cho@samsung.com>
Thu, 12 Oct 2023 09:22:35 +0000 (18:22 +0900)
committerYoungwoo Cho <young222.cho@samsung.com>
Mon, 16 Oct 2023 04:02:31 +0000 (13:02 +0900)
- add interface about sound stream information
  to set properties such as media.role

Change-Id: Ic5046989ca2bf6394e6e531f1088d19406ce286e
Signed-off-by: Youngwoo Cho <young222.cho@samsung.com>
CMakeLists.txt
include/trackrenderer_capi/trackrenderer_capi.h
libtrackrenderer.pc.in
packaging/libtrackrenderer.spec
src/CMakeLists.txt
src/include_internal/trackrenderer/trackrenderer.h
src/trackrenderer.cpp
src/trackrenderer_capi.cpp

index 2d7815301983eaf66da79d37e55e8891ed151270..14eff4b3c659e981b2ffc89b29a2c1e61cf116b0 100644 (file)
@@ -4,6 +4,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 PROJECT(libtrackrenderer)
 SET(description "new multimedia player, object-oriented model")
 SET(PC_NAME "libtrackrenderer")
+SET(PC_REQUIRED "capi-media-sound-manager")
 SET(PC_LDFLAGS "-ltrackrenderer")
 
 SET(INC_DIR ${PROJECT_SOURCE_DIR}/include/)
index 031282e08a13a5ad10b9eb761209297166ca1baa..ae2aec1c24604bbaa9295e48d8123300125db8de 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef __CAPI_TRACKRENDERER_TV_TRACKRENDERER_CAPI_TRACKRENDERER_CAPI_H__
 #define __CAPI_TRACKRENDERER_TV_TRACKRENDERER_CAPI_TRACKRENDERER_CAPI_H__
 
+#include <sound_manager.h>
+
 #include "trackrenderer_capi/buffer.h"
 #include "trackrenderer_capi/decoderinputbuffer.h"
 #include "trackrenderer_capi/display.h"
@@ -2081,6 +2083,20 @@ int trackrenderer_set_video_mid_latency_threshold(TrackRendererHandle handle,
  */
 int trackrenderer_enable_video_hole(TrackRendererHandle handle, const bool value);
 
+/**
+ * @brief        Set sound stream information to audio sink
+ * @param        [in] handle      : trackrenderer handle ptr.
+ * @param        [in] stream_info : information of sound stream
+ * @return       Return 0 if trackrenderer successfully get frame counts.
+ *               Otherwise -1.
+ * @pre          The trackrenderer must be at least created
+ *               trackrenderer_create()
+ * @post         None
+ * @exception    None
+ */
+int trackrenderer_set_sound_stream_info(TrackRendererHandle handle,
+                                        const sound_stream_info_h stream_info);
+
 /**
  * @brief        Set mid latency threshold to trackrenderer
  * @param        [in] handle : trackrenderer handle ptr.
index 4afec1d92232a5dfad8dba577e7186fe017d7c69..bd00d95b7b1c90e3221bfe5433316ba080e00371 100644 (file)
@@ -1,10 +1,11 @@
-\r
-prefix = @PREFIX@\r
-exec_prefix = /usr\r
-libdir = @LIB_INSTALL_DIR@\r
-\r
-Name: @PC_NAME@\r
-Description: @PACKAGE_DESCRIPTION@\r
-Version: @VERSION@\r
-Libs: -L${libdir} @PC_LDFLAGS@\r
-Cflags : @PC_CFLAGS@\r
+
+prefix = @PREFIX@
+exec_prefix = /usr
+libdir = @LIB_INSTALL_DIR@
+
+Name: @PC_NAME@
+Description: @PACKAGE_DESCRIPTION@
+Version: @VERSION@
+Requires: @PC_REQUIRED@
+Libs: -L${libdir} @PC_LDFLAGS@
+Cflags : @PC_CFLAGS@
index 32284662db2fa37c6473e61d0ebb6eb4346f9664..1909dbcc34ff7d5354d3a9f322ed217c5bfbc686 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libtrackrenderer
 Summary:    new multimedia streaming player trackrenderer
-Version:    0.0.41
+Version:    0.0.42
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
@@ -25,6 +25,8 @@ BuildRequires:  pkgconfig(capi-system-info)
 BuildRequires:  pkgconfig(gio-2.0)
 BuildRequires:  pkgconfig(libtbm)
 BuildRequires:  pkgconfig(mm-resource-manager)
+BuildRequires:  pkgconfig(libpulse)
+BuildRequires:  pkgconfig(capi-media-sound-manager)
 BuildRequires:  gtest-devel
 BuildRequires:  gtest
 
index a75306097a35482660b2773c253d6a1c8b64b557..8db72275bf2edfcd4f79611b2967a3a37881d32a 100644 (file)
@@ -17,7 +17,8 @@ SET(dependents "gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-video-1.0 gst
                "libtbm"
                "jsoncpp"
                "capi-system-info"
-               "mm-resource-manager")
+               "mm-resource-manager"
+               "capi-media-sound-manager libpulse")
 
 INCLUDE(FindPkgConfig)
 
index 2bd205a7e30898309fdc6aa108ec0411e362ebe7..7db2b723f06b59da16349d86e47ddb2c36b68381 100644 (file)
@@ -26,6 +26,7 @@
 #include <vector>
 
 #include <gst/video/video-info.h>
+#include <sound_manager.h>
 #include "gst/gst.h"
 
 #include "trackrenderer/core/attribute.hpp"
@@ -155,6 +156,7 @@ class TrackRenderer : public ResourceConflictListener,
   GetDecodedVideoFrameState GetDecodedPacket(DecodedVideoPacket& packet);
   bool ReturnDecodedPacket(const DecodedVideoPacket& packet);
   bool EnableVideoHole(bool value);
+  bool SetSoundStreamInfo(const sound_stream_info_h stream_info);
 
  private:
   enum class Elements {
@@ -328,6 +330,7 @@ class TrackRenderer : public ResourceConflictListener,
   bool ActivateAudioPipeline(GstCaps* caps);
   void SetOpusChannelMappingFamily(const GstCapsWrapper& caps);
   void EnableVideoHole_();
+  void ApplySoundStreamInfo_();
 
  private:
   EventListener* eventlistener_ = nullptr;  // eventlistener is Defaultplayer
@@ -371,6 +374,7 @@ class TrackRenderer : public ResourceConflictListener,
   std::unique_ptr<TbmBufferManager> tbm_buffer_manager_;
   double playback_rate_ = kDefaultPlaybackRate;
   bool is_video_hole_enabled_ = false;
+  std::string stream_info_;
 
   SubState target_substate_ = SubState::kUnknown;
 
index 47473a4f9f79ef521331b91f400519f97c7b725f..a9ebb41c351dd350367bd4c9f1b38cd73f6fa2e8 100644 (file)
@@ -28,6 +28,8 @@
 #include <system_info.h>
 #include <tbm_surface_internal.h>
 #include <gst/allocators/gsttizenmemory.h>
+#include <pulse/proplist.h>
+#include <sound_manager_internal.h>
 
 #include "trackrenderer/core/gst_utils.h"
 #include "trackrenderer/core/gstobject_guard.h"
@@ -1217,6 +1219,7 @@ bool TrackRenderer::CreateAudioPipeline_(const Track* track) {
   pipeline_->FactoryMake(Elements::kSinkAudio, kAudioSinkName, NULL);
   pipeline_->SetProperty(Elements::kSinkAudio, "provide-clock", FALSE);
   GstElementLowLatency_(kTrackTypeAudio);
+  ApplySoundStreamInfo_();
 
   pipeline_->CreateBin(Elements::kBinAudio, "audiobin");
   pipeline_->FactoryMake(Elements::kAudioConvert, "audioconvert", nullptr);
@@ -1249,6 +1252,7 @@ bool TrackRenderer::CreateRawAudioPipeline_(const Track* track) {
   pipeline_->SetProperty(Elements::kSinkAudio, "provide-clock", FALSE);
   pipeline_->SetProperty(Elements::kSinkAudio, "sync", TRUE);
   GstElementLowLatency_(kTrackTypeAudio);
+  ApplySoundStreamInfo_();
 
   pipeline_->CreateBin(Elements::kBinAudio, "audiobin");
   pipeline_->FactoryMake(Elements::kAudioConvert, "audioconvert", nullptr);
@@ -2054,8 +2058,9 @@ bool TrackRenderer::ActivateAudioPipeline(GstCaps * caps) {
   pipeline_->FactoryMake(Elements::kAudioConvert, "audioconvert", nullptr);
   pipeline_->FactoryMake(Elements::kAudioResample, "audioresample", nullptr);
   pipeline_->FactoryMake(Elements::kSinkAudio, kAudioSinkName, nullptr);
-
   pipeline_->SetProperty(Elements::kSinkAudio, "sync", TRUE, "async", TRUE, "provide-clock", FALSE);
+  ApplySoundStreamInfo_();
+
   pipeline_->SetProperty(Elements::kAppSrcAudio, "stream-type",
     GST_APP_STREAM_TYPE_SEEKABLE);
   pipeline_->SetProperty(Elements::kAppSrcAudio, "format", GST_FORMAT_TIME);
@@ -2318,6 +2323,81 @@ bool TrackRenderer::GetDroppedFramesForCatchup(TrackType type,
   return true;
 }
 
+bool TrackRenderer::SetSoundStreamInfo(const sound_stream_info_h stream_info) {
+  TRACKRENDERER_ENTER;
+  if (!stream_info) {
+    TRACKRENDERER_ERROR("stream_info is NULL");
+    return false;
+  }
+
+  char *stream_type;
+  int stream_index;
+  // bool available = false;
+
+  sound_manager_get_type_from_stream_information(stream_info, &stream_type);
+  sound_manager_get_index_from_stream_information(stream_info, &stream_index);
+
+  /* FIXME: need to add NATIVE_API_TRACKRENDERER in sound-manager */
+  // ret = sound_manager_is_available_stream_information(stream_info, NATIVE_API_TRACKRENDERER, &available);
+  // if (ret != SOUND_MANAGER_ERROR_NONE) {
+  //   TRACKRENDERER_ERROR("failed to sound_manager_is_available_stream_information()");
+  //   return false;
+  // }
+
+  // if (!available) {
+  //   TRACKRENDERER_ERROR("this stream info[%p, type:%s, index:%d] is not allowed to this framework", stream_info, stream_type, stream_index);
+  //   return false;
+  // }
+
+  if (stream_type == NULL) {
+    TRACKRENDERER_ERROR("stream_type is NULL");
+    return false;
+  }
+  if (stream_index < 0) {
+    TRACKRENDERER_ERROR("stream_index: %d", stream_index);
+    return false;
+  }
+
+  TRACKRENDERER_INFO("stream_info[%p, type:%s, index:%d]",
+    stream_info, stream_type, stream_index);
+
+  std::ostringstream stringStream;
+  stringStream << "props," << PA_PROP_MEDIA_ROLE << "=" <<
+    stream_type << ", " << PA_PROP_MEDIA_PARENT_ID << "=" << stream_index;
+
+  std::lock_guard<std::mutex> lk(resource_m_);
+  stream_info_ = stringStream.str();
+  TRACKRENDERER_LEAVE;
+  return true;
+}
+
+void TrackRenderer::ApplySoundStreamInfo_() {
+  const gchar* sink_name = nullptr;
+  pipeline_->GetProperty(Elements::kSinkAudio, "name", &sink_name);
+  if (!sink_name) {
+    TRACKRENDERER_WARN("no audio sink");
+    return;
+  }
+  if (!strstr(sink_name, kAudioSinkName)) {
+    TRACKRENDERER_WARN("unknown audio sink name: %s", sink_name);
+    return;
+  }
+
+  if (stream_info_.empty()) {
+    TRACKRENDERER_WARN("stream_info_ is NULL");
+    return;
+  }
+
+  GstStructure *structure = gst_structure_from_string(stream_info_.c_str(), NULL);
+  if (!structure) {
+    TRACKRENDERER_ERROR("failed to gst_structure_from_string(), [%s]", stream_info_.c_str());
+    return;
+  }
+
+  pipeline_->SetProperty(Elements::kSinkAudio, "stream-properties", structure);
+  gst_structure_free(structure);
+}
+
 bool TrackRenderer::SetDisplayMode(const DisplayMode& mode) {
   std::lock_guard<std::mutex> lk(resource_m_);
   if (state_ == State::kStopped) return false;
@@ -2781,6 +2861,7 @@ bool TrackRenderer::ActivateAudio_() {
     SetVolume_();
   }
   pipeline_->SetProperty(Elements::kSinkAudio, "async", FALSE);
+  ApplySoundStreamInfo_();
 
   pipeline_->BinAdd(Elements::kBinAudio, Elements::kDecAudio,
                     Elements::kSinkAudio);
index 808d321954f89bf5564d602be35bec9185aff031..a3300ae41572748e2d5bdb4939926a84bc86c304 100644 (file)
@@ -595,6 +595,16 @@ int trackrenderer_get_dropped_frames_for_catchup(TrackRendererHandle handle,
   return kSuccess;
 }
 
+int trackrenderer_set_sound_stream_info(TrackRendererHandle handle,
+                                        const sound_stream_info_h stream_info) {
+  auto priv = static_cast<TrackRendererPrivPtr>(handle);
+  if (!priv) return kFailed;
+  if (!priv->renderer->SetSoundStreamInfo(stream_info)) {
+    return kFailed;
+  }
+  return kSuccess;
+}
+
 using TrackType = plusplayer::trackrenderer::TrackType;
 
 int trackrenderer_deactivate(TrackRendererHandle handle,