Skip to content

Commit 7a93979

Browse files
authored
Merge pull request #172 from shiguredo/feature/update-sora-cpp-sdk-2025.4.0-canary.8
[WIP] Sora C++ SDK のバージョンを 2025.4.0-canary.8 に上げる
2 parents 1f52bc5 + 43ad709 commit 7a93979

9 files changed

+48
-52
lines changed

CHANGES.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,17 @@
1111

1212
## develop
1313

14-
- [UPDATE] Sora C++ SDK のバージョンを `2025.4.0-canary.1` に上げる
15-
- WEBRTC_BUILD_VERSION を `m137.7151.3.0` に上げる
16-
- CMAKE_VERSION を `4.0.2` に上げる
17-
- @melpon
14+
- [UPDATE] Sora C++ SDK のバージョンを `2025.4.0-canary.8` に上げる
15+
- WEBRTC_BUILD_VERSION を `m138.7204.0.0` に上げる
16+
- `ACMResampler` の廃止に伴い、`PushResampler` を利用するように変更
17+
- `acm_resampler.h` のインクルードを削除して、`push_resampler.h` をインクルードするように変更
18+
- `Resample10Msec` から `Resample` へ変更
19+
- `Resample10Msec` で一度に行っていた入力と出力のサンプリングを `webrtc::InterleavedView` を利用してシンプルに行うように変更
20+
- PeerConnectionFactoryDependendencies の `audio_processing` は廃止されたので削除
21+
- `default_task_queue_factory.h` のインクルードを削除
22+
- `dependencies.task_queue_factory` は廃止されたので `env` 経由で取得するように変更
23+
- CMAKE_VERSION を `4.0.3` に上げる
24+
- @melpon @torikizi
1825
- [UPDATE] Ubuntu arm64 では Clang 19 に上げる
1926
- libwebrtc m137 を上げたことで clang 18 ではビルドが通らなくなったため
2027
- @voluntas

DEPS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
SORA_CPP_SDK_VERSION=2025.4.0-canary.7
2-
WEBRTC_BUILD_VERSION=m137.7151.3.0
1+
SORA_CPP_SDK_VERSION=2025.4.0-canary.8
2+
WEBRTC_BUILD_VERSION=m138.7204.0.0
33
BOOST_VERSION=1.88.0
4-
CMAKE_VERSION=4.0.2
4+
CMAKE_VERSION=4.0.3
55
OPENH264_VERSION=v2.6.0

src/dummy_audio_mixer.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ struct DummyAudioMixer::SourceStatus {
1010
};
1111

1212
webrtc::scoped_refptr<DummyAudioMixer> DummyAudioMixer::Create(
13-
webrtc::TaskQueueFactory* task_queue_factory) {
14-
return webrtc::make_ref_counted<DummyAudioMixer>(task_queue_factory);
13+
const webrtc::Environment& env) {
14+
return webrtc::make_ref_counted<DummyAudioMixer>(env);
1515
}
1616

1717
void DummyAudioMixer::Mix(size_t number_of_channels,
@@ -47,14 +47,13 @@ void DummyAudioMixer::RemoveSource(Source* audio_source) {
4747
audio_source_list_.erase(iter);
4848
}
4949

50-
DummyAudioMixer::DummyAudioMixer(webrtc::TaskQueueFactory* task_queue_factory)
51-
: task_queue_factory_(task_queue_factory) {
50+
DummyAudioMixer::DummyAudioMixer(const webrtc::Environment& env) : env_(env) {
5251
/**
5352
* 通常 webrtc::AudioMixer の Mix は音声出力デバイスのループで呼ばれるが、
5453
* sora::SoraClientContextConfig::use_audio_device を false にした際に設定される、
5554
* webrtc::AudioDeviceDummy はループを回さないため、ここでループを作ることとした。
5655
*/
57-
task_queue_ = task_queue_factory_->CreateTaskQueue(
56+
task_queue_ = env_.task_queue_factory().CreateTaskQueue(
5857
"TestAudioDeviceModuleImpl", webrtc::TaskQueueFactory::Priority::NORMAL);
5958

6059
handle_ = webrtc::RepeatingTaskHandle::Start(task_queue_.get(), [this]() {

src/dummy_audio_mixer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
// WebRTC
77
#include <api/audio/audio_frame.h>
88
#include <api/audio/audio_mixer.h>
9+
#include <api/environment/environment.h>
910
#include <api/scoped_refptr.h>
1011
#include <api/task_queue/task_queue_base.h>
11-
#include <api/task_queue/task_queue_factory.h>
1212
#include <rtc_base/synchronization/mutex.h>
1313
#include <rtc_base/task_utils/repeating_task.h>
1414
#include <rtc_base/thread_annotations.h>
@@ -29,7 +29,7 @@ class DummyAudioMixer : public webrtc::AudioMixer {
2929
public:
3030
struct SourceStatus;
3131
static webrtc::scoped_refptr<DummyAudioMixer> Create(
32-
webrtc::TaskQueueFactory* task_queue_factory);
32+
const webrtc::Environment& env);
3333
~DummyAudioMixer();
3434

3535
// AudioMixer functions
@@ -41,11 +41,11 @@ class DummyAudioMixer : public webrtc::AudioMixer {
4141
RTC_LOCKS_EXCLUDED(mutex_);
4242

4343
protected:
44-
DummyAudioMixer(webrtc::TaskQueueFactory* task_queue_factory);
44+
DummyAudioMixer(const webrtc::Environment& env);
4545

4646
private:
4747
void ProcessAudio();
48-
const webrtc::TaskQueueFactory* task_queue_factory_;
48+
const webrtc::Environment env_;
4949
std::unique_ptr<webrtc::TaskQueueBase, webrtc::TaskQueueDeleter> task_queue_;
5050
webrtc::RepeatingTaskHandle handle_;
5151

src/sora_audio_sink.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,14 @@ void SoraAudioSinkImpl::OnData(
6262
bool need_resample =
6363
output_sample_rate_ != -1 && sample_rate != output_sample_rate_;
6464
if (need_resample) {
65-
int samples_per_channel_int = resampler_.Resample10Msec(
66-
static_cast<const int16_t*>(audio_data), sample_rate,
67-
output_sample_rate_, number_of_channels,
68-
webrtc::AudioFrame::kMaxDataSizeSamples, audio_frame_->mutable_data());
69-
if (samples_per_channel_int < 0) {
70-
return;
71-
}
72-
audio_frame_->samples_per_channel_ =
73-
static_cast<size_t>(samples_per_channel_int);
74-
audio_frame_->sample_rate_hz_ = output_sample_rate_;
65+
webrtc::InterleavedView<const int16_t> src(
66+
static_cast<const int16_t*>(audio_data), number_of_frames,
67+
number_of_channels);
68+
webrtc::InterleavedView<int16_t> dst = audio_frame_->mutable_data(
69+
webrtc::SampleRateToDefaultChannelSize(output_sample_rate_),
70+
number_of_channels);
71+
resampler_.Resample(src, dst);
72+
audio_frame_->SetSampleRateAndChannelSize(output_sample_rate_);
7573
audio_frame_->num_channels_ = number_of_channels;
7674
// channel_layout_ は private になったので一旦コメントアウトする
7775
// https://webrtc-review.googlesource.com/c/src/+/349322

src/sora_audio_sink.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <api/audio/audio_frame.h>
1313
#include <api/media_stream_interface.h>
1414
#include <api/scoped_refptr.h>
15-
#include <modules/audio_coding/acm2/acm_resampler.h>
15+
#include <common_audio/resampler/include/push_resampler.h>
1616
#include <rtc_base/buffer.h>
1717

1818
#include "sora_track_interface.h"
@@ -40,14 +40,14 @@ class SoraAudioSinkImpl : public webrtc::AudioTrackSinkInterface,
4040
int output_sample_rate,
4141
size_t output_channels);
4242
~SoraAudioSinkImpl();
43-
43+
4444
// コピーコンストラクタとコピー代入演算子を削除
4545
// このクラスは WebRTC のオーディオトラックに唯一のシンクとして登録され、
4646
// 内部バッファやミューテックスなどの同期リソースを管理しているため、
4747
// コピーやムーブを禁止して所有権を明確にしている
4848
SoraAudioSinkImpl(const SoraAudioSinkImpl&) = delete;
4949
SoraAudioSinkImpl& operator=(const SoraAudioSinkImpl&) = delete;
50-
50+
5151
// ムーブコンストラクタとムーブ代入演算子を削除
5252
SoraAudioSinkImpl(SoraAudioSinkImpl&&) = delete;
5353
SoraAudioSinkImpl& operator=(SoraAudioSinkImpl&&) = delete;
@@ -90,7 +90,7 @@ class SoraAudioSinkImpl : public webrtc::AudioTrackSinkInterface,
9090
const int output_sample_rate_;
9191
const size_t output_channels_;
9292
std::unique_ptr<webrtc::AudioFrame> audio_frame_;
93-
webrtc::acm2::ACMResampler resampler_;
93+
webrtc::PushResampler<int16_t> resampler_;
9494
std::mutex buffer_mtx_;
9595
std::condition_variable buffer_cond_;
9696
webrtc::BufferT<int16_t> buffer_;

src/sora_audio_stream_sink.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,16 +193,12 @@ void SoraAudioStreamSinkImpl::OnData(
193193
bool need_resample = output_sample_rate_ != -1 &&
194194
tuned_frame->sample_rate_hz() != output_sample_rate_;
195195
if (need_resample) {
196-
int samples_per_channel_int = resampler_.Resample10Msec(
197-
tuned_frame->data(), tuned_frame->sample_rate_hz(), output_sample_rate_,
198-
tuned_frame->num_channels(), webrtc::AudioFrame::kMaxDataSizeSamples,
199-
tuned_frame->mutable_data());
200-
if (samples_per_channel_int < 0) {
201-
return;
202-
}
203-
tuned_frame->samples_per_channel_ =
204-
static_cast<size_t>(samples_per_channel_int);
205-
tuned_frame->sample_rate_hz_ = output_sample_rate_;
196+
webrtc::InterleavedView<const int16_t> src = tuned_frame->data_view();
197+
webrtc::InterleavedView<int16_t> dst = tuned_frame->mutable_data(
198+
webrtc::SampleRateToDefaultChannelSize(output_sample_rate_),
199+
tuned_frame->num_channels());
200+
resampler_.Resample(src, dst);
201+
tuned_frame->SetSampleRateAndChannelSize(output_sample_rate_);
206202
}
207203
// Remix して channel 数を揃える
208204
if (output_channels_ != 0 &&

src/sora_audio_stream_sink.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include <api/audio/audio_frame.h>
1212
#include <api/media_stream_interface.h>
1313
#include <api/scoped_refptr.h>
14-
#include <modules/audio_coding/acm2/acm_resampler.h>
14+
#include <common_audio/resampler/include/push_resampler.h>
1515

1616
#include "sora_track_interface.h"
1717

@@ -195,7 +195,7 @@ class SoraAudioStreamSinkImpl : public webrtc::AudioTrackSinkInterface,
195195
SoraTrackInterface* track_;
196196
const int output_sample_rate_;
197197
const size_t output_channels_;
198-
webrtc::acm2::ACMResampler resampler_;
198+
webrtc::PushResampler<int16_t> resampler_;
199199
};
200200

201-
#endif
201+
#endif

src/sora_factory.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include <api/create_peerconnection_factory.h>
88
#include <api/environment/environment_factory.h>
99
#include <api/rtc_event_log/rtc_event_log_factory.h>
10-
#include <api/task_queue/default_task_queue_factory.h>
1110
#include <media/engine/webrtc_media_engine.h>
1211
#include <rtc_base/ssl_adapter.h>
1312

@@ -32,6 +31,7 @@
3231
SoraFactory::SoraFactory(
3332
std::optional<std::string> openh264,
3433
std::optional<sora::VideoCodecPreference> video_codec_preference) {
34+
auto env = webrtc::CreateEnvironment();
3535
sora::SoraClientContextConfig context_config;
3636
context_config.video_codec_factory_config.capability_config.openh264_path =
3737
openh264;
@@ -48,15 +48,11 @@ SoraFactory::SoraFactory(
4848
// Audio デバイスは使わない、 use_audio_device を true にしただけでデバイスを掴んでしまうので常に false
4949
context_config.use_audio_device = false;
5050
context_config.configure_dependencies =
51-
[openh264](webrtc::PeerConnectionFactoryDependencies& dependencies) {
51+
[openh264,
52+
&env](webrtc::PeerConnectionFactoryDependencies& dependencies) {
5253
// 通常の AudioMixer を使うと use_audio_device が false のとき、音声のループは全て止まってしまうので自前の AudioMixer を使う
53-
dependencies.audio_mixer =
54-
dependencies.worker_thread->BlockingCall([&]() {
55-
return DummyAudioMixer::Create(
56-
dependencies.task_queue_factory.get());
57-
});
58-
// アンチエコーやゲインコントロール、ノイズサプレッションが必要になる用途は想定していないため nullptr
59-
dependencies.audio_processing = nullptr;
54+
dependencies.audio_mixer = dependencies.worker_thread->BlockingCall(
55+
[&env]() { return DummyAudioMixer::Create(env); });
6056
};
6157
context_ = sora::SoraClientContext::Create(context_config);
6258
if (context_ == nullptr) {

0 commit comments

Comments
 (0)