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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 _twoDevices(true), | 137 _twoDevices(true), |
138 _doStop(false), | 138 _doStop(false), |
139 _doStopRec(false), | 139 _doStopRec(false), |
140 _macBookPro(false), | 140 _macBookPro(false), |
141 _macBookProPanRight(false), | 141 _macBookProPanRight(false), |
142 _captureLatencyUs(0), | 142 _captureLatencyUs(0), |
143 _renderLatencyUs(0), | 143 _renderLatencyUs(0), |
144 _captureDelayUs(0), | 144 _captureDelayUs(0), |
145 _renderDelayUs(0), | 145 _renderDelayUs(0), |
146 _renderDelayOffsetSamples(0), | 146 _renderDelayOffsetSamples(0), |
147 _playWarning(0), | |
148 _playError(0), | |
149 _recWarning(0), | |
150 _recError(0), | |
151 _paCaptureBuffer(NULL), | 147 _paCaptureBuffer(NULL), |
152 _paRenderBuffer(NULL), | 148 _paRenderBuffer(NULL), |
153 _captureBufSizeSamples(0), | 149 _captureBufSizeSamples(0), |
154 _renderBufSizeSamples(0), | 150 _renderBufSizeSamples(0), |
155 prev_key_state_(), | 151 prev_key_state_(), |
156 get_mic_volume_counter_ms_(0) { | 152 get_mic_volume_counter_ms_(0) { |
157 LOG(LS_INFO) << __FUNCTION__ << " created"; | 153 LOG(LS_INFO) << __FUNCTION__ << " created"; |
158 | 154 |
159 RTC_DCHECK(&_stopEvent != NULL); | 155 RTC_DCHECK(&_stopEvent != NULL); |
160 RTC_DCHECK(&_stopEventRec != NULL); | 156 RTC_DCHECK(&_stopEventRec != NULL); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 int intErr = sysctlbyname("hw.model", buf, &length, NULL, 0); | 329 int intErr = sysctlbyname("hw.model", buf, &length, NULL, 0); |
334 if (intErr != 0) { | 330 if (intErr != 0) { |
335 LOG(LS_ERROR) << "Error in sysctlbyname(): " << err; | 331 LOG(LS_ERROR) << "Error in sysctlbyname(): " << err; |
336 } else { | 332 } else { |
337 LOG(LS_VERBOSE) << "Hardware model: " << buf; | 333 LOG(LS_VERBOSE) << "Hardware model: " << buf; |
338 if (strncmp(buf, "MacBookPro", 10) == 0) { | 334 if (strncmp(buf, "MacBookPro", 10) == 0) { |
339 _macBookPro = true; | 335 _macBookPro = true; |
340 } | 336 } |
341 } | 337 } |
342 | 338 |
343 _playWarning = 0; | |
344 _playError = 0; | |
345 _recWarning = 0; | |
346 _recError = 0; | |
347 | |
348 get_mic_volume_counter_ms_ = 0; | 339 get_mic_volume_counter_ms_ = 0; |
349 | 340 |
350 _initialized = true; | 341 _initialized = true; |
351 | 342 |
352 return InitStatus::OK; | 343 return InitStatus::OK; |
353 } | 344 } |
354 | 345 |
355 int32_t AudioDeviceMac::Terminate() { | 346 int32_t AudioDeviceMac::Terminate() { |
356 if (!_initialized) { | 347 if (!_initialized) { |
357 return 0; | 348 return 0; |
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1548 int32_t captureDelayUs = AtomicGet32(&_captureDelayUs); | 1539 int32_t captureDelayUs = AtomicGet32(&_captureDelayUs); |
1549 delayMS = | 1540 delayMS = |
1550 static_cast<uint16_t>(1e-3 * (captureDelayUs + _captureLatencyUs) + 0.5); | 1541 static_cast<uint16_t>(1e-3 * (captureDelayUs + _captureLatencyUs) + 0.5); |
1551 return 0; | 1542 return 0; |
1552 } | 1543 } |
1553 | 1544 |
1554 bool AudioDeviceMac::Playing() const { | 1545 bool AudioDeviceMac::Playing() const { |
1555 return (_playing); | 1546 return (_playing); |
1556 } | 1547 } |
1557 | 1548 |
1558 bool AudioDeviceMac::PlayoutWarning() const { | |
1559 return (_playWarning > 0); | |
1560 } | |
1561 | |
1562 bool AudioDeviceMac::PlayoutError() const { | |
1563 return (_playError > 0); | |
1564 } | |
1565 | |
1566 bool AudioDeviceMac::RecordingWarning() const { | |
1567 return (_recWarning > 0); | |
1568 } | |
1569 | |
1570 bool AudioDeviceMac::RecordingError() const { | |
1571 return (_recError > 0); | |
1572 } | |
1573 | |
1574 void AudioDeviceMac::ClearPlayoutWarning() { | |
1575 _playWarning = 0; | |
1576 } | |
1577 | |
1578 void AudioDeviceMac::ClearPlayoutError() { | |
1579 _playError = 0; | |
1580 } | |
1581 | |
1582 void AudioDeviceMac::ClearRecordingWarning() { | |
1583 _recWarning = 0; | |
1584 } | |
1585 | |
1586 void AudioDeviceMac::ClearRecordingError() { | |
1587 _recError = 0; | |
1588 } | |
1589 | |
1590 // ============================================================================ | 1549 // ============================================================================ |
1591 // Private Methods | 1550 // Private Methods |
1592 // ============================================================================ | 1551 // ============================================================================ |
1593 | 1552 |
1594 int32_t AudioDeviceMac::GetNumberDevices(const AudioObjectPropertyScope scope, | 1553 int32_t AudioDeviceMac::GetNumberDevices(const AudioObjectPropertyScope scope, |
1595 AudioDeviceID scopedDeviceIds[], | 1554 AudioDeviceID scopedDeviceIds[], |
1596 const uint32_t deviceListLength) { | 1555 const uint32_t deviceListLength) { |
1597 OSStatus err = noErr; | 1556 OSStatus err = noErr; |
1598 | 1557 |
1599 AudioObjectPropertyAddress propertyAddress = { | 1558 AudioObjectPropertyAddress propertyAddress = { |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1992 kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyScopeInput, 0}; | 1951 kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyScopeInput, 0}; |
1993 UInt32 deviceIsAlive = 1; | 1952 UInt32 deviceIsAlive = 1; |
1994 UInt32 size = sizeof(UInt32); | 1953 UInt32 size = sizeof(UInt32); |
1995 err = AudioObjectGetPropertyData(_inputDeviceID, &propertyAddress, 0, NULL, | 1954 err = AudioObjectGetPropertyData(_inputDeviceID, &propertyAddress, 0, NULL, |
1996 &size, &deviceIsAlive); | 1955 &size, &deviceIsAlive); |
1997 | 1956 |
1998 if (err == kAudioHardwareBadDeviceError || deviceIsAlive == 0) { | 1957 if (err == kAudioHardwareBadDeviceError || deviceIsAlive == 0) { |
1999 LOG(LS_WARNING) << "Capture device is not alive (probably removed)"; | 1958 LOG(LS_WARNING) << "Capture device is not alive (probably removed)"; |
2000 AtomicSet32(&_captureDeviceIsAlive, 0); | 1959 AtomicSet32(&_captureDeviceIsAlive, 0); |
2001 _mixerManager.CloseMicrophone(); | 1960 _mixerManager.CloseMicrophone(); |
2002 if (_recError == 1) { | |
2003 LOG(LS_WARNING) << "pending recording error exists"; | |
2004 } | |
2005 _recError = 1; // triggers callback from module process thread | |
2006 } else if (err != noErr) { | 1961 } else if (err != noErr) { |
2007 logCAMsg(rtc::LS_ERROR, | 1962 logCAMsg(rtc::LS_ERROR, |
2008 "Error in AudioDeviceGetProperty()", (const char*)&err); | 1963 "Error in AudioDeviceGetProperty()", (const char*)&err); |
2009 return -1; | 1964 return -1; |
2010 } | 1965 } |
2011 } | 1966 } |
2012 | 1967 |
2013 if (SpeakerIsInitialized()) { | 1968 if (SpeakerIsInitialized()) { |
2014 AudioObjectPropertyAddress propertyAddress = { | 1969 AudioObjectPropertyAddress propertyAddress = { |
2015 kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyScopeOutput, 0}; | 1970 kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyScopeOutput, 0}; |
2016 UInt32 deviceIsAlive = 1; | 1971 UInt32 deviceIsAlive = 1; |
2017 UInt32 size = sizeof(UInt32); | 1972 UInt32 size = sizeof(UInt32); |
2018 err = AudioObjectGetPropertyData(_outputDeviceID, &propertyAddress, 0, NULL, | 1973 err = AudioObjectGetPropertyData(_outputDeviceID, &propertyAddress, 0, NULL, |
2019 &size, &deviceIsAlive); | 1974 &size, &deviceIsAlive); |
2020 | 1975 |
2021 if (err == kAudioHardwareBadDeviceError || deviceIsAlive == 0) { | 1976 if (err == kAudioHardwareBadDeviceError || deviceIsAlive == 0) { |
2022 LOG(LS_WARNING) << "Render device is not alive (probably removed)"; | 1977 LOG(LS_WARNING) << "Render device is not alive (probably removed)"; |
2023 AtomicSet32(&_renderDeviceIsAlive, 0); | 1978 AtomicSet32(&_renderDeviceIsAlive, 0); |
2024 _mixerManager.CloseSpeaker(); | 1979 _mixerManager.CloseSpeaker(); |
2025 if (_playError == 1) { | |
2026 LOG(LS_WARNING) << "pending playout error exists"; | |
2027 } | |
2028 _playError = 1; // triggers callback from module process thread | |
2029 } else if (err != noErr) { | 1980 } else if (err != noErr) { |
2030 logCAMsg(rtc::LS_ERROR, | 1981 logCAMsg(rtc::LS_ERROR, |
2031 "Error in AudioDeviceGetProperty()", (const char*)&err); | 1982 "Error in AudioDeviceGetProperty()", (const char*)&err); |
2032 return -1; | 1983 return -1; |
2033 } | 1984 } |
2034 } | 1985 } |
2035 | 1986 |
2036 return 0; | 1987 return 0; |
2037 } | 1988 } |
2038 | 1989 |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2602 bool keyState = | 2553 bool keyState = |
2603 CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, key_index); | 2554 CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, key_index); |
2604 // A false -> true change in keymap means a key is pressed. | 2555 // A false -> true change in keymap means a key is pressed. |
2605 key_down |= (keyState && !prev_key_state_[key_index]); | 2556 key_down |= (keyState && !prev_key_state_[key_index]); |
2606 // Save current state. | 2557 // Save current state. |
2607 prev_key_state_[key_index] = keyState; | 2558 prev_key_state_[key_index] = keyState; |
2608 } | 2559 } |
2609 return key_down; | 2560 return key_down; |
2610 } | 2561 } |
2611 } // namespace webrtc | 2562 } // namespace webrtc |
OLD | NEW |