/* * Copyright (c) 2016 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "audio_amplifier" #include <log/log.h> #include <dlfcn.h> #include <stdbool.h> #include <stdlib.h> #include "audio_hw.h" #include "platform.h" struct amplifier_data { struct audio_device* adev; amplifier_device_t* hw; }; struct amplifier_data amp; int amplifier_open(void* adev) { int rc; amplifier_module_t* module; amp.adev = (struct audio_device*)adev; rc = hw_get_module(AMPLIFIER_HARDWARE_MODULE_ID, (const hw_module_t**)&module); if (rc) { ALOGV("%s: Failed to obtain reference to amplifier module: %s\n", __func__, strerror(-rc)); return -ENODEV; } rc = amplifier_device_open((const hw_module_t*)module, &.hw); if (rc) { ALOGV("%s: Failed to open amplifier hardware device: %s\n", __func__, strerror(-rc)); amp.hw = NULL; return -ENODEV; } if (amp.hw->calibrate) { rc = amp.hw->calibrate(amp.hw, amp.adev); if (rc) { ALOGV("%s: Failed to do amplifier hardware calibration %s\n", __func__, strerror(-rc)); } } return 0; } int amplifier_set_input_devices(uint32_t devices) { if (amp.hw && amp.hw->set_input_devices) return amp.hw->set_input_devices(amp.hw, devices); return 0; } int amplifier_set_output_devices(uint32_t devices) { if (amp.hw && amp.hw->set_output_devices) return amp.hw->set_output_devices(amp.hw, devices); return 0; } int amplifier_enable_devices(uint32_t devices, bool enable) { bool is_output = devices < SND_DEVICE_OUT_END; if (amp.hw && amp.hw->enable_output_devices && is_output) return amp.hw->enable_output_devices(amp.hw, devices, enable); if (amp.hw && amp.hw->enable_input_devices && !is_output) return amp.hw->enable_input_devices(amp.hw, devices, enable); return 0; } int amplifier_set_mode(audio_mode_t mode) { if (amp.hw && amp.hw->set_mode) return amp.hw->set_mode(amp.hw, mode); return 0; } int amplifier_output_stream_start(struct audio_stream_out* stream, bool offload) { if (amp.hw && amp.hw->output_stream_start) return amp.hw->output_stream_start(amp.hw, stream, offload); return 0; } int amplifier_input_stream_start(struct audio_stream_in* stream) { if (amp.hw && amp.hw->input_stream_start) return amp.hw->input_stream_start(amp.hw, stream); return 0; } int amplifier_output_stream_standby(struct audio_stream_out* stream) { if (amp.hw && amp.hw->output_stream_standby) return amp.hw->output_stream_standby(amp.hw, stream); return 0; } int amplifier_input_stream_standby(struct audio_stream_in* stream) { if (amp.hw && amp.hw->input_stream_standby) return amp.hw->input_stream_standby(amp.hw, stream); return 0; } int amplifier_set_parameters(struct str_parms* parms) { if (amp.hw && amp.hw->set_parameters) return amp.hw->set_parameters(amp.hw, parms); return 0; } int amplifier_out_set_parameters(struct str_parms* parms) { if (amp.hw && amp.hw->out_set_parameters) return amp.hw->out_set_parameters(amp.hw, parms); return 0; } int amplifier_in_set_parameters(struct str_parms* parms) { if (amp.hw && amp.hw->in_set_parameters) return amp.hw->in_set_parameters(amp.hw, parms); return 0; } int amplifier_set_feedback(void* adev, uint32_t devices, bool enable) { amp.adev = (struct audio_device*)adev; if (amp.hw && amp.hw->set_feedback) return amp.hw->set_feedback(amp.hw, amp.adev, devices, enable); return 0; } int amplifier_close(void) { if (amp.hw) amplifier_device_close(amp.hw); amp.hw = NULL; return 0; }