| /* |
| * libjingle |
| * Copyright 2012 Google Inc. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * 3. The name of the author may not be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
| * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| // This file contains classes for listening on changes on MediaStreams and |
| // MediaTracks that are connected to a certain PeerConnection. |
| // Example: If a user sets a rendererer on a remote video track the renderer is |
| // connected to the appropriate remote video stream. |
| |
| #ifndef TALK_APP_WEBRTC_MEDIASTREAMHANDLER_H_ |
| #define TALK_APP_WEBRTC_MEDIASTREAMHANDLER_H_ |
| |
| #include <list> |
| #include <vector> |
| |
| #include "talk/app/webrtc/mediastreaminterface.h" |
| #include "talk/app/webrtc/mediastreamprovider.h" |
| #include "talk/app/webrtc/peerconnectioninterface.h" |
| #include "talk/media/base/audiorenderer.h" |
| #include "webrtc/base/thread.h" |
| |
| namespace webrtc { |
| |
| // TrackHandler listen to events on a MediaStreamTrackInterface that is |
| // connected to a certain PeerConnection. |
| class TrackHandler : public ObserverInterface { |
| public: |
| TrackHandler(MediaStreamTrackInterface* track, uint32 ssrc); |
| virtual ~TrackHandler(); |
| virtual void OnChanged(); |
| // Stop using |track_| on this PeerConnection. |
| virtual void Stop() = 0; |
| |
| MediaStreamTrackInterface* track() { return track_; } |
| uint32 ssrc() const { return ssrc_; } |
| |
| protected: |
| virtual void OnStateChanged() = 0; |
| virtual void OnEnabledChanged() = 0; |
| |
| private: |
| rtc::scoped_refptr<MediaStreamTrackInterface> track_; |
| uint32 ssrc_; |
| MediaStreamTrackInterface::TrackState state_; |
| bool enabled_; |
| }; |
| |
| // LocalAudioSinkAdapter receives data callback as a sink to the local |
| // AudioTrack, and passes the data to the sink of AudioRenderer. |
| class LocalAudioSinkAdapter : public AudioTrackSinkInterface, |
| public cricket::AudioRenderer { |
| public: |
| LocalAudioSinkAdapter(); |
| virtual ~LocalAudioSinkAdapter(); |
| |
| private: |
| // AudioSinkInterface implementation. |
| void OnData(const void* audio_data, |
| int bits_per_sample, |
| int sample_rate, |
| int number_of_channels, |
| int number_of_frames) override; |
| |
| // cricket::AudioRenderer implementation. |
| void SetSink(cricket::AudioRenderer::Sink* sink) override; |
| |
| cricket::AudioRenderer::Sink* sink_; |
| // Critical section protecting |sink_|. |
| rtc::CriticalSection lock_; |
| }; |
| |
| // LocalAudioTrackHandler listen to events on a local AudioTrack instance |
| // connected to a PeerConnection and orders the |provider| to executes the |
| // requested change. |
| class LocalAudioTrackHandler : public TrackHandler { |
| public: |
| LocalAudioTrackHandler(AudioTrackInterface* track, |
| uint32 ssrc, |
| AudioProviderInterface* provider); |
| virtual ~LocalAudioTrackHandler(); |
| |
| void Stop() override; |
| |
| protected: |
| void OnStateChanged() override; |
| void OnEnabledChanged() override; |
| |
| private: |
| AudioTrackInterface* audio_track_; |
| AudioProviderInterface* provider_; |
| |
| // Used to pass the data callback from the |audio_track_| to the other |
| // end of cricket::AudioRenderer. |
| rtc::scoped_ptr<LocalAudioSinkAdapter> sink_adapter_; |
| }; |
| |
| // RemoteAudioTrackHandler listen to events on a remote AudioTrack instance |
| // connected to a PeerConnection and orders the |provider| to executes the |
| // requested change. |
| class RemoteAudioTrackHandler : public AudioSourceInterface::AudioObserver, |
| public TrackHandler { |
| public: |
| RemoteAudioTrackHandler(AudioTrackInterface* track, |
| uint32 ssrc, |
| AudioProviderInterface* provider); |
| virtual ~RemoteAudioTrackHandler(); |
| void Stop() override; |
| |
| protected: |
| void OnStateChanged() override; |
| void OnEnabledChanged() override; |
| |
| private: |
| // AudioSourceInterface::AudioObserver implementation. |
| void OnSetVolume(double volume) override; |
| |
| AudioTrackInterface* audio_track_; |
| AudioProviderInterface* provider_; |
| }; |
| |
| // LocalVideoTrackHandler listen to events on a local VideoTrack instance |
| // connected to a PeerConnection and orders the |provider| to executes the |
| // requested change. |
| class LocalVideoTrackHandler : public TrackHandler { |
| public: |
| LocalVideoTrackHandler(VideoTrackInterface* track, |
| uint32 ssrc, |
| VideoProviderInterface* provider); |
| virtual ~LocalVideoTrackHandler(); |
| void Stop() override; |
| |
| protected: |
| void OnStateChanged() override; |
| void OnEnabledChanged() override; |
| |
| private: |
| VideoTrackInterface* local_video_track_; |
| VideoProviderInterface* provider_; |
| }; |
| |
| // RemoteVideoTrackHandler listen to events on a remote VideoTrack instance |
| // connected to a PeerConnection and orders the |provider| to execute |
| // requested changes. |
| class RemoteVideoTrackHandler : public TrackHandler { |
| public: |
| RemoteVideoTrackHandler(VideoTrackInterface* track, |
| uint32 ssrc, |
| VideoProviderInterface* provider); |
| virtual ~RemoteVideoTrackHandler(); |
| void Stop() override; |
| |
| protected: |
| void OnStateChanged() override; |
| void OnEnabledChanged() override; |
| |
| private: |
| VideoTrackInterface* remote_video_track_; |
| VideoProviderInterface* provider_; |
| }; |
| |
| class MediaStreamHandler : public ObserverInterface { |
| public: |
| MediaStreamHandler(MediaStreamInterface* stream, |
| AudioProviderInterface* audio_provider, |
| VideoProviderInterface* video_provider); |
| ~MediaStreamHandler(); |
| MediaStreamInterface* stream(); |
| void Stop(); |
| |
| virtual void AddAudioTrack(AudioTrackInterface* audio_track, uint32 ssrc) = 0; |
| virtual void AddVideoTrack(VideoTrackInterface* video_track, uint32 ssrc) = 0; |
| |
| virtual void RemoveTrack(MediaStreamTrackInterface* track); |
| void OnChanged() override; |
| |
| protected: |
| TrackHandler* FindTrackHandler(MediaStreamTrackInterface* track); |
| rtc::scoped_refptr<MediaStreamInterface> stream_; |
| AudioProviderInterface* audio_provider_; |
| VideoProviderInterface* video_provider_; |
| typedef std::vector<TrackHandler*> TrackHandlers; |
| TrackHandlers track_handlers_; |
| }; |
| |
| class LocalMediaStreamHandler : public MediaStreamHandler { |
| public: |
| LocalMediaStreamHandler(MediaStreamInterface* stream, |
| AudioProviderInterface* audio_provider, |
| VideoProviderInterface* video_provider); |
| ~LocalMediaStreamHandler(); |
| |
| void AddAudioTrack(AudioTrackInterface* audio_track, uint32 ssrc) override; |
| void AddVideoTrack(VideoTrackInterface* video_track, uint32 ssrc) override; |
| }; |
| |
| class RemoteMediaStreamHandler : public MediaStreamHandler { |
| public: |
| RemoteMediaStreamHandler(MediaStreamInterface* stream, |
| AudioProviderInterface* audio_provider, |
| VideoProviderInterface* video_provider); |
| ~RemoteMediaStreamHandler(); |
| void AddAudioTrack(AudioTrackInterface* audio_track, uint32 ssrc) override; |
| void AddVideoTrack(VideoTrackInterface* video_track, uint32 ssrc) override; |
| }; |
| |
| // Container for MediaStreamHandlers of currently known local and remote |
| // MediaStreams. |
| class MediaStreamHandlerContainer { |
| public: |
| MediaStreamHandlerContainer(AudioProviderInterface* audio_provider, |
| VideoProviderInterface* video_provider); |
| ~MediaStreamHandlerContainer(); |
| |
| // Notify all referenced objects that MediaStreamHandlerContainer will be |
| // destroyed. This method must be called prior to the dtor and prior to the |
| // |audio_provider| and |video_provider| is destroyed. |
| void TearDown(); |
| |
| // Remove all TrackHandlers for tracks in |stream| and make sure |
| // the audio_provider and video_provider is notified that the tracks has been |
| // removed. |
| void RemoveRemoteStream(MediaStreamInterface* stream); |
| |
| // Create a RemoteAudioTrackHandler and associate |audio_track| with |ssrc|. |
| void AddRemoteAudioTrack(MediaStreamInterface* stream, |
| AudioTrackInterface* audio_track, |
| uint32 ssrc); |
| // Create a RemoteVideoTrackHandler and associate |video_track| with |ssrc|. |
| void AddRemoteVideoTrack(MediaStreamInterface* stream, |
| VideoTrackInterface* video_track, |
| uint32 ssrc); |
| // Remove the TrackHandler for |track|. |
| void RemoveRemoteTrack(MediaStreamInterface* stream, |
| MediaStreamTrackInterface* track); |
| |
| // Remove all TrackHandlers for tracks in |stream| and make sure |
| // the audio_provider and video_provider is notified that the tracks has been |
| // removed. |
| void RemoveLocalStream(MediaStreamInterface* stream); |
| |
| // Create a LocalAudioTrackHandler and associate |audio_track| with |ssrc|. |
| void AddLocalAudioTrack(MediaStreamInterface* stream, |
| AudioTrackInterface* audio_track, |
| uint32 ssrc); |
| // Create a LocalVideoTrackHandler and associate |video_track| with |ssrc|. |
| void AddLocalVideoTrack(MediaStreamInterface* stream, |
| VideoTrackInterface* video_track, |
| uint32 ssrc); |
| // Remove the TrackHandler for |track|. |
| void RemoveLocalTrack(MediaStreamInterface* stream, |
| MediaStreamTrackInterface* track); |
| |
| private: |
| typedef std::list<MediaStreamHandler*> StreamHandlerList; |
| MediaStreamHandler* FindStreamHandler(const StreamHandlerList& handlers, |
| MediaStreamInterface* stream); |
| MediaStreamHandler* CreateRemoteStreamHandler(MediaStreamInterface* stream); |
| MediaStreamHandler* CreateLocalStreamHandler(MediaStreamInterface* stream); |
| void DeleteStreamHandler(StreamHandlerList* streamhandlers, |
| MediaStreamInterface* stream); |
| |
| StreamHandlerList local_streams_handlers_; |
| StreamHandlerList remote_streams_handlers_; |
| AudioProviderInterface* audio_provider_; |
| VideoProviderInterface* video_provider_; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // TALK_APP_WEBRTC_MEDIASTREAMHANDLER_H_ |