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