OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/webrtc_audio_sink_adapter.h" | 5 #include "remoting/protocol/webrtc_audio_sink_adapter.h" |
6 | 6 |
7 #include "base/bind.h" | |
8 #include "base/callback.h" | 7 #include "base/callback.h" |
9 #include "remoting/proto/audio.pb.h" | 8 #include "remoting/proto/audio.pb.h" |
10 #include "remoting/protocol/audio_stub.h" | 9 #include "remoting/protocol/audio_stub.h" |
11 | 10 |
12 namespace remoting { | 11 namespace remoting { |
13 namespace protocol { | 12 namespace protocol { |
14 | 13 |
15 WebrtcAudioSinkAdapter::WebrtcAudioSinkAdapter( | 14 WebrtcAudioSinkAdapter::WebrtcAudioSinkAdapter( |
16 scoped_refptr<webrtc::MediaStreamInterface> stream, | 15 scoped_refptr<webrtc::MediaStreamInterface> stream, |
17 base::WeakPtr<AudioStub> audio_stub) | 16 base::WeakPtr<AudioStub> audio_stub) { |
18 : task_runner_(base::ThreadTaskRunnerHandle::Get()), | 17 audio_stub_ = audio_stub; |
19 audio_stub_(audio_stub), | 18 |
20 media_stream_(std::move(stream)) { | 19 media_stream_ = std::move(stream); |
| 20 |
21 webrtc::AudioTrackVector audio_tracks = media_stream_->GetAudioTracks(); | 21 webrtc::AudioTrackVector audio_tracks = media_stream_->GetAudioTracks(); |
22 | 22 |
23 // Caller must verify that the media stream contains audio tracks. | 23 // Caller must verify that the media stream contains audio tracks. |
24 DCHECK(!audio_tracks.empty()); | 24 DCHECK(!audio_tracks.empty()); |
| 25 |
25 if (audio_tracks.size() > 1U) { | 26 if (audio_tracks.size() > 1U) { |
26 LOG(WARNING) << "Received media stream with multiple audio tracks."; | 27 LOG(WARNING) << "Received media stream with multiple audio tracks."; |
27 } | 28 } |
| 29 |
28 audio_track_ = audio_tracks[0]; | 30 audio_track_ = audio_tracks[0]; |
29 audio_track_->GetSource()->AddSink(this); | 31 audio_track_->GetSource()->AddSink(this); |
30 } | 32 } |
31 | 33 |
32 WebrtcAudioSinkAdapter::~WebrtcAudioSinkAdapter() { | 34 WebrtcAudioSinkAdapter::~WebrtcAudioSinkAdapter() { |
33 audio_track_->GetSource()->RemoveSink(this); | 35 audio_track_->GetSource()->RemoveSink(this); |
34 } | 36 } |
35 | 37 |
36 void WebrtcAudioSinkAdapter::OnData(const void* audio_data, | 38 void WebrtcAudioSinkAdapter::OnData(const void* audio_data, |
37 int bits_per_sample, | 39 int bits_per_sample, |
38 int sample_rate, | 40 int sample_rate, |
39 size_t number_of_channels, | 41 size_t number_of_channels, |
40 size_t number_of_frames) { | 42 size_t number_of_frames) { |
| 43 if (!audio_stub_) |
| 44 return; |
| 45 |
41 std::unique_ptr<AudioPacket> audio_packet(new AudioPacket()); | 46 std::unique_ptr<AudioPacket> audio_packet(new AudioPacket()); |
42 audio_packet->set_encoding(AudioPacket::ENCODING_RAW); | 47 audio_packet->set_encoding(AudioPacket::ENCODING_RAW); |
43 | 48 |
44 switch (sample_rate) { | 49 switch (sample_rate) { |
45 case 44100: | 50 case 44100: |
46 audio_packet->set_sampling_rate(AudioPacket::SAMPLING_RATE_44100); | 51 audio_packet->set_sampling_rate(AudioPacket::SAMPLING_RATE_44100); |
47 break; | 52 break; |
48 case 48000: | 53 case 48000: |
49 audio_packet->set_sampling_rate(AudioPacket::SAMPLING_RATE_48000); | 54 audio_packet->set_sampling_rate(AudioPacket::SAMPLING_RATE_48000); |
50 break; | 55 break; |
(...skipping 10 matching lines...) Expand all Loading... |
61 | 66 |
62 if (number_of_channels != 2) { | 67 if (number_of_channels != 2) { |
63 LOG(WARNING) << "Unsupported number of channels: " << number_of_channels; | 68 LOG(WARNING) << "Unsupported number of channels: " << number_of_channels; |
64 return; | 69 return; |
65 } | 70 } |
66 audio_packet->set_channels(AudioPacket::CHANNELS_STEREO); | 71 audio_packet->set_channels(AudioPacket::CHANNELS_STEREO); |
67 | 72 |
68 size_t data_size = | 73 size_t data_size = |
69 number_of_frames * number_of_channels * (bits_per_sample / 8); | 74 number_of_frames * number_of_channels * (bits_per_sample / 8); |
70 audio_packet->add_data(reinterpret_cast<const char*>(audio_data), data_size); | 75 audio_packet->add_data(reinterpret_cast<const char*>(audio_data), data_size); |
71 | 76 audio_stub_->ProcessAudioPacket(std::move(audio_packet), base::Closure()); |
72 task_runner_->PostTask( | |
73 FROM_HERE, base::Bind(&AudioStub::ProcessAudioPacket, audio_stub_, | |
74 base::Passed(&audio_packet), base::Closure())); | |
75 } | 77 } |
76 | 78 |
77 } // namespace protocol | 79 } // namespace protocol |
78 } // namespace remoting | 80 } // namespace remoting |
OLD | NEW |