PrimaryDevice.cpp revision a1d6ea4ba76c96cd613ee81eb204bc3041a219f7
110548295023bee99108e418499aff09fe578211eMikhail Naganov/* 210548295023bee99108e418499aff09fe578211eMikhail Naganov * Copyright (C) 2016 The Android Open Source Project 310548295023bee99108e418499aff09fe578211eMikhail Naganov * 410548295023bee99108e418499aff09fe578211eMikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 510548295023bee99108e418499aff09fe578211eMikhail Naganov * you may not use this file except in compliance with the License. 610548295023bee99108e418499aff09fe578211eMikhail Naganov * You may obtain a copy of the License at 710548295023bee99108e418499aff09fe578211eMikhail Naganov * 810548295023bee99108e418499aff09fe578211eMikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 910548295023bee99108e418499aff09fe578211eMikhail Naganov * 1010548295023bee99108e418499aff09fe578211eMikhail Naganov * Unless required by applicable law or agreed to in writing, software 1110548295023bee99108e418499aff09fe578211eMikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 1210548295023bee99108e418499aff09fe578211eMikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1310548295023bee99108e418499aff09fe578211eMikhail Naganov * See the License for the specific language governing permissions and 1410548295023bee99108e418499aff09fe578211eMikhail Naganov * limitations under the License. 1510548295023bee99108e418499aff09fe578211eMikhail Naganov */ 1610548295023bee99108e418499aff09fe578211eMikhail Naganov 1710548295023bee99108e418499aff09fe578211eMikhail Naganov#define LOG_TAG "PrimaryDeviceHAL" 1810548295023bee99108e418499aff09fe578211eMikhail Naganov 1910548295023bee99108e418499aff09fe578211eMikhail Naganov#include "PrimaryDevice.h" 20a1d6ea4ba76c96cd613ee81eb204bc3041a219f7Kevin Rocard#include "Util.h" 2110548295023bee99108e418499aff09fe578211eMikhail Naganov 2210548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace android { 2310548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace hardware { 2410548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace audio { 2510548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace V2_0 { 2610548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace implementation { 2710548295023bee99108e418499aff09fe578211eMikhail Naganov 2810548295023bee99108e418499aff09fe578211eMikhail NaganovPrimaryDevice::PrimaryDevice(audio_hw_device_t* device) 296c0f76a684bc58eb10181f71d9f45c5799ca7c6aMikhail Naganov : mDevice{new Device(device, AUDIO_HARDWARE_MODULE_ID_PRIMARY)} {} 3010548295023bee99108e418499aff09fe578211eMikhail Naganov 3110548295023bee99108e418499aff09fe578211eMikhail NaganovPrimaryDevice::~PrimaryDevice() {} 3210548295023bee99108e418499aff09fe578211eMikhail Naganov 3310548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IDevice follow. 3472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::initCheck() { 3510548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->initCheck(); 3610548295023bee99108e418499aff09fe578211eMikhail Naganov} 3710548295023bee99108e418499aff09fe578211eMikhail Naganov 3872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMasterVolume(float volume) { 3910548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setMasterVolume(volume); 4010548295023bee99108e418499aff09fe578211eMikhail Naganov} 4110548295023bee99108e418499aff09fe578211eMikhail Naganov 4272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getMasterVolume(getMasterVolume_cb _hidl_cb) { 4310548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getMasterVolume(_hidl_cb); 4410548295023bee99108e418499aff09fe578211eMikhail Naganov} 4510548295023bee99108e418499aff09fe578211eMikhail Naganov 4672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMicMute(bool mute) { 4710548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setMicMute(mute); 4810548295023bee99108e418499aff09fe578211eMikhail Naganov} 4910548295023bee99108e418499aff09fe578211eMikhail Naganov 5072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getMicMute(getMicMute_cb _hidl_cb) { 5110548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getMicMute(_hidl_cb); 5210548295023bee99108e418499aff09fe578211eMikhail Naganov} 5310548295023bee99108e418499aff09fe578211eMikhail Naganov 5472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMasterMute(bool mute) { 5510548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setMasterMute(mute); 5610548295023bee99108e418499aff09fe578211eMikhail Naganov} 5710548295023bee99108e418499aff09fe578211eMikhail Naganov 5872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getMasterMute(getMasterMute_cb _hidl_cb) { 5910548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getMasterMute(_hidl_cb); 6010548295023bee99108e418499aff09fe578211eMikhail Naganov} 6110548295023bee99108e418499aff09fe578211eMikhail Naganov 6272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getInputBufferSize(const AudioConfig& config, 6372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getInputBufferSize_cb _hidl_cb) { 6410548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getInputBufferSize(config, _hidl_cb); 6510548295023bee99108e418499aff09fe578211eMikhail Naganov} 6610548295023bee99108e418499aff09fe578211eMikhail Naganov 6772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::openOutputStream(int32_t ioHandle, 6872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const DeviceAddress& device, 6972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const AudioConfig& config, 7072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard AudioOutputFlag flags, 7172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard openOutputStream_cb _hidl_cb) { 7210548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->openOutputStream(ioHandle, device, config, flags, _hidl_cb); 7310548295023bee99108e418499aff09fe578211eMikhail Naganov} 7410548295023bee99108e418499aff09fe578211eMikhail Naganov 7510548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> PrimaryDevice::openInputStream( 7672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard int32_t ioHandle, const DeviceAddress& device, const AudioConfig& config, 7772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard AudioInputFlag flags, AudioSource source, openInputStream_cb _hidl_cb) { 7872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard return mDevice->openInputStream(ioHandle, device, config, flags, source, 7972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard _hidl_cb); 8010548295023bee99108e418499aff09fe578211eMikhail Naganov} 8110548295023bee99108e418499aff09fe578211eMikhail Naganov 826e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail NaganovReturn<bool> PrimaryDevice::supportsAudioPatches() { 836e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov return mDevice->supportsAudioPatches(); 846e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov} 856e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov 8610548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> PrimaryDevice::createAudioPatch( 8772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const hidl_vec<AudioPortConfig>& sources, 8872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const hidl_vec<AudioPortConfig>& sinks, createAudioPatch_cb _hidl_cb) { 8910548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->createAudioPatch(sources, sinks, _hidl_cb); 9010548295023bee99108e418499aff09fe578211eMikhail Naganov} 9110548295023bee99108e418499aff09fe578211eMikhail Naganov 9272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::releaseAudioPatch(int32_t patch) { 9310548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->releaseAudioPatch(patch); 9410548295023bee99108e418499aff09fe578211eMikhail Naganov} 9510548295023bee99108e418499aff09fe578211eMikhail Naganov 9672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getAudioPort(const AudioPort& port, 9772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getAudioPort_cb _hidl_cb) { 9810548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getAudioPort(port, _hidl_cb); 9910548295023bee99108e418499aff09fe578211eMikhail Naganov} 10010548295023bee99108e418499aff09fe578211eMikhail Naganov 10172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setAudioPortConfig( 10272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const AudioPortConfig& config) { 10310548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setAudioPortConfig(config); 10410548295023bee99108e418499aff09fe578211eMikhail Naganov} 10510548295023bee99108e418499aff09fe578211eMikhail Naganov 10672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<AudioHwSync> PrimaryDevice::getHwAvSync() { 10710548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getHwAvSync(); 10810548295023bee99108e418499aff09fe578211eMikhail Naganov} 10910548295023bee99108e418499aff09fe578211eMikhail Naganov 11072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setScreenState(bool turnedOn) { 11110548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setScreenState(turnedOn); 11210548295023bee99108e418499aff09fe578211eMikhail Naganov} 11310548295023bee99108e418499aff09fe578211eMikhail Naganov 11472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getParameters(const hidl_vec<hidl_string>& keys, 11572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getParameters_cb _hidl_cb) { 11610548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getParameters(keys, _hidl_cb); 11710548295023bee99108e418499aff09fe578211eMikhail Naganov} 11810548295023bee99108e418499aff09fe578211eMikhail Naganov 11972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setParameters( 12072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const hidl_vec<ParameterValue>& parameters) { 12110548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParameters(parameters); 12210548295023bee99108e418499aff09fe578211eMikhail Naganov} 12310548295023bee99108e418499aff09fe578211eMikhail Naganov 12472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::debugDump(const hidl_handle& fd) { 12510548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->debugDump(fd); 12610548295023bee99108e418499aff09fe578211eMikhail Naganov} 12710548295023bee99108e418499aff09fe578211eMikhail Naganov 12810548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IPrimaryDevice follow. 12972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setVoiceVolume(float volume) { 130a1d6ea4ba76c96cd613ee81eb204bc3041a219f7Kevin Rocard if (!isGainNormalized(volume)) { 131a1d6ea4ba76c96cd613ee81eb204bc3041a219f7Kevin Rocard ALOGW("Can not set a voice volume (%f) outside [0,1]", volume); 132a1d6ea4ba76c96cd613ee81eb204bc3041a219f7Kevin Rocard return Result::INVALID_ARGUMENTS; 133a1d6ea4ba76c96cd613ee81eb204bc3041a219f7Kevin Rocard } 13410548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->analyzeStatus( 13572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard "set_voice_volume", 13672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard mDevice->device()->set_voice_volume(mDevice->device(), volume)); 13710548295023bee99108e418499aff09fe578211eMikhail Naganov} 13810548295023bee99108e418499aff09fe578211eMikhail Naganov 13972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMode(AudioMode mode) { 14004364edefcc39a5f620156a35209b760eb66a916Kevin Rocard // INVALID, CURRENT, CNT, MAX are reserved for internal use. 14104364edefcc39a5f620156a35209b760eb66a916Kevin Rocard // TODO: remove the values from the HIDL interface 14204364edefcc39a5f620156a35209b760eb66a916Kevin Rocard switch (mode) { 14304364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::NORMAL: 14404364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::RINGTONE: 14504364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::IN_CALL: 14604364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::IN_COMMUNICATION: 14704364edefcc39a5f620156a35209b760eb66a916Kevin Rocard break; // Valid values 14804364edefcc39a5f620156a35209b760eb66a916Kevin Rocard default: 14904364edefcc39a5f620156a35209b760eb66a916Kevin Rocard return Result::INVALID_ARGUMENTS; 15004364edefcc39a5f620156a35209b760eb66a916Kevin Rocard }; 15104364edefcc39a5f620156a35209b760eb66a916Kevin Rocard 15210548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->analyzeStatus( 15372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard "set_mode", mDevice->device()->set_mode( 15472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard mDevice->device(), static_cast<audio_mode_t>(mode))); 15510548295023bee99108e418499aff09fe578211eMikhail Naganov} 15610548295023bee99108e418499aff09fe578211eMikhail Naganov 15772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getBtScoNrecEnabled( 15872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getBtScoNrecEnabled_cb _hidl_cb) { 15910548295023bee99108e418499aff09fe578211eMikhail Naganov bool enabled; 16010548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AudioParameter::keyBtNrec, &enabled); 16110548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, enabled); 16210548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 16310548295023bee99108e418499aff09fe578211eMikhail Naganov} 16410548295023bee99108e418499aff09fe578211eMikhail Naganov 16572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setBtScoNrecEnabled(bool enabled) { 16610548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParam(AudioParameter::keyBtNrec, enabled); 16710548295023bee99108e418499aff09fe578211eMikhail Naganov} 16810548295023bee99108e418499aff09fe578211eMikhail Naganov 16972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getBtScoWidebandEnabled( 17072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getBtScoWidebandEnabled_cb _hidl_cb) { 17110548295023bee99108e418499aff09fe578211eMikhail Naganov bool enabled; 17210548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_BT_SCO_WB, &enabled); 17310548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, enabled); 17410548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 17510548295023bee99108e418499aff09fe578211eMikhail Naganov} 17610548295023bee99108e418499aff09fe578211eMikhail Naganov 17772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setBtScoWidebandEnabled(bool enabled) { 17810548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParam(AUDIO_PARAMETER_KEY_BT_SCO_WB, enabled); 17910548295023bee99108e418499aff09fe578211eMikhail Naganov} 18010548295023bee99108e418499aff09fe578211eMikhail Naganov 18172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) { 18210548295023bee99108e418499aff09fe578211eMikhail Naganov int halMode; 18310548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_TTY_MODE, &halMode); 18410548295023bee99108e418499aff09fe578211eMikhail Naganov TtyMode mode = retval == Result::OK ? TtyMode(halMode) : TtyMode::OFF; 18510548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, mode); 18610548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 18710548295023bee99108e418499aff09fe578211eMikhail Naganov} 18810548295023bee99108e418499aff09fe578211eMikhail Naganov 18972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setTtyMode(IPrimaryDevice::TtyMode mode) { 19072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard return mDevice->setParam(AUDIO_PARAMETER_KEY_TTY_MODE, 19172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard static_cast<int>(mode)); 19210548295023bee99108e418499aff09fe578211eMikhail Naganov} 19310548295023bee99108e418499aff09fe578211eMikhail Naganov 19472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getHacEnabled(getHacEnabled_cb _hidl_cb) { 19510548295023bee99108e418499aff09fe578211eMikhail Naganov bool enabled; 19610548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_HAC, &enabled); 19710548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, enabled); 19810548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 19910548295023bee99108e418499aff09fe578211eMikhail Naganov} 20010548295023bee99108e418499aff09fe578211eMikhail Naganov 20172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setHacEnabled(bool enabled) { 20210548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParam(AUDIO_PARAMETER_KEY_HAC, enabled); 20310548295023bee99108e418499aff09fe578211eMikhail Naganov} 20410548295023bee99108e418499aff09fe578211eMikhail Naganov 20510548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace implementation 20610548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace V2_0 20710548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace audio 20810548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace hardware 20910548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace android 210