blob: 5e92686ee9d228a76aceb47fc461b40899f0db03 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +000010
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/audiotrack.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
tommi6eca7e32015-12-15 04:27:11 -080013#include "webrtc/base/checks.h"
14
15using rtc::scoped_refptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
17namespace webrtc {
18
deadbeeffac06552015-11-25 11:26:01 -080019const char MediaStreamTrackInterface::kAudioKind[] = "audio";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020
tommi6eca7e32015-12-15 04:27:11 -080021// static
22scoped_refptr<AudioTrack> AudioTrack::Create(
23 const std::string& id,
24 const scoped_refptr<AudioSourceInterface>& source) {
25 return new rtc::RefCountedObject<AudioTrack>(id, source);
26}
27
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028AudioTrack::AudioTrack(const std::string& label,
tommi6eca7e32015-12-15 04:27:11 -080029 const scoped_refptr<AudioSourceInterface>& source)
30 : MediaStreamTrack<AudioTrackInterface>(label), audio_source_(source) {
31 if (audio_source_) {
32 audio_source_->RegisterObserver(this);
33 OnChanged();
34 }
35}
36
37AudioTrack::~AudioTrack() {
38 RTC_DCHECK(thread_checker_.CalledOnValidThread());
39 set_state(MediaStreamTrackInterface::kEnded);
40 if (audio_source_)
41 audio_source_->UnregisterObserver(this);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042}
43
44std::string AudioTrack::kind() const {
tommi6eca7e32015-12-15 04:27:11 -080045 RTC_DCHECK(thread_checker_.CalledOnValidThread());
deadbeeffac06552015-11-25 11:26:01 -080046 return kAudioKind;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047}
48
tommi6eca7e32015-12-15 04:27:11 -080049AudioSourceInterface* AudioTrack::GetSource() const {
50 RTC_DCHECK(thread_checker_.CalledOnValidThread());
51 return audio_source_.get();
52}
53
54void AudioTrack::AddSink(AudioTrackSinkInterface* sink) {
55 RTC_DCHECK(thread_checker_.CalledOnValidThread());
56 if (audio_source_)
57 audio_source_->AddSink(sink);
58}
59
60void AudioTrack::RemoveSink(AudioTrackSinkInterface* sink) {
61 RTC_DCHECK(thread_checker_.CalledOnValidThread());
62 if (audio_source_)
63 audio_source_->RemoveSink(sink);
64}
65
66void AudioTrack::OnChanged() {
67 RTC_DCHECK(thread_checker_.CalledOnValidThread());
68 if (state() == kFailed)
69 return; // We can't recover from this state (do we ever set it?).
70
71 TrackState new_state = kInitializing;
72
73 // |audio_source_| must be non-null if we ever get here.
74 switch (audio_source_->state()) {
75 case MediaSourceInterface::kLive:
76 case MediaSourceInterface::kMuted:
77 new_state = kLive;
78 break;
79 case MediaSourceInterface::kEnded:
80 new_state = kEnded;
81 break;
82 case MediaSourceInterface::kInitializing:
83 default:
84 // use kInitializing.
85 break;
86 }
87
88 set_state(new_state);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089}
90
91} // namespace webrtc