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 "media/audio/mac/audio_low_latency_input_mac.h" | 5 #include "media/audio/mac/audio_low_latency_input_mac.h" |
6 | 6 |
7 #include <CoreServices/CoreServices.h> | 7 #include <CoreServices/CoreServices.h> |
8 | 8 |
9 #include "base/basictypes.h" | |
10 #include "base/logging.h" | 9 #include "base/logging.h" |
11 #include "base/mac/mac_logging.h" | 10 #include "base/mac/mac_logging.h" |
12 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
13 #include "base/metrics/sparse_histogram.h" | 12 #include "base/metrics/sparse_histogram.h" |
14 #include "base/time/time.h" | 13 #include "base/time/time.h" |
15 #include "media/audio/mac/audio_manager_mac.h" | 14 #include "media/audio/mac/audio_manager_mac.h" |
16 #include "media/base/audio_bus.h" | 15 #include "media/base/audio_bus.h" |
17 #include "media/base/data_buffer.h" | 16 #include "media/base/data_buffer.h" |
18 | 17 |
19 namespace media { | 18 namespace media { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 | 81 |
83 DVLOG(1) << "Desired ouput format: " << format_; | 82 DVLOG(1) << "Desired ouput format: " << format_; |
84 | 83 |
85 // Derive size (in bytes) of the buffers that we will render to. | 84 // Derive size (in bytes) of the buffers that we will render to. |
86 UInt32 data_byte_size = number_of_frames_ * format_.mBytesPerFrame; | 85 UInt32 data_byte_size = number_of_frames_ * format_.mBytesPerFrame; |
87 DVLOG(1) << "Size of data buffer in bytes : " << data_byte_size; | 86 DVLOG(1) << "Size of data buffer in bytes : " << data_byte_size; |
88 | 87 |
89 // Allocate AudioBuffers to be used as storage for the received audio. | 88 // Allocate AudioBuffers to be used as storage for the received audio. |
90 // The AudioBufferList structure works as a placeholder for the | 89 // The AudioBufferList structure works as a placeholder for the |
91 // AudioBuffer structure, which holds a pointer to the actual data buffer. | 90 // AudioBuffer structure, which holds a pointer to the actual data buffer. |
92 audio_data_buffer_.reset(new uint8[data_byte_size]); | 91 audio_data_buffer_.reset(new uint8_t[data_byte_size]); |
93 audio_buffer_list_.mNumberBuffers = 1; | 92 audio_buffer_list_.mNumberBuffers = 1; |
94 | 93 |
95 AudioBuffer* audio_buffer = audio_buffer_list_.mBuffers; | 94 AudioBuffer* audio_buffer = audio_buffer_list_.mBuffers; |
96 audio_buffer->mNumberChannels = input_params.channels(); | 95 audio_buffer->mNumberChannels = input_params.channels(); |
97 audio_buffer->mDataByteSize = data_byte_size; | 96 audio_buffer->mDataByteSize = data_byte_size; |
98 audio_buffer->mData = audio_data_buffer_.get(); | 97 audio_buffer->mData = audio_data_buffer_.get(); |
99 } | 98 } |
100 | 99 |
101 AUAudioInputStream::~AUAudioInputStream() {} | 100 AUAudioInputStream::~AUAudioInputStream() {} |
102 | 101 |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 // See crbug/428706 for details. | 513 // See crbug/428706 for details. |
515 UInt32 new_size = number_of_frames * audio_input->format_.mBytesPerFrame; | 514 UInt32 new_size = number_of_frames * audio_input->format_.mBytesPerFrame; |
516 AudioBuffer* audio_buffer = audio_input->audio_buffer_list()->mBuffers; | 515 AudioBuffer* audio_buffer = audio_input->audio_buffer_list()->mBuffers; |
517 if (new_size != audio_buffer->mDataByteSize) { | 516 if (new_size != audio_buffer->mDataByteSize) { |
518 if (new_size > audio_buffer->mDataByteSize) { | 517 if (new_size > audio_buffer->mDataByteSize) { |
519 // This can happen if the device is unpluged during recording. We | 518 // This can happen if the device is unpluged during recording. We |
520 // allocate enough memory here to avoid depending on how CoreAudio | 519 // allocate enough memory here to avoid depending on how CoreAudio |
521 // handles it. | 520 // handles it. |
522 // See See http://www.crbug.com/434681 for one example when we can enter | 521 // See See http://www.crbug.com/434681 for one example when we can enter |
523 // this scope. | 522 // this scope. |
524 audio_input->audio_data_buffer_.reset(new uint8[new_size]); | 523 audio_input->audio_data_buffer_.reset(new uint8_t[new_size]); |
525 audio_buffer->mData = audio_input->audio_data_buffer_.get(); | 524 audio_buffer->mData = audio_input->audio_data_buffer_.get(); |
526 } | 525 } |
527 | 526 |
528 // Update the |mDataByteSize| to match |number_of_frames|. | 527 // Update the |mDataByteSize| to match |number_of_frames|. |
529 audio_buffer->mDataByteSize = new_size; | 528 audio_buffer->mDataByteSize = new_size; |
530 } | 529 } |
531 | 530 |
532 // Receive audio from the AUHAL from the output scope of the Audio Unit. | 531 // Receive audio from the AUHAL from the output scope of the Audio Unit. |
533 OSStatus result = AudioUnitRender(audio_input->audio_unit(), | 532 OSStatus result = AudioUnitRender(audio_input->audio_unit(), |
534 flags, | 533 flags, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 // Update the capture latency. | 574 // Update the capture latency. |
576 double capture_latency_frames = GetCaptureLatency(time_stamp); | 575 double capture_latency_frames = GetCaptureLatency(time_stamp); |
577 | 576 |
578 // The AGC volume level is updated once every second on a separate thread. | 577 // The AGC volume level is updated once every second on a separate thread. |
579 // Note that, |volume| is also updated each time SetVolume() is called | 578 // Note that, |volume| is also updated each time SetVolume() is called |
580 // through IPC by the render-side AGC. | 579 // through IPC by the render-side AGC. |
581 double normalized_volume = 0.0; | 580 double normalized_volume = 0.0; |
582 GetAgcVolume(&normalized_volume); | 581 GetAgcVolume(&normalized_volume); |
583 | 582 |
584 AudioBuffer& buffer = io_data->mBuffers[0]; | 583 AudioBuffer& buffer = io_data->mBuffers[0]; |
585 uint8* audio_data = reinterpret_cast<uint8*>(buffer.mData); | 584 uint8_t* audio_data = reinterpret_cast<uint8_t*>(buffer.mData); |
586 uint32 capture_delay_bytes = static_cast<uint32> | 585 uint32_t capture_delay_bytes = static_cast<uint32_t>( |
587 ((capture_latency_frames + 0.5) * format_.mBytesPerFrame); | 586 (capture_latency_frames + 0.5) * format_.mBytesPerFrame); |
588 DCHECK(audio_data); | 587 DCHECK(audio_data); |
589 if (!audio_data) | 588 if (!audio_data) |
590 return kAudioUnitErr_InvalidElement; | 589 return kAudioUnitErr_InvalidElement; |
591 | 590 |
592 // Dynamically increase capacity of the FIFO to handle larger buffers from | 591 // Dynamically increase capacity of the FIFO to handle larger buffers from |
593 // CoreAudio. This can happen in combination with Apple Thunderbolt Displays | 592 // CoreAudio. This can happen in combination with Apple Thunderbolt Displays |
594 // when the Display Audio is used as capture source and the cable is first | 593 // when the Display Audio is used as capture source and the cable is first |
595 // remove and then inserted again. | 594 // remove and then inserted again. |
596 // See http://www.crbug.com/434681 for details. | 595 // See http://www.crbug.com/434681 for details. |
597 if (static_cast<int>(number_of_frames) > fifo_.GetUnfilledFrames()) { | 596 if (static_cast<int>(number_of_frames) > fifo_.GetUnfilledFrames()) { |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 buffer_size_was_changed_); | 802 buffer_size_was_changed_); |
804 UMA_HISTOGRAM_COUNTS_1000("Media.Audio.NumberOfOutputStreamsMac", | 803 UMA_HISTOGRAM_COUNTS_1000("Media.Audio.NumberOfOutputStreamsMac", |
805 manager_->output_streams()); | 804 manager_->output_streams()); |
806 UMA_HISTOGRAM_COUNTS_1000("Media.Audio.NumberOfLowLatencyInputStreamsMac", | 805 UMA_HISTOGRAM_COUNTS_1000("Media.Audio.NumberOfLowLatencyInputStreamsMac", |
807 manager_->low_latency_input_streams()); | 806 manager_->low_latency_input_streams()); |
808 UMA_HISTOGRAM_COUNTS_1000("Media.Audio.NumberOfBasicInputStreamsMac", | 807 UMA_HISTOGRAM_COUNTS_1000("Media.Audio.NumberOfBasicInputStreamsMac", |
809 manager_->basic_input_streams()); | 808 manager_->basic_input_streams()); |
810 } | 809 } |
811 | 810 |
812 } // namespace media | 811 } // namespace media |
OLD | NEW |