Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: remoting/client/audio_player.cc

Issue 2052723002: Adding an interface to allow extention of the audio player for CRD and iOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing comments in CL. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « remoting/client/audio_player.h ('k') | remoting/client/audio_player_android.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/client/audio_player.h" 5 #include "remoting/client/audio_player.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string>
8 9
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/stl_util.h" 11 #include "base/stl_util.h"
11 12
12 // If queue grows bigger than 150ms we start dropping packets. 13 // If queue grows bigger than 150ms we start dropping packets.
13 const int kMaxQueueLatencyMs = 150; 14 const int kMaxQueueLatencyMs = 150;
14 15
15 namespace remoting { 16 namespace remoting {
16 17
17 AudioPlayer::AudioPlayer() 18 AudioPlayer::AudioPlayer()
18 : sampling_rate_(AudioPacket::SAMPLING_RATE_INVALID), 19 : sampling_rate_(AudioPacket::SAMPLING_RATE_INVALID),
19 start_failed_(false), 20 start_failed_(false),
20 queued_bytes_(0), 21 queued_bytes_(0),
21 bytes_consumed_(0) { 22 bytes_consumed_(0) {
22 } 23 }
23 24
24 AudioPlayer::~AudioPlayer() { 25 AudioPlayer::~AudioPlayer() {}
25 base::AutoLock auto_lock(lock_);
26 ResetQueue();
27 }
28 26
29 void AudioPlayer::ProcessAudioPacket(std::unique_ptr<AudioPacket> packet) { 27 void AudioPlayer::AddAudioPacket(std::unique_ptr<AudioPacket> packet) {
30 CHECK_EQ(1, packet->data_size()); 28 CHECK_EQ(1, packet->data_size());
31 DCHECK_EQ(AudioPacket::ENCODING_RAW, packet->encoding()); 29 DCHECK_EQ(AudioPacket::ENCODING_RAW, packet->encoding());
32 DCHECK_NE(AudioPacket::SAMPLING_RATE_INVALID, packet->sampling_rate()); 30 DCHECK_NE(AudioPacket::SAMPLING_RATE_INVALID, packet->sampling_rate());
33 DCHECK_EQ(kSampleSizeBytes, static_cast<int>(packet->bytes_per_sample())); 31 DCHECK_EQ(kSampleSizeBytes, static_cast<int>(packet->bytes_per_sample()));
34 DCHECK_EQ(kChannels, static_cast<int>(packet->channels())); 32 DCHECK_EQ(kChannels, static_cast<int>(packet->channels()));
35 DCHECK_EQ(packet->data(0).size() % (kChannels * kSampleSizeBytes), 0u); 33 DCHECK_EQ(packet->data(0).size() % (kChannels * kSampleSizeBytes), 0u);
36 34
37 // No-op if the Pepper player won't start. 35 // No-op if the Pepper player won't start.
38 if (start_failed_) { 36 if (start_failed_) {
39 return; 37 return;
(...skipping 12 matching lines...) Expand all
52 bool success = ResetAudioPlayer(sampling_rate_); 50 bool success = ResetAudioPlayer(sampling_rate_);
53 if (!success) { 51 if (!success) {
54 start_failed_ = true; 52 start_failed_ = true;
55 return; 53 return;
56 } 54 }
57 } 55 }
58 56
59 base::AutoLock auto_lock(lock_); 57 base::AutoLock auto_lock(lock_);
60 58
61 queued_bytes_ += packet->data(0).size(); 59 queued_bytes_ += packet->data(0).size();
62 queued_packets_.push_back(packet.release()); 60 queued_packets_.push_back(std::move(packet));
63 61
64 int max_buffer_size_ = 62 int max_buffer_size_ =
65 kMaxQueueLatencyMs * sampling_rate_ * kSampleSizeBytes * kChannels / 63 kMaxQueueLatencyMs * sampling_rate_ * kSampleSizeBytes * kChannels /
66 base::Time::kMillisecondsPerSecond; 64 base::Time::kMillisecondsPerSecond;
67 while (queued_bytes_ > max_buffer_size_) { 65 while (queued_bytes_ > max_buffer_size_) {
68 queued_bytes_ -= queued_packets_.front()->data(0).size() - bytes_consumed_; 66 queued_bytes_ -= queued_packets_.front()->data(0).size() - bytes_consumed_;
69 DCHECK_GE(queued_bytes_, 0); 67 DCHECK_GE(queued_bytes_, 0);
70 delete queued_packets_.front();
71 queued_packets_.pop_front(); 68 queued_packets_.pop_front();
72 bytes_consumed_ = 0; 69 bytes_consumed_ = 0;
73 } 70 }
74 } 71 }
75 72
76 // static 73 // static
77 void AudioPlayer::AudioPlayerCallback(void* samples, 74 void AudioPlayer::AudioPlayerCallback(void* samples,
78 uint32_t buffer_size, 75 uint32_t buffer_size,
79 void* data) { 76 void* data) {
80 AudioPlayer* audio_player = static_cast<AudioPlayer*>(data); 77 AudioPlayer* audio_player = static_cast<AudioPlayer*>(data);
81 audio_player->FillWithSamples(samples, buffer_size); 78 audio_player->FillWithSamples(samples, buffer_size);
82 } 79 }
83 80
84 void AudioPlayer::ResetQueue() { 81 void AudioPlayer::ResetQueue() {
85 lock_.AssertAcquired(); 82 lock_.AssertAcquired();
86 STLDeleteElements(&queued_packets_); 83 queued_packets_.clear();
87 queued_bytes_ = 0; 84 queued_bytes_ = 0;
88 bytes_consumed_ = 0; 85 bytes_consumed_ = 0;
89 } 86 }
90 87
91 void AudioPlayer::FillWithSamples(void* samples, uint32_t buffer_size) { 88 void AudioPlayer::FillWithSamples(void* samples, uint32_t buffer_size) {
92 base::AutoLock auto_lock(lock_); 89 base::AutoLock auto_lock(lock_);
93 90
94 const size_t bytes_needed = kChannels * kSampleSizeBytes * 91 const size_t bytes_needed = kChannels * kSampleSizeBytes *
95 GetSamplesPerFrame(); 92 GetSamplesPerFrame();
96 93
97 // Make sure we don't overrun the buffer. 94 // Make sure we don't overrun the buffer.
98 CHECK_EQ(buffer_size, bytes_needed); 95 CHECK_EQ(buffer_size, bytes_needed);
99 96
100 char* next_sample = static_cast<char*>(samples); 97 char* next_sample = static_cast<char*>(samples);
101 size_t bytes_extracted = 0; 98 size_t bytes_extracted = 0;
102 99
103 while (bytes_extracted < bytes_needed) { 100 while (bytes_extracted < bytes_needed) {
104 // Check if we've run out of samples for this packet. 101 // Check if we've run out of samples for this packet.
105 if (queued_packets_.empty()) { 102 if (queued_packets_.empty()) {
106 memset(next_sample, 0, bytes_needed - bytes_extracted); 103 memset(next_sample, 0, bytes_needed - bytes_extracted);
107 return; 104 return;
108 } 105 }
109 106
110 // Pop off the packet if we've already consumed all its bytes. 107 // Pop off the packet if we've already consumed all its bytes.
111 if (queued_packets_.front()->data(0).size() == bytes_consumed_) { 108 if (queued_packets_.front()->data(0).size() == bytes_consumed_) {
112 delete queued_packets_.front();
113 queued_packets_.pop_front(); 109 queued_packets_.pop_front();
114 bytes_consumed_ = 0; 110 bytes_consumed_ = 0;
115 continue; 111 continue;
116 } 112 }
117 113
118 const std::string& packet_data = queued_packets_.front()->data(0); 114 const std::string& packet_data = queued_packets_.front()->data(0);
119 size_t bytes_to_copy = std::min( 115 size_t bytes_to_copy = std::min(
120 packet_data.size() - bytes_consumed_, 116 packet_data.size() - bytes_consumed_,
121 bytes_needed - bytes_extracted); 117 bytes_needed - bytes_extracted);
122 memcpy(next_sample, packet_data.data() + bytes_consumed_, bytes_to_copy); 118 memcpy(next_sample, packet_data.data() + bytes_consumed_, bytes_to_copy);
123 119
124 next_sample += bytes_to_copy; 120 next_sample += bytes_to_copy;
125 bytes_consumed_ += bytes_to_copy; 121 bytes_consumed_ += bytes_to_copy;
126 bytes_extracted += bytes_to_copy; 122 bytes_extracted += bytes_to_copy;
127 queued_bytes_ -= bytes_to_copy; 123 queued_bytes_ -= bytes_to_copy;
128 DCHECK_GE(queued_bytes_, 0); 124 DCHECK_GE(queued_bytes_, 0);
129 } 125 }
130 } 126 }
131 127
132 } // namespace remoting 128 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/audio_player.h ('k') | remoting/client/audio_player_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698