OLD | NEW |
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 "content/browser/renderer_host/media/audio_input_sync_writer.h" | 5 #include "content/browser/renderer_host/media/audio_input_sync_writer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/memory/shared_memory.h" | 9 #include "base/memory/shared_memory.h" |
10 #include "content/browser/renderer_host/media/media_stream_manager.h" | 10 #include "content/browser/renderer_host/media/media_stream_manager.h" |
11 | 11 |
12 using media::AudioBus; | 12 using media::AudioBus; |
13 | 13 |
14 namespace content { | 14 namespace content { |
15 | 15 |
16 AudioInputSyncWriter::AudioInputSyncWriter(base::SharedMemory* shared_memory, | 16 AudioInputSyncWriter::AudioInputSyncWriter(base::SharedMemory* shared_memory, |
17 int shared_memory_segment_count, | 17 int shared_memory_segment_count, |
18 const media::AudioParameters& params) | 18 const media::AudioParameters& params) |
19 : shared_memory_(shared_memory), | 19 : shared_memory_(shared_memory), |
20 shared_memory_segment_count_(shared_memory_segment_count), | 20 shared_memory_segment_count_(shared_memory_segment_count), |
21 current_segment_id_(0), | 21 current_segment_id_(0), |
22 creation_time_(base::Time::Now()), | 22 creation_time_(base::Time::Now()), |
23 audio_bus_memory_size_(AudioBus::CalculateMemorySize(params)) { | 23 audio_bus_memory_size_(AudioBus::CalculateMemorySize(params)), |
| 24 next_buffer_id_(0) { |
24 DCHECK_GT(shared_memory_segment_count, 0); | 25 DCHECK_GT(shared_memory_segment_count, 0); |
25 DCHECK_EQ(shared_memory->requested_size() % shared_memory_segment_count, 0u); | 26 DCHECK_EQ(shared_memory->requested_size() % shared_memory_segment_count, 0u); |
26 shared_memory_segment_size_ = | 27 shared_memory_segment_size_ = |
27 shared_memory->requested_size() / shared_memory_segment_count; | 28 shared_memory->requested_size() / shared_memory_segment_count; |
28 DVLOG(1) << "SharedMemory::requested_size: " | 29 DVLOG(1) << "SharedMemory::requested_size: " |
29 << shared_memory->requested_size(); | 30 << shared_memory->requested_size(); |
30 DVLOG(1) << "shared_memory_segment_count: " << shared_memory_segment_count; | 31 DVLOG(1) << "shared_memory_segment_count: " << shared_memory_segment_count; |
31 DVLOG(1) << "audio_bus_memory_size: " << audio_bus_memory_size_; | 32 DVLOG(1) << "audio_bus_memory_size: " << audio_bus_memory_size_; |
32 | 33 |
33 // Create vector of audio buses by wrapping existing blocks of memory. | 34 // Create vector of audio buses by wrapping existing blocks of memory. |
34 uint8* ptr = static_cast<uint8*>(shared_memory_->memory()); | 35 uint8* ptr = static_cast<uint8*>(shared_memory_->memory()); |
35 for (int i = 0; i < shared_memory_segment_count; ++i) { | 36 for (int i = 0; i < shared_memory_segment_count; ++i) { |
| 37 CHECK((reinterpret_cast<uintptr_t>(ptr) & |
| 38 (media::AudioBus::kChannelAlignment - 1)) == 0U); |
36 media::AudioInputBuffer* buffer = | 39 media::AudioInputBuffer* buffer = |
37 reinterpret_cast<media::AudioInputBuffer*>(ptr); | 40 reinterpret_cast<media::AudioInputBuffer*>(ptr); |
38 scoped_ptr<media::AudioBus> audio_bus = | 41 scoped_ptr<media::AudioBus> audio_bus = |
39 media::AudioBus::WrapMemory(params, buffer->audio); | 42 media::AudioBus::WrapMemory(params, buffer->audio); |
40 audio_buses_.push_back(audio_bus.release()); | 43 audio_buses_.push_back(audio_bus.release()); |
41 ptr += shared_memory_segment_size_; | 44 ptr += shared_memory_segment_size_; |
42 } | 45 } |
43 } | 46 } |
44 | 47 |
45 AudioInputSyncWriter::~AudioInputSyncWriter() {} | 48 AudioInputSyncWriter::~AudioInputSyncWriter() {} |
46 | 49 |
47 // TODO(henrika): Combine into one method (including Write). | |
48 void AudioInputSyncWriter::UpdateRecordedBytes(uint32 bytes) { | |
49 socket_->Send(&bytes, sizeof(bytes)); | |
50 } | |
51 | |
52 void AudioInputSyncWriter::Write(const media::AudioBus* data, | 50 void AudioInputSyncWriter::Write(const media::AudioBus* data, |
53 double volume, | 51 double volume, |
54 bool key_pressed) { | 52 bool key_pressed, |
| 53 uint32 hardware_delay_bytes) { |
55 #if !defined(OS_ANDROID) | 54 #if !defined(OS_ANDROID) |
56 static const base::TimeDelta kLogDelayThreadhold = | 55 static const base::TimeDelta kLogDelayThreadhold = |
57 base::TimeDelta::FromMilliseconds(500); | 56 base::TimeDelta::FromMilliseconds(500); |
58 | 57 |
59 std::ostringstream oss; | 58 std::ostringstream oss; |
60 if (last_write_time_.is_null()) { | 59 if (last_write_time_.is_null()) { |
61 // This is the first time Write is called. | 60 // This is the first time Write is called. |
62 base::TimeDelta interval = base::Time::Now() - creation_time_; | 61 base::TimeDelta interval = base::Time::Now() - creation_time_; |
63 oss << "AISW::Write: audio input data received for the first time: delay " | 62 oss << "AISW::Write: audio input data received for the first time: delay " |
64 "= " << interval.InMilliseconds() << "ms"; | 63 "= " << interval.InMilliseconds() << "ms"; |
(...skipping 14 matching lines...) Expand all Loading... |
79 #endif | 78 #endif |
80 | 79 |
81 // Write audio parameters to shared memory. | 80 // Write audio parameters to shared memory. |
82 uint8* ptr = static_cast<uint8*>(shared_memory_->memory()); | 81 uint8* ptr = static_cast<uint8*>(shared_memory_->memory()); |
83 ptr += current_segment_id_ * shared_memory_segment_size_; | 82 ptr += current_segment_id_ * shared_memory_segment_size_; |
84 media::AudioInputBuffer* buffer = | 83 media::AudioInputBuffer* buffer = |
85 reinterpret_cast<media::AudioInputBuffer*>(ptr); | 84 reinterpret_cast<media::AudioInputBuffer*>(ptr); |
86 buffer->params.volume = volume; | 85 buffer->params.volume = volume; |
87 buffer->params.size = audio_bus_memory_size_; | 86 buffer->params.size = audio_bus_memory_size_; |
88 buffer->params.key_pressed = key_pressed; | 87 buffer->params.key_pressed = key_pressed; |
| 88 buffer->params.hardware_delay_bytes = hardware_delay_bytes; |
| 89 buffer->params.id = next_buffer_id_++; |
89 | 90 |
90 // Copy data from the native audio layer into shared memory using pre- | 91 // Copy data from the native audio layer into shared memory using pre- |
91 // allocated audio buses. | 92 // allocated audio buses. |
92 media::AudioBus* audio_bus = audio_buses_[current_segment_id_]; | 93 media::AudioBus* audio_bus = audio_buses_[current_segment_id_]; |
93 data->CopyTo(audio_bus); | 94 data->CopyTo(audio_bus); |
94 | 95 |
| 96 socket_->Send(¤t_segment_id_, sizeof(current_segment_id_)); |
| 97 |
95 if (++current_segment_id_ >= shared_memory_segment_count_) | 98 if (++current_segment_id_ >= shared_memory_segment_count_) |
96 current_segment_id_ = 0; | 99 current_segment_id_ = 0; |
97 } | 100 } |
98 | 101 |
99 void AudioInputSyncWriter::Close() { | 102 void AudioInputSyncWriter::Close() { |
100 socket_->Close(); | 103 socket_->Close(); |
101 } | 104 } |
102 | 105 |
103 bool AudioInputSyncWriter::Init() { | 106 bool AudioInputSyncWriter::Init() { |
104 socket_.reset(new base::CancelableSyncSocket()); | 107 socket_.reset(new base::CancelableSyncSocket()); |
105 foreign_socket_.reset(new base::CancelableSyncSocket()); | 108 foreign_socket_.reset(new base::CancelableSyncSocket()); |
106 return base::CancelableSyncSocket::CreatePair(socket_.get(), | 109 return base::CancelableSyncSocket::CreatePair(socket_.get(), |
107 foreign_socket_.get()); | 110 foreign_socket_.get()); |
108 } | 111 } |
109 | 112 |
110 bool AudioInputSyncWriter::PrepareForeignSocket( | 113 bool AudioInputSyncWriter::PrepareForeignSocket( |
111 base::ProcessHandle process_handle, | 114 base::ProcessHandle process_handle, |
112 base::SyncSocket::TransitDescriptor* descriptor) { | 115 base::SyncSocket::TransitDescriptor* descriptor) { |
113 return foreign_socket_->PrepareTransitDescriptor(process_handle, descriptor); | 116 return foreign_socket_->PrepareTransitDescriptor(process_handle, descriptor); |
114 } | 117 } |
115 | 118 |
116 | 119 |
117 } // namespace content | 120 } // namespace content |
OLD | NEW |