Index: media/cast/audio_receiver/audio_decoder.cc |
diff --git a/media/cast/audio_receiver/audio_decoder.cc b/media/cast/audio_receiver/audio_decoder.cc |
index b140788fe04887c406a6b05095420f516dac56c1..118a020b30c32053121beb0df82f5737a4ce3f45 100644 |
--- a/media/cast/audio_receiver/audio_decoder.cc |
+++ b/media/cast/audio_receiver/audio_decoder.cc |
@@ -52,7 +52,15 @@ bool AudioDecoder::GetRawAudioFrame(int number_of_10ms_blocks, |
int desired_frequency, |
PcmAudioFrame* audio_frame, |
uint32* rtp_timestamp) { |
- if (!have_received_packets_) return false; |
+ // We don't care about the race case where a packet arrives at the same time |
+ // as this function in called. The data will be there the next time this |
+ // function is called. |
+ lock_.Acquire(); |
+ // Get a local copy under lock. |
+ bool have_received_packets = have_received_packets_; |
+ lock_.Release(); |
+ |
+ if (!have_received_packets) return false; |
audio_frame->samples.clear(); |
@@ -92,7 +100,10 @@ void AudioDecoder::IncomingParsedRtpPacket(const uint8* payload_data, |
DCHECK_LE(payload_size, kIpPacketSize); |
audio_decoder_->IncomingPacket(payload_data, static_cast<int32>(payload_size), |
rtp_header.webrtc); |
+ |
+ lock_.Acquire(); |
have_received_packets_ = true; |
+ lock_.Release(); |
} |
} // namespace cast |