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 3 // found in the LICENSE file. 4 5 #include "content/browser/renderer_host/media/audio_input_sync_writer.h" 6 7 #include <algorithm> 8 9 #include "base/memory/shared_memory.h" 10 11 namespace content { 12 13 AudioInputSyncWriter::AudioInputSyncWriter( 14 base::SharedMemory* shared_memory, 15 int shared_memory_segment_count) 16 : shared_memory_(shared_memory), 17 shared_memory_segment_count_(shared_memory_segment_count), 18 current_segment_id_(0) { 19 DCHECK_GT(shared_memory_segment_count, 0); 20 DCHECK_EQ(shared_memory->requested_size() % shared_memory_segment_count, 0u); 21 shared_memory_segment_size_ = 22 shared_memory->requested_size() / shared_memory_segment_count; 23 } 24 25 AudioInputSyncWriter::~AudioInputSyncWriter() {} 26 27 // TODO(henrika): Combine into one method (including Write). 28 void AudioInputSyncWriter::UpdateRecordedBytes(uint32 bytes) { 29 socket_->Send(&bytes, sizeof(bytes)); 30 } 31 32 uint32 AudioInputSyncWriter::Write( 33 const void* data, uint32 size, double volume) { 34 uint8* ptr = static_cast<uint8*>(shared_memory_->memory()); 35 ptr += current_segment_id_ * shared_memory_segment_size_; 36 media::AudioInputBuffer* buffer = 37 reinterpret_cast<media::AudioInputBuffer*>(ptr); 38 buffer->params.volume = volume; 39 buffer->params.size = size; 40 memcpy(buffer->audio, data, size); 41 42 if (++current_segment_id_ >= shared_memory_segment_count_) 43 current_segment_id_ = 0; 44 45 return size; 46 } 47 48 void AudioInputSyncWriter::Close() { 49 socket_->Close(); 50 } 51 52 bool AudioInputSyncWriter::Init() { 53 socket_.reset(new base::CancelableSyncSocket()); 54 foreign_socket_.reset(new base::CancelableSyncSocket()); 55 return base::CancelableSyncSocket::CreatePair(socket_.get(), 56 foreign_socket_.get()); 57 } 58 59 #if defined(OS_WIN) 60 61 bool AudioInputSyncWriter::PrepareForeignSocketHandle( 62 base::ProcessHandle process_handle, 63 base::SyncSocket::Handle* foreign_handle) { 64 ::DuplicateHandle(GetCurrentProcess(), foreign_socket_->handle(), 65 process_handle, foreign_handle, 66 0, FALSE, DUPLICATE_SAME_ACCESS); 67 return (*foreign_handle != 0); 68 } 69 70 #else 71 72 bool AudioInputSyncWriter::PrepareForeignSocketHandle( 73 base::ProcessHandle process_handle, 74 base::FileDescriptor* foreign_handle) { 75 foreign_handle->fd = foreign_socket_->handle(); 76 foreign_handle->auto_close = false; 77 return (foreign_handle->fd != -1); 78 } 79 80 #endif 81 82 } // namespace content 83