Load capi-media-sound-io library with dlopen 54/324854/11
authorws29.jung <ws29.jung@samsung.com>
Wed, 28 May 2025 03:00:24 +0000 (12:00 +0900)
committerBot Blink <blinkbot@samsung.com>
Thu, 12 Jun 2025 10:47:41 +0000 (10:47 +0000)
This commit removes the dependency on capi-media-sound-io libray
and loads it with dlopen.

Change-Id: I683618eba504d29434a061ef0d62ccdce9c6597d
Signed-off-by: ws29.jung <ws29.jung@samsung.com>
17 files changed:
tizen_src/build/BUILD.gn
tizen_src/chromium_impl/media/audio/tizen/capi_audio_input.cc
tizen_src/chromium_impl/media/audio/tizen/capi_audio_input.h
tizen_src/chromium_impl/media/audio/tizen/capi_audio_output.cc
tizen_src/chromium_impl/media/audio/tizen/capi_audio_output.h
tizen_src/chromium_impl/media/audio/tizen/capi_bt_audio_input_stream.cc
tizen_src/chromium_impl/media/audio/tizen/capi_bt_audio_input_stream.h
tizen_src/chromium_impl/media/audio/tizen/capi_usb_audio_input_stream.cc
tizen_src/chromium_impl/media/audio/tizen/capi_usb_audio_input_stream.h
tizen_src/chromium_impl/media/audio/tizen/capi_util.cc
tizen_src/chromium_impl/media/audio/tizen/capi_util.h
tizen_src/chromium_impl/media/audio/tizen/software_fallback_output_stream.cc
tizen_src/chromium_impl/media/audio/tizen/software_fallback_output_stream.h
tizen_src/chromium_impl/media/media_efl.gni
tizen_src/platform/build_tizen_proxy.py
tizen_src/platform/capi-media-audio-io/BUILD.gn [new file with mode: 0644]
tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.json [new file with mode: 0644]

index 3b018de2738c44891b7dc486f4d6d652c9e3d6fa..4ed3cb5f16178eb33accb8df9971931c0b41fa48 100644 (file)
@@ -634,12 +634,6 @@ if (enable_capi_encoder_tv_api) {
   }
 }
 
-config("capi-media-audio-io") {
-  if (is_tizen) {
-    ldflags = [ "-lcapi-media-audio-io" ]
-  }
-}
-
 tizen_pkg_config("capi-boost-tv") {
   packages = []
   if (tizen_product_tv && tizen_version >= 70) {
@@ -647,19 +641,6 @@ tizen_pkg_config("capi-boost-tv") {
   }
 }
 
-tizen_pkg_config("libcapi-media-audio-io") {
-  packages = []
-  if (is_tizen) {
-    packages = [ "capi-media-audio-io" ]
-  }
-}
-
-config("capi-media-audio-io-public") {
-  if (is_tizen) {
-    cflags = [ "-capi-media-audio-io" ]
-  }
-}
-
 config("capi-network-bluetooth") {
   if (tizen_product_tv) {
     ldflags = [ "-lcapi-network-bluetooth" ]
index 8a295811ab9f252ee8998d3671ad951cf6a33c62..cbac86018369e4cf6698e0c1a8a77763be215d45 100644 (file)
@@ -4,12 +4,13 @@
 
 #include "media/audio/tizen/capi_audio_input.h"
 
-#include <audio_io.h>
 #include <sys/types.h>
 
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "media/audio/tizen/audio_manager_capi.h"
+#include "tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.h"
+
 #if BUILDFLAG(IS_TIZEN_TV)
 #include "content/public/browser/browser_thread.h"
 #endif
@@ -29,7 +30,8 @@ CapiAudioInputStream::CapiAudioInputStream(AudioManagerCapi* audio_manager,
       audio_worker_("AudioInput"),
       fifo_(params.channels(),
             params.frames_per_buffer(),
-            kNumberOfBlocksBufferInFifo) {}
+            kNumberOfBlocksBufferInFifo),
+      proxy_(platform::CapiMediaAudioIoProxy::Get()) {}
 
 CapiAudioInputStream::~CapiAudioInputStream() {}
 
index f1c2aa95a073ef5d73868502a13ce2e053647f16..73bd48ca9dfbbaf668118e015c33eb1661decad6 100644 (file)
 #include "media/base/audio_block_fifo.h"
 #include "media/base/audio_parameters.h"
 
+namespace platform {
+class CapiMediaAudioIoProxy;
+}
+
 namespace media {
 
 class AudioManagerCapi;
@@ -64,6 +68,7 @@ class CapiAudioInputStream : public AgcAudioStream<AudioInputStream> {
   std::unique_ptr<AudioDebugRecorder> debug_recorder_;
   AudioManagerCapi* audio_manager_{nullptr};
   double volume_;
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy_;
 };
 
 }  // namespace media
index 92227696a90e1cba89f1ed9e59ce68abd8b7ae02..50dec9386a388c20159765940501d57a2d5ac298 100644 (file)
@@ -4,14 +4,13 @@
 
 #include "media/audio/tizen/capi_audio_output.h"
 
-#include <audio_io.h>
-
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/default_tick_clock.h"
 #include "media/audio/audio_manager_base.h"
 #include "media/base/audio_parameters.h"
+#include "tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.h"
 
 #if BUILDFLAG(IS_TIZEN_TV)
 #include "base/command_line.h"
@@ -60,7 +59,8 @@ CapiAudioOutputStream::CapiAudioOutputStream(const AudioParameters& params,
       volume_(1.0f),
       buffer_(NULL),
       state_(media::kIsClosed),
-      source_callback_(NULL) {
+      source_callback_(NULL),
+      proxy_(platform::CapiMediaAudioIoProxy::Get()) {
   LOG(INFO);
   DCHECK(manager_->GetTaskRunner()->BelongsToCurrentThread());
   CHECK(params_.IsValid());
@@ -82,7 +82,7 @@ bool CapiAudioOutputStream::Open() {
   LOG(INFO) << __func__ << " : state_ : " << static_cast<InternalState>(state_);
 
   if (AUDIO_IO_ERROR_NONE !=
-      audio_out_create_new(
+      proxy_->audio_out_create_new(
           params_.sample_rate(), ToCapiAudioEnum(params_.channel_layout()),
           ToCapiSampleType(kDefaultSampleFormat), &audio_out_)) {
     LOG(ERROR) << "Fail to create audio output";
@@ -110,7 +110,7 @@ bool CapiAudioOutputStream::Open() {
       stream_info = nullptr;
       return false;
     }
-    ret = audio_out_set_sound_stream_info(audio_out_, stream_info);
+    ret = proxy_->audio_out_set_sound_stream_info(audio_out_, stream_info);
     if (AUDIO_IO_ERROR_NONE != ret) {
       LOG(ERROR) << __func__ << " Fail to set stream info. ret : " << ret;
       return false;
@@ -149,13 +149,13 @@ void CapiAudioOutputStream::Start(AudioSourceCallback* callback) {
   LOG(INFO) << __func__ << " : state_ : " << static_cast<InternalState>(state_);
 
   if (AUDIO_IO_ERROR_NONE !=
-      audio_out_set_stream_cb(audio_out_, &AudioStreamWriteCB, this)) {
+      proxy_->audio_out_set_stream_cb(audio_out_, &AudioStreamWriteCB, this)) {
     LOG(ERROR) << "Fail to set audio output stream cb";
     HandleError();
     return;
   }
 
-  if (AUDIO_IO_ERROR_NONE != audio_out_prepare(audio_out_)) {
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_out_prepare(audio_out_)) {
     LOG(ERROR) << "Cannot prepare audio output";
     HandleError();
     return;
@@ -169,11 +169,11 @@ void CapiAudioOutputStream::Stop() {
   DCHECK(state_ == media::kIsStarted);
   LOG(INFO) << __func__ << " : state_ : " << static_cast<InternalState>(state_);
 
-  if (AUDIO_IO_ERROR_NONE != audio_out_unprepare(audio_out_)) {
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_out_unprepare(audio_out_)) {
     LOG(WARNING) << "Cannot unprepare audio output";
   }
 
-  if (AUDIO_IO_ERROR_NONE != audio_out_unset_stream_cb(audio_out_)) {
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_out_unset_stream_cb(audio_out_)) {
     LOG(WARNING) << "Cannot unset audio output cb";
   }
 
@@ -190,7 +190,7 @@ void CapiAudioOutputStream::Close() {
 
   state_ = media::kIsClosed;
 
-  audio_out_destroy(audio_out_);  // always success
+  proxy_->audio_out_destroy(audio_out_);  // always success
   audio_out_ = NULL;
   free(buffer_);
   manager_->ReleaseOutputStream(this);
@@ -213,7 +213,7 @@ void CapiAudioOutputStream::Flush() {
   if (state_ != media::kIsStarted)
     return;
 
-  int flush_status = audio_out_flush(audio_out_);
+  int flush_status = proxy_->audio_out_flush(audio_out_);
   if (flush_status != AUDIO_IO_ERROR_NONE) {
     LOG(ERROR) << "Flush Error Code "
                << GetString(static_cast<audio_io_error_e>(flush_status));
@@ -244,7 +244,7 @@ void CapiAudioOutputStream::WriteAudioData(size_t nbytes) {
     audio_bus_->ToInterleaved<media::SignedInt16SampleTypeTraits>(
         audio_bus_->frames(), reinterpret_cast<int16_t*>(buffer_));
 
-    int bytes_written = audio_out_write(audio_out_, buffer_, bytes_to_fill);
+    int bytes_written = proxy_->audio_out_write(audio_out_, buffer_, bytes_to_fill);
 
     if (bytes_written < 0) {
       if (source_callback_) {
index 943cce3b770083663a53c3e73ebd6487fd4e0ba9..5c87ac8c5adad41259adc1e6a18bb982860f757e 100644 (file)
@@ -8,7 +8,6 @@
 #ifndef MEDIA_AUDIO_TIZEN_CAPI_AUDIO_OUTPUT_H_
 #define MEDIA_AUDIO_TIZEN_CAPI_AUDIO_OUTPUT_H_
 
-#include <audio_io.h>
 #include <sound_manager.h>
 
 #include "base/threading/thread.h"
@@ -65,6 +64,7 @@ class CapiAudioOutputStream : public AudioOutputStream {
   media::InternalState state_;
   AudioSourceCallback* source_callback_;
   std::unique_ptr<AudioBus> audio_bus_;
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy_;
 };
 
 }  // namespace media
index 15cb4e7e17ac8d319e4699eea91f8a46ae0d7392..620c692270da3d0059492bc694172581d9413531 100644 (file)
@@ -4,7 +4,6 @@
 
 #include "media/audio/tizen/capi_bt_audio_input_stream.h"
 
-#include <audio_io.h>
 #include <sys/types.h>
 
 #include "base/functional/bind.h"
index 712fedc0ddfe6cc49408cff8a767dc53cd0525b5..443114ce983d43d4db8de6b2b299d7cc4d1b6fe2 100644 (file)
@@ -5,7 +5,6 @@
 #ifndef MEDIA_AUDIO_TIZEN_CAPI_BT_AUDIO_INPUT_STREAM_H_
 #define MEDIA_AUDIO_TIZEN_CAPI_BT_AUDIO_INPUT_STREAM_H_
 
-#include <audio_io.h>
 #include <string>
 
 #include "base/memory/weak_ptr.h"
index 525960b72af894a8e114bd2726839da44978b35b..e4c14be2581c07c15d63beb5c06bcc0b782391cc 100644 (file)
@@ -4,12 +4,12 @@
 
 #include "media/audio/tizen/capi_usb_audio_input_stream.h"
 
-#include <audio_io.h>
 #include <sys/types.h>
 
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "media/audio/tizen/audio_manager_capi.h"
+#include "tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.h"
 
 #if BUILDFLAG(IS_TIZEN_TV)
 #include "wrt/src/common/privilege.h"
@@ -27,7 +27,8 @@ CapiUsbAudioInputStream::CapiUsbAudioInputStream(
     AudioManagerCapi* audio_manager,
     const std::string& device_name,
     const AudioParameters& params)
-    : CapiAudioInputStream(audio_manager, params) {
+    : CapiAudioInputStream(audio_manager, params),
+      proxy_(platform::CapiMediaAudioIoProxy::Get()) {
   device_ = nullptr;
   device_name_ = device_name;
 #if BUILDFLAG(IS_TIZEN_TV)
@@ -149,7 +150,7 @@ bool CapiUsbAudioInputStream::OpenMic() {
   }
 #endif
 
-  ret = audio_in_create(params_.sample_rate(), AUDIO_CHANNEL_STEREO,
+  ret = proxy_->audio_in_create(params_.sample_rate(), AUDIO_CHANNEL_STEREO,
                         AUDIO_SAMPLE_TYPE_S16_LE, &device_);
   if (ret != AUDIO_IO_ERROR_NONE) {
     LOG(ERROR) << "audio_in_create failed. Err:" << ret;
@@ -158,7 +159,7 @@ bool CapiUsbAudioInputStream::OpenMic() {
   }
 
 #if BUILDFLAG(IS_TIZEN_TV)
-  ret = audio_in_set_sound_stream_info(device_, stream_info_);
+  ret = proxy_->audio_in_set_sound_stream_info(device_, stream_info_);
   if (ret != SOUND_MANAGER_ERROR_NONE) {
     LOG(ERROR) << "audio_in_set_sound_stream_info failed. Err:" << ret;
     CloseMic(false);
@@ -174,7 +175,7 @@ void CapiUsbAudioInputStream::StartMic() {
   DCHECK(device_);
   LOG(INFO);
 
-  int ret = audio_in_set_stream_cb(device_, &AudioStreamReadCB, this);
+  int ret = proxy_->audio_in_set_stream_cb(device_, &AudioStreamReadCB, this);
   if (ret != AUDIO_IO_ERROR_NONE) {
     LOG(ERROR) << "audio_in_set_stream_cb failed. Err:" << ret;
     if (callback_)
@@ -185,7 +186,7 @@ void CapiUsbAudioInputStream::StartMic() {
   audio_worker_.Start();
   StartAgc();
 
-  ret = audio_in_prepare(device_);
+  ret = proxy_->audio_in_prepare(device_);
   if (ret != AUDIO_IO_ERROR_NONE) {
     LOG(ERROR) << "Cannot prepare audio input. Err:" << ret;
     if (callback_)
@@ -200,10 +201,10 @@ void CapiUsbAudioInputStream::StopMic() {
   DCHECK(device_);
   LOG(INFO);
 
-  if (AUDIO_IO_ERROR_NONE != audio_in_unprepare(device_))
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_in_unprepare(device_))
     LOG(WARNING) << "Cannot unprepare audio input";
 
-  if (AUDIO_IO_ERROR_NONE != audio_in_unset_stream_cb(device_))
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_in_unset_stream_cb(device_))
     LOG(WARNING) << "Cannot unset audio input cb";
 }
 
@@ -252,7 +253,7 @@ void CapiUsbAudioInputStream::CloseMic(bool success) {
 #endif
 
   if (device_) {
-    int ret = audio_in_destroy(device_);
+    int ret = proxy_->audio_in_destroy(device_);
     if (ret != AUDIO_IO_ERROR_NONE)
       LOG(WARNING) << "audio_in_destroy failed. Err:" << ret;
 
@@ -267,7 +268,7 @@ void CapiUsbAudioInputStream::ReadAudioData() {
   unsigned int bytes_read = 0;
   const void* loc_buff = nullptr;
 
-  if (AUDIO_IO_ERROR_NONE != audio_in_peek(device_, &loc_buff, &bytes_read)) {
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_in_peek(device_, &loc_buff, &bytes_read)) {
     LOG(ERROR) << "audio_in_peek() failed";
     if (callback_)
       callback_->OnError();
@@ -314,7 +315,7 @@ void CapiUsbAudioInputStream::ReadAudioData() {
     }
   }
 
-  if (AUDIO_IO_ERROR_NONE != audio_in_drop(device_)) {
+  if (AUDIO_IO_ERROR_NONE != proxy_->audio_in_drop(device_)) {
     LOG(ERROR) << "audio_in_drop() failed";
     if (callback_)
       callback_->OnError();
index ab19405f64af1eeba9019da43ffb4fb0a0d9cd64..cf819e2d59dee2efd94e14e75ab1478f08ff2020 100644 (file)
@@ -5,7 +5,6 @@
 #ifndef MEDIA_AUDIO_TIZEN_CAPI_USB_AUDIO_INPUT_STREAM_H_
 #define MEDIA_AUDIO_TIZEN_CAPI_USB_AUDIO_INPUT_STREAM_H_
 
-#include <audio_io.h>
 #include <string>
 
 #include "base/memory/weak_ptr.h"
@@ -18,6 +17,7 @@
 #include "media/audio/tizen/capi_util.h"
 #include "media/base/audio_block_fifo.h"
 #include "media/base/audio_parameters.h"
+
 namespace media {
 
 class CapiUsbAudioInputStream final : public CapiAudioInputStream {
@@ -53,6 +53,7 @@ class CapiUsbAudioInputStream final : public CapiAudioInputStream {
   sound_device_h sound_device_;
   sound_stream_info_h stream_info_;
 #endif
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy_;
 };
 
 }  // namespace media
index 34505615079f694eb7af0593c83c6b66e86ad2ab..179fa3c8c1854469e29c5f9301273c9e0ba46fdd 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "base/time/time.h"
+#include "tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.h"
 
 namespace media {
 
@@ -27,9 +28,11 @@ int GetAudioInputBufferSize(audio_in_h audio_in) {
   bool local_audio_handle = false;
   int err = AUDIO_IO_ERROR_NONE;
 
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy
+       = platform::CapiMediaAudioIoProxy::Get();
   if (audio_in) {
     // |audio_in| is created as well as prepared.
-    err = audio_in_get_buffer_size(audio_in, &buffer_size);
+    err = proxy->audio_in_get_buffer_size(audio_in, &buffer_size);
     if (AUDIO_IO_ERROR_NONE == err && buffer_size > 0) {
       return buffer_size;
     } else {
@@ -37,7 +40,7 @@ int GetAudioInputBufferSize(audio_in_h audio_in) {
     }
   } else {
     // create |audio_in| locally to get buffer size.
-    err = audio_in_create(kDefaultSampleRate, AUDIO_CHANNEL_STEREO,
+    err = proxy->audio_in_create(kDefaultSampleRate, AUDIO_CHANNEL_STEREO,
                           AUDIO_SAMPLE_TYPE_S16_LE, &audio_in);
     if (AUDIO_IO_ERROR_NONE != err) {
       LOG(ERROR) << "audio_in_create() failed, Error code " << err;
@@ -47,12 +50,12 @@ int GetAudioInputBufferSize(audio_in_h audio_in) {
   }
 
   if (AUDIO_IO_ERROR_NONE == audio_in_prepare(audio_in)) {
-    audio_in_get_buffer_size(audio_in, &buffer_size);
-    audio_in_unprepare(audio_in);
+    proxy->audio_in_get_buffer_size(audio_in, &buffer_size);
+    proxy->audio_in_unprepare(audio_in);
   }
 
   if (local_audio_handle) {
-    audio_in_destroy(audio_in);
+    proxy->audio_in_destroy(audio_in);
   }
   return buffer_size;
 }
@@ -65,9 +68,11 @@ int GetAudioOutputBufferSize(audio_out_h audio_out,
   bool local_audio_handle = false;
   int err = AUDIO_IO_ERROR_NONE;
 
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy
+       = platform::CapiMediaAudioIoProxy::Get();
   if (audio_out) {
     // |audio_out| is created as well as prepared.
-    err = audio_out_get_buffer_size(audio_out, &buffer_size);
+    err = proxy->audio_out_get_buffer_size(audio_out, &buffer_size);
     if (AUDIO_IO_ERROR_NONE == err && buffer_size > 0) {
       return buffer_size;
     } else {
@@ -75,7 +80,7 @@ int GetAudioOutputBufferSize(audio_out_h audio_out,
     }
   } else {
     // create |audio_out| locally to get buffer size.
-    err = audio_out_create_new(sample_rate, ToCapiAudioEnum(channel_layout),
+    err = proxy->audio_out_create_new(sample_rate, ToCapiAudioEnum(channel_layout),
                                ToCapiSampleType(sample_format), &audio_out);
     if (AUDIO_IO_ERROR_NONE != err) {
       LOG(ERROR) << "audio_out_create_new() failed, Error code " << err;
@@ -84,13 +89,13 @@ int GetAudioOutputBufferSize(audio_out_h audio_out,
     local_audio_handle = true;
   }
 
-  if (AUDIO_IO_ERROR_NONE == audio_out_prepare(audio_out)) {
-    audio_out_get_buffer_size(audio_out, &buffer_size);
-    audio_out_unprepare(audio_out);
+  if (AUDIO_IO_ERROR_NONE == proxy->audio_out_prepare(audio_out)) {
+    proxy->audio_out_get_buffer_size(audio_out, &buffer_size);
+    proxy->audio_out_unprepare(audio_out);
   }
 
   if (local_audio_handle) {
-    audio_out_destroy(audio_out);
+    proxy->audio_out_destroy(audio_out);
   }
   return buffer_size;
 }
@@ -100,14 +105,16 @@ int GetAudioOutputSampleRate(audio_out_h audio_out,
                              media::ChannelLayout channel_layout,
                              SampleFormat sample_format) {
   int err = AUDIO_IO_ERROR_NONE;
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy
+       = platform::CapiMediaAudioIoProxy::Get();
 
   // If NULL try to create audio handle with passed sample rate.
   if (audio_out == NULL) {
-    err = audio_out_create_new(sample_rate, ToCapiAudioEnum(channel_layout),
+    err = proxy->audio_out_create_new(sample_rate, ToCapiAudioEnum(channel_layout),
                                ToCapiSampleType(sample_format), &audio_out);
 
     if (AUDIO_IO_ERROR_NONE == err) {
-      audio_out_destroy(audio_out);
+      proxy->audio_out_destroy(audio_out);
       return sample_rate;
     }
     return 0;
@@ -115,7 +122,7 @@ int GetAudioOutputSampleRate(audio_out_h audio_out,
 
   // If not NULL get samplerate of passed audio_out handle.
   if (AUDIO_IO_ERROR_NONE !=
-      audio_out_get_sample_rate(audio_out, &sample_rate)) {
+      proxy->audio_out_get_sample_rate(audio_out, &sample_rate)) {
     return 0;
   }
 
@@ -136,9 +143,11 @@ int GetAudioInLatencyInBytes(audio_in_h audio_in, int bytes_per_frame) {
   // FIXME: Find a way to get audio input device latency.
   static int latency_milli = 0;
   static int sample_rate = 0;
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy
+       = platform::CapiMediaAudioIoProxy::Get();
 
   if (sample_rate == 0 &&
-      AUDIO_IO_ERROR_NONE != audio_in_get_sample_rate(audio_in, &sample_rate))
+      AUDIO_IO_ERROR_NONE != proxy->audio_in_get_sample_rate(audio_in, &sample_rate))
     return 0;
 
   return LatencyInBytes(latency_milli, sample_rate, bytes_per_frame);
@@ -149,9 +158,11 @@ int GetAudioOutLatencyInBytes(audio_out_h audio_out, int bytes_per_frame) {
   // FIXME: Find a way to get audio output device latency.
   static int latency_milli = 0;
   static int sample_rate = 0;
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy
+       = platform::CapiMediaAudioIoProxy::Get();
 
   if (sample_rate == 0 &&
-      AUDIO_IO_ERROR_NONE != audio_out_get_sample_rate(audio_out, &sample_rate))
+      AUDIO_IO_ERROR_NONE != proxy->audio_out_get_sample_rate(audio_out, &sample_rate))
     return 0;
 
   return LatencyInBytes(latency_milli, sample_rate, bytes_per_frame);
index d4c8dd26b77d1e4159c1617becfc682ec3dcf236..c055f2d0f1ad2622ac36ca86ef030d74f95957dd 100644 (file)
@@ -8,9 +8,8 @@
 #ifndef MEDIA_AUDIO_TIZEN_CAPI_UTIL_H_
 #define MEDIA_AUDIO_TIZEN_CAPI_UTIL_H_
 
-#include <audio_io.h>
-
 #include "media/base/audio_parameters.h"
+#include "tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.h"
 
 namespace media {
 
index 0e47fb4e46a0070edfa6c7f2464f27b81aeb2fd8..0da9f17cf3eb7643cda99858ccff52484907c08f 100644 (file)
@@ -8,6 +8,7 @@
 #include "media/audio/audio_manager_base.h"
 #include "media/base/data_buffer.h"
 #include "media/base/tizen/logger/media_logger.h"
+#include "tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.h"
 
 namespace media {
 
@@ -49,7 +50,8 @@ SoftwareFallbackOutputStream::SoftwareFallbackOutputStream(
       channel_layout_{in_params_.channels() > 1 ? AUDIO_CHANNEL_STEREO
                                                 : AUDIO_CHANNEL_MONO},
       manager_{manager},
-      task_runner_{base::SingleThreadTaskRunner::GetCurrentDefault()} {
+      task_runner_{base::SingleThreadTaskRunner::GetCurrentDefault()},
+      proxy_(platform::CapiMediaAudioIoProxy::Get()) {
   TIZEN_MEDIA_LOG(INFO) << "Configuration: "
                         << in_params_.AsHumanReadableString();
   in_audio_bus_ = AudioBus::Create(params);
@@ -77,20 +79,20 @@ bool SoftwareFallbackOutputStream::Open() {
 
 bool SoftwareFallbackOutputStream::CreateAudioOut() {
   TIZEN_MEDIA_LOG(INFO);
-  int err = audio_out_create_new(out_params_.sample_rate(), channel_layout_,
+  int err = proxy_->audio_out_create_new(out_params_.sample_rate(), channel_layout_,
                                  AUDIO_SAMPLE_TYPE_S16_LE, &audio_out_);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(ERROR) << "Failed to create audio_io output: " << err;
     return false;
   }
 
-  err = audio_out_set_stream_cb(audio_out_, &OnAudioIONeedDataCb, this);
+  err = proxy_->audio_out_set_stream_cb(audio_out_, &OnAudioIONeedDataCb, this);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(ERROR) << "Fail to set audio output stream cb";
     return false;
   }
 
-  // TODO(vd.wasm) audio_out_set_sound_stream_info
+  // TODO(vd.wasm) proxy_->audio_out_set_sound_stream_info
   return true;
 }
 
@@ -100,12 +102,12 @@ void SoftwareFallbackOutputStream::Close() {
     return;
   }
 
-  int err = audio_out_unset_stream_cb(audio_out_);
+  int err = proxy_->audio_out_unset_stream_cb(audio_out_);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(WARNING) << "Fail to unset stream callback";
   }
 
-  err = audio_out_destroy(audio_out_);
+  err = proxy_->audio_out_destroy(audio_out_);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(ERROR) << "Failed to create audio_io output: " << err;
   }
@@ -132,7 +134,7 @@ void SoftwareFallbackOutputStream::Start(
     return;
   }
 
-  int err = audio_out_prepare(audio_out_);
+  int err = proxy_->audio_out_prepare(audio_out_);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(ERROR) << "Failed to prepare audio_out";
     callback->OnError(AudioSourceCallback::ErrorType::kDeviceChange);
@@ -153,7 +155,7 @@ void SoftwareFallbackOutputStream::Stop() {
     return;
   }
 
-  int err = audio_out_unprepare(audio_out_);
+  int err = proxy_->audio_out_unprepare(audio_out_);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(WARNING) << "Failed to unprepare audio_out, err: " << err;
   }
@@ -170,7 +172,7 @@ void SoftwareFallbackOutputStream::Flush() {
     if (!written.is_positive()) break;
   }
 
-  int err = audio_out_drain(audio_out_);
+  int err = proxy_->audio_out_drain(audio_out_);
   if (err != AUDIO_IO_ERROR_NONE) {
     TIZEN_MEDIA_LOG(WARNING) << "Failed to drain audio_out, err: " << err;
   }
@@ -281,7 +283,7 @@ base::TimeDelta SoftwareFallbackOutputStream::WritePacket() {
       (bytes_per_second * kDefaultChunkDuration.InMilliseconds()) /
       base::Time::kMillisecondsPerSecond;
   const int write_size = std::min(buffer_size, max_write_size);
-  int write_ret = audio_out_write(
+  int write_ret = proxy_->audio_out_write(
       audio_out_, const_cast<uint8_t*>(buffer_data), write_size);
   if (write_ret > 0) {
     bytes_written_ += write_ret;
index f5af48d1623bae548671dcc1826d592086cca9ce..f3f1eb30f32b19eb970860e0755101fd31aff72d 100644 (file)
 #include "media/base/channel_mixer.h"
 #include "media/base/seekable_buffer.h"
 
+namespace platform {
+class CapiMediaAudioIoProxy;
+}
+
 namespace media {
 
 class AudioManagerBase;
@@ -103,6 +107,7 @@ class MEDIA_EXPORT SoftwareFallbackOutputStream : public AudioOutputStream {
   base::WeakPtrFactory<SoftwareFallbackOutputStream> weak_factory_{this};
 
   const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  std::shared_ptr<platform::CapiMediaAudioIoProxy> proxy_;
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
index dd1683825d72dea0629dc60e9e82de742d3362a0..663e21671c12a715152b8b4bf0083b642cff65c0 100644 (file)
@@ -202,11 +202,6 @@ if (tizen_multimedia) {
 }
 
 if (tizen_audio_io) {
-  external_media_efl_audio_io_config += [
-    "//tizen_src/build:capi-media-audio-io",
-    "//tizen_src/build:libcapi-media-audio-io",
-  ]
-
   external_media_efl_audio_io_sources += [
     "//tizen_src/chromium_impl/media/audio/tizen/audio_manager_capi.cc",
     "//tizen_src/chromium_impl/media/audio/tizen/audio_manager_capi.h",
@@ -220,6 +215,10 @@ if (tizen_audio_io) {
     "//tizen_src/chromium_impl/media/audio/tizen/capi_util.h",
   ]
 
+  external_media_efl_audio_io_deps += [
+    "//tizen_src/platform/capi-media-audio-io:capi-media-audio-io-proxy",
+  ]
+
   if (tizen_product_tv) {
     external_media_efl_audio_io_sources += [
       "//tizen_src/chromium_impl/media/audio/tizen/audio_device_listener_tizen.cc",
index bcd1993009b8239bbfe484ef1669e0f05bca6d0c..95561fca982b1d49d72c80a4ed26c536da173972 100644 (file)
@@ -305,6 +305,14 @@ def read_pkgconfig_file(package_info):
                 if libname_match:
                     libname = "lib" + libname_match.group(1) + ".so"
 
+    for base_dir in base_dirs:
+      file_path = f"{base_dir}/{libname}"
+      if os.path.exists(file_path):
+        if os.path.islink(file_path):
+          target_path = os.readlink(file_path)
+          libname = os.path.basename(target_path)
+        break
+
     if not includedir:
         raise ValueError(f"includedir not found in pkg-config file: {pc_file}")
     if not libname:
diff --git a/tizen_src/platform/capi-media-audio-io/BUILD.gn b/tizen_src/platform/capi-media-audio-io/BUILD.gn
new file mode 100644 (file)
index 0000000..e96dcb2
--- /dev/null
@@ -0,0 +1,20 @@
+# Copyright (c) 2025 Samsung Electronics. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tizen_src/build/config/linux/pkg_config.gni")
+import("//tizen_src/platform/tizen_proxy_source_set.gni")
+
+tizen_pkg_config("capi-media-audio-io-config") {
+  packages = []
+  if (is_tizen) {
+    packages = [ "capi-media-audio-io" ]
+    # If ignore_libs true, it ignores explicit dynamic linking flag.
+    ignore_libs = true
+  }
+}
+
+tizen_proxy_source_set("capi-media-audio-io-proxy") {
+  public_configs = [ ":capi-media-audio-io-config" ]
+  config = "capi_media_audio_io_proxy.json"
+}
diff --git a/tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.json b/tizen_src/platform/capi-media-audio-io/capi_media_audio_io_proxy.json
new file mode 100644 (file)
index 0000000..fb1ac2c
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "name": "CapiMediaAudioIoProxy",
+  "package": "capi-media-audio-io",
+  "headers": ["audio_io.h"],
+  "functions": [
+    "audio_in_create",
+    "audio_in_destroy",
+    "audio_in_drop",
+    "audio_in_get_buffer_size",
+    "audio_in_get_sample_rate",
+    "audio_in_peek",
+    "audio_in_prepare",
+    "audio_in_set_sound_stream_info",
+    "audio_in_set_stream_cb",
+    "audio_in_unprepare",
+    "audio_in_unset_stream_cb",
+    "audio_out_create_new",
+    "audio_out_destroy",
+    "audio_out_drain",
+    "audio_out_flush",
+    "audio_out_get_buffer_size",
+    "audio_out_get_sample_rate",
+    "audio_out_prepare",
+    "audio_out_set_sound_stream_info",
+    "audio_out_set_stream_cb",
+    "audio_out_unprepare",
+    "audio_out_unset_stream_cb",
+    "audio_out_write"
+  ]
+}