[sigslot] - Remove sigslot from MediaStreamObserver.

Bug: webrtc:11943
Change-Id: Icf91ce850913c26e45dbca1940cafd600c235ad4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/227340
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34632}
This commit is contained in:
Mirko Bonadei
2021-08-02 10:56:33 +02:00
committed by WebRTC LUCI CQ
parent 57c2bbd661
commit 9ff450d0c4
5 changed files with 88 additions and 43 deletions

View File

@ -10,17 +10,32 @@
#include "pc/media_stream_observer.h" #include "pc/media_stream_observer.h"
#include <functional>
#include <string> #include <string>
#include <utility>
#include <vector> #include <vector>
#include "absl/algorithm/container.h" #include "absl/algorithm/container.h"
namespace webrtc { namespace webrtc {
MediaStreamObserver::MediaStreamObserver(MediaStreamInterface* stream) MediaStreamObserver::MediaStreamObserver(
MediaStreamInterface* stream,
std::function<void(AudioTrackInterface*, MediaStreamInterface*)>
audio_track_added_callback,
std::function<void(AudioTrackInterface*, MediaStreamInterface*)>
audio_track_removed_callback,
std::function<void(VideoTrackInterface*, MediaStreamInterface*)>
video_track_added_callback,
std::function<void(VideoTrackInterface*, MediaStreamInterface*)>
video_track_removed_callback)
: stream_(stream), : stream_(stream),
cached_audio_tracks_(stream->GetAudioTracks()), cached_audio_tracks_(stream->GetAudioTracks()),
cached_video_tracks_(stream->GetVideoTracks()) { cached_video_tracks_(stream->GetVideoTracks()),
audio_track_added_callback_(std::move(audio_track_added_callback)),
audio_track_removed_callback_(std::move(audio_track_removed_callback)),
video_track_added_callback_(std::move(video_track_added_callback)),
video_track_removed_callback_(std::move(video_track_removed_callback)) {
stream_->RegisterObserver(this); stream_->RegisterObserver(this);
} }
@ -39,7 +54,7 @@ void MediaStreamObserver::OnChanged() {
[cached_track](const AudioTrackVector::value_type& new_track) { [cached_track](const AudioTrackVector::value_type& new_track) {
return new_track->id() == cached_track->id(); return new_track->id() == cached_track->id();
})) { })) {
SignalAudioTrackRemoved(cached_track.get(), stream_); audio_track_removed_callback_(cached_track.get(), stream_);
} }
} }
@ -50,7 +65,7 @@ void MediaStreamObserver::OnChanged() {
[new_track](const AudioTrackVector::value_type& cached_track) { [new_track](const AudioTrackVector::value_type& cached_track) {
return new_track->id() == cached_track->id(); return new_track->id() == cached_track->id();
})) { })) {
SignalAudioTrackAdded(new_track.get(), stream_); audio_track_added_callback_(new_track.get(), stream_);
} }
} }
@ -61,7 +76,7 @@ void MediaStreamObserver::OnChanged() {
[cached_track](const VideoTrackVector::value_type& new_track) { [cached_track](const VideoTrackVector::value_type& new_track) {
return new_track->id() == cached_track->id(); return new_track->id() == cached_track->id();
})) { })) {
SignalVideoTrackRemoved(cached_track.get(), stream_); video_track_removed_callback_(cached_track.get(), stream_);
} }
} }
@ -72,7 +87,7 @@ void MediaStreamObserver::OnChanged() {
[new_track](const VideoTrackVector::value_type& cached_track) { [new_track](const VideoTrackVector::value_type& cached_track) {
return new_track->id() == cached_track->id(); return new_track->id() == cached_track->id();
})) { })) {
SignalVideoTrackAdded(new_track.get(), stream_); video_track_added_callback_(new_track.get(), stream_);
} }
} }

View File

@ -11,9 +11,10 @@
#ifndef PC_MEDIA_STREAM_OBSERVER_H_ #ifndef PC_MEDIA_STREAM_OBSERVER_H_
#define PC_MEDIA_STREAM_OBSERVER_H_ #define PC_MEDIA_STREAM_OBSERVER_H_
#include <functional>
#include "api/media_stream_interface.h" #include "api/media_stream_interface.h"
#include "api/scoped_refptr.h" #include "api/scoped_refptr.h"
#include "rtc_base/third_party/sigslot/sigslot.h"
namespace webrtc { namespace webrtc {
@ -21,26 +22,34 @@ namespace webrtc {
// corresponding signals. // corresponding signals.
class MediaStreamObserver : public ObserverInterface { class MediaStreamObserver : public ObserverInterface {
public: public:
explicit MediaStreamObserver(MediaStreamInterface* stream); explicit MediaStreamObserver(
MediaStreamInterface* stream,
std::function<void(AudioTrackInterface*, MediaStreamInterface*)>
audio_track_added_callback,
std::function<void(AudioTrackInterface*, MediaStreamInterface*)>
audio_track_removed_callback,
std::function<void(VideoTrackInterface*, MediaStreamInterface*)>
video_track_added_callback,
std::function<void(VideoTrackInterface*, MediaStreamInterface*)>
video_track_removed_callback);
~MediaStreamObserver() override; ~MediaStreamObserver() override;
const MediaStreamInterface* stream() const { return stream_; } const MediaStreamInterface* stream() const { return stream_; }
void OnChanged() override; void OnChanged() override;
sigslot::signal2<AudioTrackInterface*, MediaStreamInterface*>
SignalAudioTrackAdded;
sigslot::signal2<AudioTrackInterface*, MediaStreamInterface*>
SignalAudioTrackRemoved;
sigslot::signal2<VideoTrackInterface*, MediaStreamInterface*>
SignalVideoTrackAdded;
sigslot::signal2<VideoTrackInterface*, MediaStreamInterface*>
SignalVideoTrackRemoved;
private: private:
rtc::scoped_refptr<MediaStreamInterface> stream_; rtc::scoped_refptr<MediaStreamInterface> stream_;
AudioTrackVector cached_audio_tracks_; AudioTrackVector cached_audio_tracks_;
VideoTrackVector cached_video_tracks_; VideoTrackVector cached_video_tracks_;
const std::function<void(AudioTrackInterface*, MediaStreamInterface*)>
audio_track_added_callback_;
const std::function<void(AudioTrackInterface*, MediaStreamInterface*)>
audio_track_removed_callback_;
const std::function<void(VideoTrackInterface*, MediaStreamInterface*)>
video_track_added_callback_;
const std::function<void(VideoTrackInterface*, MediaStreamInterface*)>
video_track_removed_callback_;
}; };
} // namespace webrtc } // namespace webrtc

View File

@ -13,6 +13,7 @@
#include <algorithm> #include <algorithm>
#include <iterator> #include <iterator>
#include <map> #include <map>
#include <memory>
#include <queue> #include <queue>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
@ -2591,16 +2592,29 @@ bool SdpOfferAnswerHandler::AddStream(MediaStreamInterface* local_stream) {
} }
local_streams_->AddStream(local_stream); local_streams_->AddStream(local_stream);
MediaStreamObserver* observer = new MediaStreamObserver(local_stream); auto observer = std::make_unique<MediaStreamObserver>(
observer->SignalAudioTrackAdded.connect( local_stream,
this, &SdpOfferAnswerHandler::OnAudioTrackAdded); [this](AudioTrackInterface* audio_track,
observer->SignalAudioTrackRemoved.connect( MediaStreamInterface* media_stream) {
this, &SdpOfferAnswerHandler::OnAudioTrackRemoved); RTC_DCHECK_RUN_ON(signaling_thread());
observer->SignalVideoTrackAdded.connect( OnAudioTrackAdded(audio_track, media_stream);
this, &SdpOfferAnswerHandler::OnVideoTrackAdded); },
observer->SignalVideoTrackRemoved.connect( [this](AudioTrackInterface* audio_track,
this, &SdpOfferAnswerHandler::OnVideoTrackRemoved); MediaStreamInterface* media_stream) {
stream_observers_.push_back(std::unique_ptr<MediaStreamObserver>(observer)); RTC_DCHECK_RUN_ON(signaling_thread());
OnAudioTrackRemoved(audio_track, media_stream);
},
[this](VideoTrackInterface* video_track,
MediaStreamInterface* media_stream) {
RTC_DCHECK_RUN_ON(signaling_thread());
OnVideoTrackAdded(video_track, media_stream);
},
[this](VideoTrackInterface* video_track,
MediaStreamInterface* media_stream) {
RTC_DCHECK_RUN_ON(signaling_thread());
OnVideoTrackRemoved(video_track, media_stream);
});
stream_observers_.push_back(std::move(observer));
for (const auto& track : local_stream->GetAudioTracks()) { for (const auto& track : local_stream->GetAudioTracks()) {
rtp_manager()->AddAudioTrack(track.get(), local_stream); rtp_manager()->AddAudioTrack(track.get(), local_stream);

View File

@ -25,8 +25,27 @@ JavaMediaStream::JavaMediaStream(
: j_media_stream_( : j_media_stream_(
env, env,
Java_MediaStream_Constructor(env, Java_MediaStream_Constructor(env,
jlongFromPointer(media_stream.get()))), jlongFromPointer(media_stream.get()))) {
observer_(std::make_unique<MediaStreamObserver>(media_stream)) { // Create an observer to update the Java stream when the native stream's set
// of tracks changes.
observer_.reset(new MediaStreamObserver(
media_stream,
[this](AudioTrackInterface* audio_track,
MediaStreamInterface* media_stream) {
OnAudioTrackAddedToStream(audio_track, media_stream);
},
[this](AudioTrackInterface* audio_track,
MediaStreamInterface* media_stream) {
OnAudioTrackRemovedFromStream(audio_track, media_stream);
},
[this](VideoTrackInterface* video_track,
MediaStreamInterface* media_stream) {
OnVideoTrackAddedToStream(video_track, media_stream);
},
[this](VideoTrackInterface* video_track,
MediaStreamInterface* media_stream) {
OnVideoTrackRemovedFromStream(video_track, media_stream);
}));
for (rtc::scoped_refptr<AudioTrackInterface> track : for (rtc::scoped_refptr<AudioTrackInterface> track :
media_stream->GetAudioTracks()) { media_stream->GetAudioTracks()) {
Java_MediaStream_addNativeAudioTrack(env, j_media_stream_, Java_MediaStream_addNativeAudioTrack(env, j_media_stream_,
@ -37,18 +56,6 @@ JavaMediaStream::JavaMediaStream(
Java_MediaStream_addNativeVideoTrack(env, j_media_stream_, Java_MediaStream_addNativeVideoTrack(env, j_media_stream_,
jlongFromPointer(track.release())); jlongFromPointer(track.release()));
} }
// Create an observer to update the Java stream when the native stream's set
// of tracks changes.
observer_->SignalAudioTrackRemoved.connect(
this, &JavaMediaStream::OnAudioTrackRemovedFromStream);
observer_->SignalVideoTrackRemoved.connect(
this, &JavaMediaStream::OnVideoTrackRemovedFromStream);
observer_->SignalAudioTrackAdded.connect(
this, &JavaMediaStream::OnAudioTrackAddedToStream);
observer_->SignalVideoTrackAdded.connect(
this, &JavaMediaStream::OnVideoTrackAddedToStream);
// `j_media_stream` holds one reference. Corresponding Release() is in // `j_media_stream` holds one reference. Corresponding Release() is in
// MediaStream_free, triggered by MediaStream.dispose(). // MediaStream_free, triggered by MediaStream.dispose().
media_stream.release(); media_stream.release();

View File

@ -21,12 +21,12 @@
namespace webrtc { namespace webrtc {
namespace jni { namespace jni {
class JavaMediaStream : public sigslot::has_slots<> { class JavaMediaStream {
public: public:
explicit JavaMediaStream( explicit JavaMediaStream(
JNIEnv* env, JNIEnv* env,
rtc::scoped_refptr<MediaStreamInterface> media_stream); rtc::scoped_refptr<MediaStreamInterface> media_stream);
~JavaMediaStream() override; ~JavaMediaStream();
const ScopedJavaGlobalRef<jobject>& j_media_stream() { const ScopedJavaGlobalRef<jobject>& j_media_stream() {
return j_media_stream_; return j_media_stream_;