1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voe_volume_control_impl.h" 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 13471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 14471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h" 15471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/channel.h" 16471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/include/voe_errors.h" 17471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/output_mixer.h" 18471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/transmit_mixer.h" 19471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_impl.h" 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEVolumeControl* VoEVolumeControl::GetInterface(VoiceEngine* voiceEngine) 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_VOLUME_CONTROL_API 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (NULL == voiceEngine) 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 32b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org s->AddRef(); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return s; 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_VOLUME_CONTROL_API 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEVolumeControlImpl::VoEVolumeControlImpl(voe::SharedData* shared) 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org : _shared(shared) 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "VoEVolumeControlImpl::VoEVolumeControlImpl() - ctor"); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEVolumeControlImpl::~VoEVolumeControlImpl() 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "VoEVolumeControlImpl::~VoEVolumeControlImpl() - dtor"); 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::SetSpeakerVolume(unsigned int volume) 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSpeakerVolume(volume=%u)", volume); 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (volume > kMaxVolumeLevel) 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSpeakerVolume() invalid argument"); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 7054f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t maxVol(0); 7154f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t spkrVol(0); 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // scale: [0,kMaxVolumeLevel] -> [0,MaxSpeakerVolume] 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->MaxSpeakerVolume(&maxVol) != 0) 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_MIC_VOL_ERROR, kTraceError, 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSpeakerVolume() failed to get max volume"); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Round the value and avoid floating computation. 8154f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org spkrVol = (uint32_t)((volume * maxVol + 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(kMaxVolumeLevel / 2)) / (kMaxVolumeLevel)); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // set the actual volume using the audio mixer 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->SetSpeakerVolume(spkrVol) != 0) 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_MIC_VOL_ERROR, kTraceError, 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSpeakerVolume() failed to set speaker volume"); 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetSpeakerVolume(unsigned int& volume) 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeakerVolume()"); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 10554f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t spkrVol(0); 10654f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t maxVol(0); 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->SpeakerVolume(&spkrVol) != 0) 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_GET_MIC_VOL_ERROR, kTraceError, 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeakerVolume() unable to get speaker volume"); 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // scale: [0, MaxSpeakerVolume] -> [0, kMaxVolumeLevel] 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->MaxSpeakerVolume(&maxVol) != 0) 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_GET_MIC_VOL_ERROR, kTraceError, 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeakerVolume() unable to get max speaker volume"); 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Round the value and avoid floating computation. 12354f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org volume = (uint32_t) ((spkrVol * kMaxVolumeLevel + 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(maxVol / 2)) / (maxVol)); 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeakerVolume() => volume=%d", volume); 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::SetMicVolume(unsigned int volume) 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetMicVolume(volume=%u)", volume); 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (volume > kMaxVolumeLevel) 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetMicVolume() invalid argument"); 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14954f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t maxVol(0); 15054f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t micVol(0); 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // scale: [0, kMaxVolumeLevel] -> [0,MaxMicrophoneVolume] 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->MaxMicrophoneVolume(&maxVol) != 0) 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_MIC_VOL_ERROR, kTraceError, 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetMicVolume() failed to get max volume"); 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (volume == kMaxVolumeLevel) { 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // On Linux running pulse, users are able to set the volume above 100% 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // through the volume control panel, where the +100% range is digital 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // scaling. WebRTC does not support setting the volume above 100%, and 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // simply ignores changing the volume if the user tries to set it to 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // |kMaxVolumeLevel| while the current volume is higher than |maxVol|. 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->MicrophoneVolume(&micVol) != 0) { 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_GET_MIC_VOL_ERROR, kTraceError, 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetMicVolume() unable to get microphone volume"); 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (micVol >= maxVol) 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Round the value and avoid floating point computation. 17654f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org micVol = (uint32_t) ((volume * maxVol + 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(kMaxVolumeLevel / 2)) / (kMaxVolumeLevel)); 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // set the actual volume using the audio mixer 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->SetMicrophoneVolume(micVol) != 0) 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_MIC_VOL_ERROR, kTraceError, 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetMicVolume() failed to set mic volume"); 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetMicVolume(unsigned int& volume) 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetMicVolume()"); 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20054f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t micVol(0); 20154f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint32_t maxVol(0); 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->MicrophoneVolume(&micVol) != 0) 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_GET_MIC_VOL_ERROR, kTraceError, 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetMicVolume() unable to get microphone volume"); 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // scale: [0, MaxMicrophoneVolume] -> [0, kMaxVolumeLevel] 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_shared->audio_device()->MaxMicrophoneVolume(&maxVol) != 0) 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_GET_MIC_VOL_ERROR, kTraceError, 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetMicVolume() unable to get max microphone volume"); 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (micVol < maxVol) { 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Round the value and avoid floating point calculation. 21954f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org volume = (uint32_t) ((micVol * kMaxVolumeLevel + 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(maxVol / 2)) / (maxVol)); 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else { 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Truncate the value to the kMaxVolumeLevel. 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org volume = kMaxVolumeLevel; 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetMicVolume() => volume=%d", volume); 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::SetInputMute(int channel, bool enable) 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetInputMute(channel=%d, enable=%d)", channel, enable); 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel == -1) 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Mute before demultiplexing <=> affects all channels 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _shared->transmit_mixer()->SetMute(enable); 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 2478d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org // Mute after demultiplexing <=> affects one channel only 2488d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 2498d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 2508d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org if (channelPtr == NULL) 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 2528d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 2538d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org "SetInputMute() failed to locate channel"); 2548d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org return -1; 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 2568d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org return channelPtr->SetMute(enable); 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetInputMute(int channel, bool& enabled) 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetInputMute(channel=%d)", channel); 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel == -1) 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enabled = _shared->transmit_mixer()->Mute(); 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 275b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 276b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetInputMute() failed to locate channel"); 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enabled = channelPtr->Mute(); 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetInputMute() => enabled = %d", (int)enabled); 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetSpeechInputLevel(unsigned int& level) 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechInputLevel()"); 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 30154f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org int8_t currentLevel = _shared->transmit_mixer()->AudioLevel(); 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org level = static_cast<unsigned int> (currentLevel); 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechInputLevel() => %d", level); 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetSpeechOutputLevel(int channel, 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int& level) 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechOutputLevel(channel=%d, level=?)", channel); 3147b2651a88b210ea01c9c3166c080b025d59094fchenrika@webrtc.org 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel == -1) 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _shared->output_mixer()->GetSpeechOutputLevel( 32354f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org (uint32_t&)level); 324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 327b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 328b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechOutputLevel() failed to locate channel"); 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 33554f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org channelPtr->GetSpeechOutputLevel((uint32_t&)level); 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetSpeechInputLevelFullRange(unsigned int& level) 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechInputLevelFullRange(level=?)"); 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 35054f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org int16_t currentLevel = _shared->transmit_mixer()-> 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioLevelFullRange(); 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org level = static_cast<unsigned int> (currentLevel); 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechInputLevelFullRange() => %d", level); 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetSpeechOutputLevelFullRange(int channel, 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int& level) 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechOutputLevelFullRange(channel=%d, level=?)", channel); 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel == -1) 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _shared->output_mixer()->GetSpeechOutputLevelFullRange( 37354f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org (uint32_t&)level); 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 377b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 378b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSpeechOutputLevelFullRange() failed to locate channel"); 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 38554f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org channelPtr->GetSpeechOutputLevelFullRange((uint32_t&)level); 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::SetChannelOutputVolumeScaling(int channel, 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float scaling) 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetChannelOutputVolumeScaling(channel=%d, scaling=%3.2f)", 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel, scaling); 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (scaling < kMinOutputVolumeScaling || 402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org scaling > kMaxOutputVolumeScaling) 403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetChannelOutputVolumeScaling() invalid parameter"); 406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 408b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 409b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetChannelOutputVolumeScaling() failed to locate channel"); 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return channelPtr->SetChannelOutputVolumeScaling(scaling); 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetChannelOutputVolumeScaling(int channel, 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float& scaling) 421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetChannelOutputVolumeScaling(channel=%d, scaling=?)", channel); 424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 429b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 430b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetChannelOutputVolumeScaling() failed to locate channel"); 435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return channelPtr->GetChannelOutputVolumeScaling(scaling); 438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::SetOutputVolumePan(int channel, 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float left, 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float right) 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetOutputVolumePan(channel=%d, left=%2.1f, right=%2.1f)", 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel, left, right); 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool available(false); 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->audio_device()->StereoPlayoutIsAvailable(&available); 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!available) 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_FUNC_NO_STEREO, kTraceError, 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetOutputVolumePan() stereo playout not supported"); 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ((left < kMinOutputVolumePanning) || 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (left > kMaxOutputVolumePanning) || 464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (right < kMinOutputVolumePanning) || 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (right > kMaxOutputVolumePanning)) 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetOutputVolumePan() invalid parameter"); 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel == -1) 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Master balance (affectes the signal after output mixing) 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _shared->output_mixer()->SetOutputVolumePan(left, right); 476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 4778d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org // Per-channel balance (affects the signal before output mixing) 4788d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 4798d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 4808d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org if (channelPtr == NULL) 481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 4828d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 4838d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org "SetOutputVolumePan() failed to locate channel"); 4848d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org return -1; 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 4868d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org return channelPtr->SetOutputVolumePan(left, right); 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEVolumeControlImpl::GetOutputVolumePan(int channel, 490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float& left, 491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float& right) 492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetOutputVolumePan(channel=%d, left=?, right=?)", channel); 495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool available(false); 503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->audio_device()->StereoPlayoutIsAvailable(&available); 504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!available) 505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_FUNC_NO_STEREO, kTraceError, 507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetOutputVolumePan() stereo playout not supported"); 508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel == -1) 512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _shared->output_mixer()->GetOutputVolumePan(left, right); 514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 5158d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 5168d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 5178d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org if (channelPtr == NULL) 518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 5198d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 5208d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org "GetOutputVolumePan() failed to locate channel"); 5218d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org return -1; 522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 5238d49b3fdb83f160391df99adb4e98a00ff6fb07bpbos@webrtc.org return channelPtr->GetOutputVolumePan(left, right); 524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // #ifdef WEBRTC_VOICE_ENGINE_VOLUME_CONTROL_API 527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 529