Home | History | Annotate | Download | only in media
      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