#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"
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);
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);
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);
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;
SetVolume_();
}
pipeline_->SetProperty(Elements::kSinkAudio, "async", FALSE);
+ ApplySoundStreamInfo_();
pipeline_->BinAdd(Elements::kBinAudio, Elements::kDecAudio,
Elements::kSinkAudio);