| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 _inputDeviceIndex(0), | 118 _inputDeviceIndex(0), |
| 119 _outputDeviceIndex(0), | 119 _outputDeviceIndex(0), |
| 120 _inputDeviceID(kAudioObjectUnknown), | 120 _inputDeviceID(kAudioObjectUnknown), |
| 121 _outputDeviceID(kAudioObjectUnknown), | 121 _outputDeviceID(kAudioObjectUnknown), |
| 122 _inputDeviceIsSpecified(false), | 122 _inputDeviceIsSpecified(false), |
| 123 _outputDeviceIsSpecified(false), | 123 _outputDeviceIsSpecified(false), |
| 124 _recChannels(N_REC_CHANNELS), | 124 _recChannels(N_REC_CHANNELS), |
| 125 _playChannels(N_PLAY_CHANNELS), | 125 _playChannels(N_PLAY_CHANNELS), |
| 126 _captureBufData(NULL), | 126 _captureBufData(NULL), |
| 127 _renderBufData(NULL), | 127 _renderBufData(NULL), |
| 128 _playBufType(AudioDeviceModule::kFixedBufferSize), | |
| 129 _initialized(false), | 128 _initialized(false), |
| 130 _isShutDown(false), | 129 _isShutDown(false), |
| 131 _recording(false), | 130 _recording(false), |
| 132 _playing(false), | 131 _playing(false), |
| 133 _recIsInitialized(false), | 132 _recIsInitialized(false), |
| 134 _playIsInitialized(false), | 133 _playIsInitialized(false), |
| 135 _AGC(false), | 134 _AGC(false), |
| 136 _renderDeviceIsAlive(1), | 135 _renderDeviceIsAlive(1), |
| 137 _captureDeviceIsAlive(1), | 136 _captureDeviceIsAlive(1), |
| 138 _twoDevices(true), | 137 _twoDevices(true), |
| 139 _doStop(false), | 138 _doStop(false), |
| 140 _doStopRec(false), | 139 _doStopRec(false), |
| 141 _macBookPro(false), | 140 _macBookPro(false), |
| 142 _macBookProPanRight(false), | 141 _macBookProPanRight(false), |
| 143 _captureLatencyUs(0), | 142 _captureLatencyUs(0), |
| 144 _renderLatencyUs(0), | 143 _renderLatencyUs(0), |
| 145 _captureDelayUs(0), | 144 _captureDelayUs(0), |
| 146 _renderDelayUs(0), | 145 _renderDelayUs(0), |
| 147 _renderDelayOffsetSamples(0), | 146 _renderDelayOffsetSamples(0), |
| 148 _playBufDelayFixed(20), | |
| 149 _playWarning(0), | 147 _playWarning(0), |
| 150 _playError(0), | 148 _playError(0), |
| 151 _recWarning(0), | 149 _recWarning(0), |
| 152 _recError(0), | 150 _recError(0), |
| 153 _paCaptureBuffer(NULL), | 151 _paCaptureBuffer(NULL), |
| 154 _paRenderBuffer(NULL), | 152 _paRenderBuffer(NULL), |
| 155 _captureBufSizeSamples(0), | 153 _captureBufSizeSamples(0), |
| 156 _renderBufSizeSamples(0), | 154 _renderBufSizeSamples(0), |
| 157 prev_key_state_(), | 155 prev_key_state_(), |
| 158 get_mic_volume_counter_ms_(0) { | 156 get_mic_volume_counter_ms_(0) { |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 uint32_t minVol(0); | 561 uint32_t minVol(0); |
| 564 | 562 |
| 565 if (_mixerManager.MinSpeakerVolume(minVol) == -1) { | 563 if (_mixerManager.MinSpeakerVolume(minVol) == -1) { |
| 566 return -1; | 564 return -1; |
| 567 } | 565 } |
| 568 | 566 |
| 569 minVolume = minVol; | 567 minVolume = minVol; |
| 570 return 0; | 568 return 0; |
| 571 } | 569 } |
| 572 | 570 |
| 573 int32_t AudioDeviceMac::SpeakerVolumeStepSize(uint16_t& stepSize) const { | |
| 574 uint16_t delta(0); | |
| 575 | |
| 576 if (_mixerManager.SpeakerVolumeStepSize(delta) == -1) { | |
| 577 return -1; | |
| 578 } | |
| 579 | |
| 580 stepSize = delta; | |
| 581 return 0; | |
| 582 } | |
| 583 | |
| 584 int32_t AudioDeviceMac::SpeakerMuteIsAvailable(bool& available) { | 571 int32_t AudioDeviceMac::SpeakerMuteIsAvailable(bool& available) { |
| 585 bool isAvailable(false); | 572 bool isAvailable(false); |
| 586 bool wasInitialized = _mixerManager.SpeakerIsInitialized(); | 573 bool wasInitialized = _mixerManager.SpeakerIsInitialized(); |
| 587 | 574 |
| 588 // Make an attempt to open up the | 575 // Make an attempt to open up the |
| 589 // output mixer corresponding to the currently selected output device. | 576 // output mixer corresponding to the currently selected output device. |
| 590 // | 577 // |
| 591 if (!wasInitialized && InitSpeaker() == -1) { | 578 if (!wasInitialized && InitSpeaker() == -1) { |
| 592 // If we end up here it means that the selected speaker has no volume | 579 // If we end up here it means that the selected speaker has no volume |
| 593 // control, hence it is safe to state that there is no mute control | 580 // control, hence it is safe to state that there is no mute control |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 bool muted(0); | 650 bool muted(0); |
| 664 | 651 |
| 665 if (_mixerManager.MicrophoneMute(muted) == -1) { | 652 if (_mixerManager.MicrophoneMute(muted) == -1) { |
| 666 return -1; | 653 return -1; |
| 667 } | 654 } |
| 668 | 655 |
| 669 enabled = muted; | 656 enabled = muted; |
| 670 return 0; | 657 return 0; |
| 671 } | 658 } |
| 672 | 659 |
| 673 int32_t AudioDeviceMac::MicrophoneBoostIsAvailable(bool& available) { | |
| 674 bool isAvailable(false); | |
| 675 bool wasInitialized = _mixerManager.MicrophoneIsInitialized(); | |
| 676 | |
| 677 // Enumerate all avaliable microphone and make an attempt to open up the | |
| 678 // input mixer corresponding to the currently selected input device. | |
| 679 // | |
| 680 if (!wasInitialized && InitMicrophone() == -1) { | |
| 681 // If we end up here it means that the selected microphone has no volume | |
| 682 // control, hence it is safe to state that there is no boost control | |
| 683 // already at this stage. | |
| 684 available = false; | |
| 685 return 0; | |
| 686 } | |
| 687 | |
| 688 // Check if the selected microphone has a boost control | |
| 689 // | |
| 690 _mixerManager.MicrophoneBoostIsAvailable(isAvailable); | |
| 691 available = isAvailable; | |
| 692 | |
| 693 // Close the initialized input mixer | |
| 694 // | |
| 695 if (!wasInitialized) { | |
| 696 _mixerManager.CloseMicrophone(); | |
| 697 } | |
| 698 | |
| 699 return 0; | |
| 700 } | |
| 701 | |
| 702 int32_t AudioDeviceMac::SetMicrophoneBoost(bool enable) { | |
| 703 return (_mixerManager.SetMicrophoneBoost(enable)); | |
| 704 } | |
| 705 | |
| 706 int32_t AudioDeviceMac::MicrophoneBoost(bool& enabled) const { | |
| 707 bool onOff(0); | |
| 708 | |
| 709 if (_mixerManager.MicrophoneBoost(onOff) == -1) { | |
| 710 return -1; | |
| 711 } | |
| 712 | |
| 713 enabled = onOff; | |
| 714 return 0; | |
| 715 } | |
| 716 | |
| 717 int32_t AudioDeviceMac::StereoRecordingIsAvailable(bool& available) { | 660 int32_t AudioDeviceMac::StereoRecordingIsAvailable(bool& available) { |
| 718 bool isAvailable(false); | 661 bool isAvailable(false); |
| 719 bool wasInitialized = _mixerManager.MicrophoneIsInitialized(); | 662 bool wasInitialized = _mixerManager.MicrophoneIsInitialized(); |
| 720 | 663 |
| 721 if (!wasInitialized && InitMicrophone() == -1) { | 664 if (!wasInitialized && InitMicrophone() == -1) { |
| 722 // Cannot open the specified device | 665 // Cannot open the specified device |
| 723 available = false; | 666 available = false; |
| 724 return 0; | 667 return 0; |
| 725 } | 668 } |
| 726 | 669 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 866 uint32_t minVol(0); | 809 uint32_t minVol(0); |
| 867 | 810 |
| 868 if (_mixerManager.MinMicrophoneVolume(minVol) == -1) { | 811 if (_mixerManager.MinMicrophoneVolume(minVol) == -1) { |
| 869 return -1; | 812 return -1; |
| 870 } | 813 } |
| 871 | 814 |
| 872 minVolume = minVol; | 815 minVolume = minVol; |
| 873 return 0; | 816 return 0; |
| 874 } | 817 } |
| 875 | 818 |
| 876 int32_t AudioDeviceMac::MicrophoneVolumeStepSize(uint16_t& stepSize) const { | |
| 877 uint16_t delta(0); | |
| 878 | |
| 879 if (_mixerManager.MicrophoneVolumeStepSize(delta) == -1) { | |
| 880 return -1; | |
| 881 } | |
| 882 | |
| 883 stepSize = delta; | |
| 884 return 0; | |
| 885 } | |
| 886 | |
| 887 int16_t AudioDeviceMac::PlayoutDevices() { | 819 int16_t AudioDeviceMac::PlayoutDevices() { |
| 888 AudioDeviceID playDevices[MaxNumberDevices]; | 820 AudioDeviceID playDevices[MaxNumberDevices]; |
| 889 return GetNumberDevices(kAudioDevicePropertyScopeOutput, playDevices, | 821 return GetNumberDevices(kAudioDevicePropertyScopeOutput, playDevices, |
| 890 MaxNumberDevices); | 822 MaxNumberDevices); |
| 891 } | 823 } |
| 892 | 824 |
| 893 int32_t AudioDeviceMac::SetPlayoutDevice(uint16_t index) { | 825 int32_t AudioDeviceMac::SetPlayoutDevice(uint16_t index) { |
| 894 rtc::CritScope lock(&_critSect); | 826 rtc::CritScope lock(&_critSect); |
| 895 | 827 |
| 896 if (_playIsInitialized) { | 828 if (_playIsInitialized) { |
| (...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 int32_t captureDelayUs = AtomicGet32(&_captureDelayUs); | 1548 int32_t captureDelayUs = AtomicGet32(&_captureDelayUs); |
| 1617 delayMS = | 1549 delayMS = |
| 1618 static_cast<uint16_t>(1e-3 * (captureDelayUs + _captureLatencyUs) + 0.5); | 1550 static_cast<uint16_t>(1e-3 * (captureDelayUs + _captureLatencyUs) + 0.5); |
| 1619 return 0; | 1551 return 0; |
| 1620 } | 1552 } |
| 1621 | 1553 |
| 1622 bool AudioDeviceMac::Playing() const { | 1554 bool AudioDeviceMac::Playing() const { |
| 1623 return (_playing); | 1555 return (_playing); |
| 1624 } | 1556 } |
| 1625 | 1557 |
| 1626 int32_t AudioDeviceMac::SetPlayoutBuffer( | |
| 1627 const AudioDeviceModule::BufferType type, | |
| 1628 uint16_t sizeMS) { | |
| 1629 if (type != AudioDeviceModule::kFixedBufferSize) { | |
| 1630 LOG(LS_ERROR) << "Adaptive buffer size not supported on this platform"; | |
| 1631 return -1; | |
| 1632 } | |
| 1633 | |
| 1634 _playBufType = type; | |
| 1635 _playBufDelayFixed = sizeMS; | |
| 1636 return 0; | |
| 1637 } | |
| 1638 | |
| 1639 int32_t AudioDeviceMac::PlayoutBuffer(AudioDeviceModule::BufferType& type, | |
| 1640 uint16_t& sizeMS) const { | |
| 1641 type = _playBufType; | |
| 1642 sizeMS = _playBufDelayFixed; | |
| 1643 | |
| 1644 return 0; | |
| 1645 } | |
| 1646 | |
| 1647 // Not implemented for Mac. | |
| 1648 int32_t AudioDeviceMac::CPULoad(uint16_t& /*load*/) const { | |
| 1649 LOG(LS_WARNING) << "API call not supported on this platform"; | |
| 1650 | |
| 1651 return -1; | |
| 1652 } | |
| 1653 | |
| 1654 bool AudioDeviceMac::PlayoutWarning() const { | 1558 bool AudioDeviceMac::PlayoutWarning() const { |
| 1655 return (_playWarning > 0); | 1559 return (_playWarning > 0); |
| 1656 } | 1560 } |
| 1657 | 1561 |
| 1658 bool AudioDeviceMac::PlayoutError() const { | 1562 bool AudioDeviceMac::PlayoutError() const { |
| 1659 return (_playError > 0); | 1563 return (_playError > 0); |
| 1660 } | 1564 } |
| 1661 | 1565 |
| 1662 bool AudioDeviceMac::RecordingWarning() const { | 1566 bool AudioDeviceMac::RecordingWarning() const { |
| 1663 return (_recWarning > 0); | 1567 return (_recWarning > 0); |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1971 kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; | 1875 kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; |
| 1972 #ifdef WEBRTC_ARCH_BIG_ENDIAN | 1876 #ifdef WEBRTC_ARCH_BIG_ENDIAN |
| 1973 _outDesiredFormat.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; | 1877 _outDesiredFormat.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; |
| 1974 #endif | 1878 #endif |
| 1975 _outDesiredFormat.mFormatID = kAudioFormatLinearPCM; | 1879 _outDesiredFormat.mFormatID = kAudioFormatLinearPCM; |
| 1976 | 1880 |
| 1977 OSStatus err = noErr; | 1881 OSStatus err = noErr; |
| 1978 WEBRTC_CA_RETURN_ON_ERR(AudioConverterNew( | 1882 WEBRTC_CA_RETURN_ON_ERR(AudioConverterNew( |
| 1979 &_outDesiredFormat, &_outStreamFormat, &_renderConverter)); | 1883 &_outDesiredFormat, &_outStreamFormat, &_renderConverter)); |
| 1980 | 1884 |
| 1981 // Try to set buffer size to desired value (_playBufDelayFixed). | 1885 // Try to set buffer size to desired value set to 20ms. |
| 1886 const uint16_t kPlayBufDelayFixed = 20; |
| 1982 UInt32 bufByteCount = static_cast<UInt32>( | 1887 UInt32 bufByteCount = static_cast<UInt32>( |
| 1983 (_outStreamFormat.mSampleRate / 1000.0) * _playBufDelayFixed * | 1888 (_outStreamFormat.mSampleRate / 1000.0) * kPlayBufDelayFixed * |
| 1984 _outStreamFormat.mChannelsPerFrame * sizeof(Float32)); | 1889 _outStreamFormat.mChannelsPerFrame * sizeof(Float32)); |
| 1985 if (_outStreamFormat.mFramesPerPacket != 0) { | 1890 if (_outStreamFormat.mFramesPerPacket != 0) { |
| 1986 if (bufByteCount % _outStreamFormat.mFramesPerPacket != 0) { | 1891 if (bufByteCount % _outStreamFormat.mFramesPerPacket != 0) { |
| 1987 bufByteCount = (static_cast<UInt32>(bufByteCount / | 1892 bufByteCount = (static_cast<UInt32>(bufByteCount / |
| 1988 _outStreamFormat.mFramesPerPacket) + | 1893 _outStreamFormat.mFramesPerPacket) + |
| 1989 1) * | 1894 1) * |
| 1990 _outStreamFormat.mFramesPerPacket; | 1895 _outStreamFormat.mFramesPerPacket; |
| 1991 } | 1896 } |
| 1992 } | 1897 } |
| 1993 | 1898 |
| (...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2697 bool keyState = | 2602 bool keyState = |
| 2698 CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, key_index); | 2603 CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, key_index); |
| 2699 // A false -> true change in keymap means a key is pressed. | 2604 // A false -> true change in keymap means a key is pressed. |
| 2700 key_down |= (keyState && !prev_key_state_[key_index]); | 2605 key_down |= (keyState && !prev_key_state_[key_index]); |
| 2701 // Save current state. | 2606 // Save current state. |
| 2702 prev_key_state_[key_index] = keyState; | 2607 prev_key_state_[key_index] = keyState; |
| 2703 } | 2608 } |
| 2704 return key_down; | 2609 return key_down; |
| 2705 } | 2610 } |
| 2706 } // namespace webrtc | 2611 } // namespace webrtc |
| OLD | NEW |