PrimaryDevice.cpp revision 04364edefcc39a5f620156a35209b760eb66a916
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" 2010548295023bee99108e418499aff09fe578211eMikhail Naganov 2110548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace android { 2210548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace hardware { 2310548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace audio { 2410548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace V2_0 { 2510548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace implementation { 2610548295023bee99108e418499aff09fe578211eMikhail Naganov 2710548295023bee99108e418499aff09fe578211eMikhail NaganovPrimaryDevice::PrimaryDevice(audio_hw_device_t* device) 286c0f76a684bc58eb10181f71d9f45c5799ca7c6aMikhail Naganov : mDevice{new Device(device, AUDIO_HARDWARE_MODULE_ID_PRIMARY)} {} 2910548295023bee99108e418499aff09fe578211eMikhail Naganov 3010548295023bee99108e418499aff09fe578211eMikhail NaganovPrimaryDevice::~PrimaryDevice() {} 3110548295023bee99108e418499aff09fe578211eMikhail Naganov 3210548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IDevice follow. 3372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::initCheck() { 3410548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->initCheck(); 3510548295023bee99108e418499aff09fe578211eMikhail Naganov} 3610548295023bee99108e418499aff09fe578211eMikhail Naganov 3772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMasterVolume(float volume) { 3810548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setMasterVolume(volume); 3910548295023bee99108e418499aff09fe578211eMikhail Naganov} 4010548295023bee99108e418499aff09fe578211eMikhail Naganov 4172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getMasterVolume(getMasterVolume_cb _hidl_cb) { 4210548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getMasterVolume(_hidl_cb); 4310548295023bee99108e418499aff09fe578211eMikhail Naganov} 4410548295023bee99108e418499aff09fe578211eMikhail Naganov 4572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMicMute(bool mute) { 4610548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setMicMute(mute); 4710548295023bee99108e418499aff09fe578211eMikhail Naganov} 4810548295023bee99108e418499aff09fe578211eMikhail Naganov 4972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getMicMute(getMicMute_cb _hidl_cb) { 5010548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getMicMute(_hidl_cb); 5110548295023bee99108e418499aff09fe578211eMikhail Naganov} 5210548295023bee99108e418499aff09fe578211eMikhail Naganov 5372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMasterMute(bool mute) { 5410548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setMasterMute(mute); 5510548295023bee99108e418499aff09fe578211eMikhail Naganov} 5610548295023bee99108e418499aff09fe578211eMikhail Naganov 5772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getMasterMute(getMasterMute_cb _hidl_cb) { 5810548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getMasterMute(_hidl_cb); 5910548295023bee99108e418499aff09fe578211eMikhail Naganov} 6010548295023bee99108e418499aff09fe578211eMikhail Naganov 6172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getInputBufferSize(const AudioConfig& config, 6272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getInputBufferSize_cb _hidl_cb) { 6310548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getInputBufferSize(config, _hidl_cb); 6410548295023bee99108e418499aff09fe578211eMikhail Naganov} 6510548295023bee99108e418499aff09fe578211eMikhail Naganov 6672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::openOutputStream(int32_t ioHandle, 6772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const DeviceAddress& device, 6872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const AudioConfig& config, 6972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard AudioOutputFlag flags, 7072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard openOutputStream_cb _hidl_cb) { 7110548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->openOutputStream(ioHandle, device, config, flags, _hidl_cb); 7210548295023bee99108e418499aff09fe578211eMikhail Naganov} 7310548295023bee99108e418499aff09fe578211eMikhail Naganov 7410548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> PrimaryDevice::openInputStream( 7572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard int32_t ioHandle, const DeviceAddress& device, const AudioConfig& config, 7672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard AudioInputFlag flags, AudioSource source, openInputStream_cb _hidl_cb) { 7772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard return mDevice->openInputStream(ioHandle, device, config, flags, source, 7872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard _hidl_cb); 7910548295023bee99108e418499aff09fe578211eMikhail Naganov} 8010548295023bee99108e418499aff09fe578211eMikhail Naganov 816e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail NaganovReturn<bool> PrimaryDevice::supportsAudioPatches() { 826e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov return mDevice->supportsAudioPatches(); 836e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov} 846e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov 8510548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> PrimaryDevice::createAudioPatch( 8672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const hidl_vec<AudioPortConfig>& sources, 8772e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const hidl_vec<AudioPortConfig>& sinks, createAudioPatch_cb _hidl_cb) { 8810548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->createAudioPatch(sources, sinks, _hidl_cb); 8910548295023bee99108e418499aff09fe578211eMikhail Naganov} 9010548295023bee99108e418499aff09fe578211eMikhail Naganov 9172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::releaseAudioPatch(int32_t patch) { 9210548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->releaseAudioPatch(patch); 9310548295023bee99108e418499aff09fe578211eMikhail Naganov} 9410548295023bee99108e418499aff09fe578211eMikhail Naganov 9572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getAudioPort(const AudioPort& port, 9672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getAudioPort_cb _hidl_cb) { 9710548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getAudioPort(port, _hidl_cb); 9810548295023bee99108e418499aff09fe578211eMikhail Naganov} 9910548295023bee99108e418499aff09fe578211eMikhail Naganov 10072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setAudioPortConfig( 10172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const AudioPortConfig& config) { 10210548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setAudioPortConfig(config); 10310548295023bee99108e418499aff09fe578211eMikhail Naganov} 10410548295023bee99108e418499aff09fe578211eMikhail Naganov 10572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<AudioHwSync> PrimaryDevice::getHwAvSync() { 10610548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getHwAvSync(); 10710548295023bee99108e418499aff09fe578211eMikhail Naganov} 10810548295023bee99108e418499aff09fe578211eMikhail Naganov 10972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setScreenState(bool turnedOn) { 11010548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setScreenState(turnedOn); 11110548295023bee99108e418499aff09fe578211eMikhail Naganov} 11210548295023bee99108e418499aff09fe578211eMikhail Naganov 11372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getParameters(const hidl_vec<hidl_string>& keys, 11472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getParameters_cb _hidl_cb) { 11510548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->getParameters(keys, _hidl_cb); 11610548295023bee99108e418499aff09fe578211eMikhail Naganov} 11710548295023bee99108e418499aff09fe578211eMikhail Naganov 11872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setParameters( 11972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard const hidl_vec<ParameterValue>& parameters) { 12010548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParameters(parameters); 12110548295023bee99108e418499aff09fe578211eMikhail Naganov} 12210548295023bee99108e418499aff09fe578211eMikhail Naganov 12372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::debugDump(const hidl_handle& fd) { 12410548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->debugDump(fd); 12510548295023bee99108e418499aff09fe578211eMikhail Naganov} 12610548295023bee99108e418499aff09fe578211eMikhail Naganov 12710548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IPrimaryDevice follow. 12872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setVoiceVolume(float volume) { 12910548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->analyzeStatus( 13072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard "set_voice_volume", 13172e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard mDevice->device()->set_voice_volume(mDevice->device(), volume)); 13210548295023bee99108e418499aff09fe578211eMikhail Naganov} 13310548295023bee99108e418499aff09fe578211eMikhail Naganov 13472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setMode(AudioMode mode) { 13504364edefcc39a5f620156a35209b760eb66a916Kevin Rocard // INVALID, CURRENT, CNT, MAX are reserved for internal use. 13604364edefcc39a5f620156a35209b760eb66a916Kevin Rocard // TODO: remove the values from the HIDL interface 13704364edefcc39a5f620156a35209b760eb66a916Kevin Rocard switch (mode) { 13804364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::NORMAL: 13904364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::RINGTONE: 14004364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::IN_CALL: 14104364edefcc39a5f620156a35209b760eb66a916Kevin Rocard case AudioMode::IN_COMMUNICATION: 14204364edefcc39a5f620156a35209b760eb66a916Kevin Rocard break; // Valid values 14304364edefcc39a5f620156a35209b760eb66a916Kevin Rocard default: 14404364edefcc39a5f620156a35209b760eb66a916Kevin Rocard return Result::INVALID_ARGUMENTS; 14504364edefcc39a5f620156a35209b760eb66a916Kevin Rocard }; 14604364edefcc39a5f620156a35209b760eb66a916Kevin Rocard 14710548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->analyzeStatus( 14872e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard "set_mode", mDevice->device()->set_mode( 14972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard mDevice->device(), static_cast<audio_mode_t>(mode))); 15010548295023bee99108e418499aff09fe578211eMikhail Naganov} 15110548295023bee99108e418499aff09fe578211eMikhail Naganov 15272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getBtScoNrecEnabled( 15372e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getBtScoNrecEnabled_cb _hidl_cb) { 15410548295023bee99108e418499aff09fe578211eMikhail Naganov bool enabled; 15510548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AudioParameter::keyBtNrec, &enabled); 15610548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, enabled); 15710548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 15810548295023bee99108e418499aff09fe578211eMikhail Naganov} 15910548295023bee99108e418499aff09fe578211eMikhail Naganov 16072e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setBtScoNrecEnabled(bool enabled) { 16110548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParam(AudioParameter::keyBtNrec, enabled); 16210548295023bee99108e418499aff09fe578211eMikhail Naganov} 16310548295023bee99108e418499aff09fe578211eMikhail Naganov 16472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getBtScoWidebandEnabled( 16572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard getBtScoWidebandEnabled_cb _hidl_cb) { 16610548295023bee99108e418499aff09fe578211eMikhail Naganov bool enabled; 16710548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_BT_SCO_WB, &enabled); 16810548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, enabled); 16910548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 17010548295023bee99108e418499aff09fe578211eMikhail Naganov} 17110548295023bee99108e418499aff09fe578211eMikhail Naganov 17272e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setBtScoWidebandEnabled(bool enabled) { 17310548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParam(AUDIO_PARAMETER_KEY_BT_SCO_WB, enabled); 17410548295023bee99108e418499aff09fe578211eMikhail Naganov} 17510548295023bee99108e418499aff09fe578211eMikhail Naganov 17672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) { 17710548295023bee99108e418499aff09fe578211eMikhail Naganov int halMode; 17810548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_TTY_MODE, &halMode); 17910548295023bee99108e418499aff09fe578211eMikhail Naganov TtyMode mode = retval == Result::OK ? TtyMode(halMode) : TtyMode::OFF; 18010548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, mode); 18110548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 18210548295023bee99108e418499aff09fe578211eMikhail Naganov} 18310548295023bee99108e418499aff09fe578211eMikhail Naganov 18472e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setTtyMode(IPrimaryDevice::TtyMode mode) { 18572e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard return mDevice->setParam(AUDIO_PARAMETER_KEY_TTY_MODE, 18672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin Rocard static_cast<int>(mode)); 18710548295023bee99108e418499aff09fe578211eMikhail Naganov} 18810548295023bee99108e418499aff09fe578211eMikhail Naganov 18972e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<void> PrimaryDevice::getHacEnabled(getHacEnabled_cb _hidl_cb) { 19010548295023bee99108e418499aff09fe578211eMikhail Naganov bool enabled; 19110548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_HAC, &enabled); 19210548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, enabled); 19310548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 19410548295023bee99108e418499aff09fe578211eMikhail Naganov} 19510548295023bee99108e418499aff09fe578211eMikhail Naganov 19672e50e2ef1480fc3d90f0d88c7e9e3595622e75cKevin RocardReturn<Result> PrimaryDevice::setHacEnabled(bool enabled) { 19710548295023bee99108e418499aff09fe578211eMikhail Naganov return mDevice->setParam(AUDIO_PARAMETER_KEY_HAC, enabled); 19810548295023bee99108e418499aff09fe578211eMikhail Naganov} 19910548295023bee99108e418499aff09fe578211eMikhail Naganov 20010548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace implementation 20110548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace V2_0 20210548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace audio 20310548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace hardware 20410548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace android 205