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" | 9 #include "base/basictypes.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/mac/mac_logging.h" | 11 #include "base/mac/mac_logging.h" |
12 #include "media/audio/mac/audio_manager_mac.h" | 12 #include "media/audio/mac/audio_manager_mac.h" |
13 #include "media/base/audio_bus.h" | |
14 #include "media/base/data_buffer.h" | 13 #include "media/base/data_buffer.h" |
15 | 14 |
16 namespace media { | 15 namespace media { |
17 | 16 |
18 static std::ostream& operator<<(std::ostream& os, | 17 static std::ostream& operator<<(std::ostream& os, |
19 const AudioStreamBasicDescription& format) { | 18 const AudioStreamBasicDescription& format) { |
20 os << "sample rate : " << format.mSampleRate << std::endl | 19 os << "sample rate : " << format.mSampleRate << std::endl |
21 << "format ID : " << format.mFormatID << std::endl | 20 << "format ID : " << format.mFormatID << std::endl |
22 << "format flags : " << format.mFormatFlags << std::endl | 21 << "format flags : " << format.mFormatFlags << std::endl |
23 << "bytes per packet : " << format.mBytesPerPacket << std::endl | 22 << "bytes per packet : " << format.mBytesPerPacket << std::endl |
24 << "frames per packet : " << format.mFramesPerPacket << std::endl | 23 << "frames per packet : " << format.mFramesPerPacket << std::endl |
25 << "bytes per frame : " << format.mBytesPerFrame << std::endl | 24 << "bytes per frame : " << format.mBytesPerFrame << std::endl |
26 << "channels per frame: " << format.mChannelsPerFrame << std::endl | 25 << "channels per frame: " << format.mChannelsPerFrame << std::endl |
27 << "bits per channel : " << format.mBitsPerChannel; | 26 << "bits per channel : " << format.mBitsPerChannel; |
28 return os; | 27 return os; |
29 } | 28 } |
30 | 29 |
31 // See "Technical Note TN2091 - Device input using the HAL Output Audio Unit" | 30 // See "Technical Note TN2091 - Device input using the HAL Output Audio Unit" |
32 // http://developer.apple.com/library/mac/#technotes/tn2091/_index.html | 31 // http://developer.apple.com/library/mac/#technotes/tn2091/_index.html |
33 // for more details and background regarding this implementation. | 32 // for more details and background regarding this implementation. |
34 | 33 |
35 AUAudioInputStream::AUAudioInputStream(AudioManagerMac* manager, | 34 AUAudioInputStream::AUAudioInputStream( |
36 const AudioParameters& input_params, | 35 AudioManagerMac* manager, |
37 const AudioParameters& output_params, | 36 const AudioParameters& input_params, |
38 AudioDeviceID audio_device_id) | 37 const AudioParameters& output_params, |
| 38 AudioDeviceID audio_device_id) |
39 : manager_(manager), | 39 : manager_(manager), |
40 sink_(NULL), | 40 sink_(NULL), |
41 audio_unit_(0), | 41 audio_unit_(0), |
42 input_device_id_(audio_device_id), | 42 input_device_id_(audio_device_id), |
43 started_(false), | 43 started_(false), |
44 hardware_latency_frames_(0), | 44 hardware_latency_frames_(0), |
45 fifo_delay_bytes_(0), | 45 fifo_delay_bytes_(0), |
46 number_of_channels_in_frame_(0), | 46 number_of_channels_in_frame_(0) { |
47 audio_bus_(media::AudioBus::Create(input_params)) { | |
48 DCHECK(manager_); | 47 DCHECK(manager_); |
49 | 48 |
50 // Set up the desired (output) format specified by the client. | 49 // Set up the desired (output) format specified by the client. |
51 format_.mSampleRate = input_params.sample_rate(); | 50 format_.mSampleRate = input_params.sample_rate(); |
52 format_.mFormatID = kAudioFormatLinearPCM; | 51 format_.mFormatID = kAudioFormatLinearPCM; |
53 format_.mFormatFlags = kLinearPCMFormatFlagIsPacked | | 52 format_.mFormatFlags = kLinearPCMFormatFlagIsPacked | |
54 kLinearPCMFormatFlagIsSignedInteger; | 53 kLinearPCMFormatFlagIsSignedInteger; |
55 format_.mBitsPerChannel = input_params.bits_per_sample(); | 54 format_.mBitsPerChannel = input_params.bits_per_sample(); |
56 format_.mChannelsPerFrame = input_params.channels(); | 55 format_.mChannelsPerFrame = input_params.channels(); |
57 format_.mFramesPerPacket = 1; // uncompressed audio | 56 format_.mFramesPerPacket = 1; // uncompressed audio |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 // Accumulate captured audio in FIFO until we can match the output size | 535 // Accumulate captured audio in FIFO until we can match the output size |
537 // requested by the client. | 536 // requested by the client. |
538 fifo_->Append(audio_data, buffer.mDataByteSize); | 537 fifo_->Append(audio_data, buffer.mDataByteSize); |
539 | 538 |
540 // Deliver recorded data to the client as soon as the FIFO contains a | 539 // Deliver recorded data to the client as soon as the FIFO contains a |
541 // sufficient amount. | 540 // sufficient amount. |
542 if (fifo_->forward_bytes() >= requested_size_bytes_) { | 541 if (fifo_->forward_bytes() >= requested_size_bytes_) { |
543 // Read from FIFO into temporary data buffer. | 542 // Read from FIFO into temporary data buffer. |
544 fifo_->Read(data_->writable_data(), requested_size_bytes_); | 543 fifo_->Read(data_->writable_data(), requested_size_bytes_); |
545 | 544 |
546 // Copy captured (and interleaved) data into deinterleaved audio bus. | |
547 audio_bus_->FromInterleaved( | |
548 data_->data(), audio_bus_->frames(), format_.mBitsPerChannel / 8); | |
549 | |
550 // Deliver data packet, delay estimation and volume level to the user. | 545 // Deliver data packet, delay estimation and volume level to the user. |
551 sink_->OnData( | 546 sink_->OnData(this, |
552 this, audio_bus_.get(), capture_delay_bytes, normalized_volume); | 547 data_->data(), |
| 548 requested_size_bytes_, |
| 549 capture_delay_bytes, |
| 550 normalized_volume); |
553 } | 551 } |
554 | 552 |
555 return noErr; | 553 return noErr; |
556 } | 554 } |
557 | 555 |
558 int AUAudioInputStream::HardwareSampleRate() { | 556 int AUAudioInputStream::HardwareSampleRate() { |
559 // Determine the default input device's sample-rate. | 557 // Determine the default input device's sample-rate. |
560 AudioDeviceID device_id = kAudioObjectUnknown; | 558 AudioDeviceID device_id = kAudioObjectUnknown; |
561 UInt32 info_size = sizeof(device_id); | 559 UInt32 info_size = sizeof(device_id); |
562 | 560 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 kAudioDevicePropertyScopeInput, | 682 kAudioDevicePropertyScopeInput, |
685 static_cast<UInt32>(channel) | 683 static_cast<UInt32>(channel) |
686 }; | 684 }; |
687 OSStatus result = AudioObjectIsPropertySettable(input_device_id_, | 685 OSStatus result = AudioObjectIsPropertySettable(input_device_id_, |
688 &property_address, | 686 &property_address, |
689 &is_settable); | 687 &is_settable); |
690 return (result == noErr) ? is_settable : false; | 688 return (result == noErr) ? is_settable : false; |
691 } | 689 } |
692 | 690 |
693 } // namespace media | 691 } // namespace media |
OLD | NEW |