14211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin/* 24211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * Copyright (C) 2015 The Android Open Source Project 34211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * 44211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * Licensed under the Apache License, Version 2.0 (the "License"); 54211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * you may not use this file except in compliance with the License. 64211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * You may obtain a copy of the License at 74211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * 84211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * http://www.apache.org/licenses/LICENSE-2.0 94211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * 104211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * Unless required by applicable law or agreed to in writing, software 114211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * distributed under the License is distributed on an "AS IS" BASIS, 124211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * See the License for the specific language governing permissions and 144211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin * limitations under the License. 154211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin */ 164211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 174211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#define LOG_TAG "audio_hw_dsm_feedback" 184211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin/*#define LOG_NDEBUG 0*/ 194211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#define LOG_NDDEBUG 0 204211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 214211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include <errno.h> 224211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include <math.h> 234211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include <cutils/log.h> 244211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 254211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include "audio_hw.h" 264211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include "platform.h" 274211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include "platform_api.h" 284211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin#include <stdlib.h> 294211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 304211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 314211fad32ff21574a3935dbe28397c55a1895649zhaoyang yinstatic struct pcm_config pcm_config_dsm = { 324211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .channels = 2, 334211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .rate = 48000, 344211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .period_size = 256, 354211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .period_count = 4, 364211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .format = PCM_FORMAT_S16_LE, 374211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .start_threshold = 0, 384211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .stop_threshold = INT_MAX, 394211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin .avail_min = 0, 404211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin}; 414211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 424211fad32ff21574a3935dbe28397c55a1895649zhaoyang yinint start_dsm_feedback_processing(struct audio_device *adev, int enable) 434211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin{ 444211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin int ret = 0; 454211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin int32_t pcm_dev_tx_id = -1; 464211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin static struct pcm *dsm_pcm_handle = NULL; 474211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 484211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if (enable) { 494211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin /*do nothing if already enabled*/ 504211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if (dsm_pcm_handle) 514211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin return ret; 524211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 534211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin pcm_dev_tx_id = platform_get_pcm_device_id(USECASE_AUDIO_DSM_FEEDBACK, PCM_CAPTURE); 544211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if (pcm_dev_tx_id < 0) { 554211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin ALOGE("%s: Invalid pcm device for usecase (%d)", 564211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin __func__, USECASE_AUDIO_DSM_FEEDBACK); 574211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin ret = -ENODEV; 584211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin goto close; 594211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin } 604211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 614211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin dsm_pcm_handle = pcm_open(adev->snd_card, 624211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin pcm_dev_tx_id, 634211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin PCM_IN, &pcm_config_dsm); 644211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if (dsm_pcm_handle && !pcm_is_ready(dsm_pcm_handle)) { 654211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin ALOGE("%s: %s", __func__, pcm_get_error(dsm_pcm_handle)); 664211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin ret = -EIO; 674211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin goto close; 684211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin } 694211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 704211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if (pcm_start(dsm_pcm_handle) < 0) { 714211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin ALOGE("%s: pcm start for RX failed", __func__); 724211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin ret = -EINVAL; 734211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin goto close; 744211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin } 754211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 764211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin return ret; 774211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin } 784211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 794211fad32ff21574a3935dbe28397c55a1895649zhaoyang yinclose: 804211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin /*close pcm if disable or error happend in opening*/ 814211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if (dsm_pcm_handle) { 824211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin pcm_close(dsm_pcm_handle); 834211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin dsm_pcm_handle = NULL; 844211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin } 854211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 864211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin return ret; 874211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin} 884211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 894211fad32ff21574a3935dbe28397c55a1895649zhaoyang yinvoid audio_extn_dsm_feedback_enable(struct audio_device *adev, 904211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin snd_device_t snd_device, 914211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin int benable) 924211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin{ 934211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if ( NULL == adev ) 944211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin return; 954211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin 964211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin if( snd_device == SND_DEVICE_OUT_SPEAKER || 974211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE || 983b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda snd_device == SND_DEVICE_OUT_VOICE_SPEAKER || 994211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin snd_device == SND_DEVICE_OUT_SPEAKER_SAFE || 1004211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES || 1013b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda snd_device == SND_DEVICE_OUT_SPEAKER_AND_LINE || 1023b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES || 1033b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE ) 1044211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin start_dsm_feedback_processing(adev, benable); 1054211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin} 106