You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
3.8 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved.
* Description: audio hal primary input source file.
* Author: Hisilicon
* Create: 2020-05-11
* Notes: NA
* History: 2020-05-11 yinyingcai for CodingStyle
*/
#define LOG_TAG "audio_hal_hpi"
#define LOG_NDEBUG 0
#include "hpi.h"
#include <log/log.h>
#include <cutils/properties.h>
#include <securec.h>
#include "vnaudio_dbg.h"
#define AI_CARD_ID 0
#define AI_DEVICE_ID 0
int hpi_create(struct hpi_data **pphpi)
{
int ret;
struct hpi_data* hpi = (struct hpi_data *)malloc(sizeof(struct hpi_data));
if (hpi == NULL) {
ALOGE("%s: malloc failed", __func__);
return -ENOMEM;
}
ret = memset_s(hpi, sizeof(struct hpi_data), 0, sizeof(struct hpi_data));
if (ret != 0) {
ALOGE("memset_s hpi failed(0x%x)", ret);
}
hpi->in_card = AI_CARD_ID;
hpi->in_device = AI_DEVICE_ID;
hpi->fd = NULL;
*pphpi = hpi;
return 0;
}
int hpi_open(struct hpi_data *hpi)
{
int ret;
char value[PROPERTY_VALUE_MAX];
ALOGD("pcm_open card:device(hw:%d:%d)\n", hpi->in_card, hpi->in_device);
ALOGD("config channels:%d rate:%d period_size=%d period_count=%d format=%x",
hpi->in->config.channels, hpi->in->config.rate, hpi->in->config.period_size,
hpi->in->config.period_count, hpi->in->config.format);
hpi->pcm = pcm_open((unsigned int)hpi->in_card, (unsigned int)hpi->in_device, PCM_IN, &hpi->in->config);
if (hpi->pcm == NULL || pcm_is_ready(hpi->pcm) == 0) {
if (hpi->pcm != NULL) {
ALOGE("pcm_open() failed: %s", pcm_get_error(hpi->pcm));
pcm_close(hpi->pcm);
hpi->pcm = NULL;
}
return -ENOMEM;
}
ret = memset_s(value, PROPERTY_VALUE_MAX, 0, PROPERTY_VALUE_MAX);
if (ret != 0) {
ALOGE("memset_s value failed(0x%x)", ret);
}
property_get(PROPERTY_FILE_HPI_RECORD, value, "");
ALOGD("%s: %s is %s", __func__, PROPERTY_FILE_HPI_RECORD, value);
if (strncmp(value, "true", strlen("true")) == 0) {
if (hpi->fd == NULL) {
hpi->fd = fopen(HPI_RECORD_FILE, "ab");
if (hpi->fd != NULL) {
ALOGD("%s: enable save %s", __func__, HPI_RECORD_FILE);
} else {
ALOGD("%s: %s can not be created!", __func__, HPI_RECORD_FILE);
}
}
} else {
ALOGV("%s: disable save %s", __func__, HPI_RECORD_FILE);
if (hpi->fd != NULL) {
fclose(hpi->fd);
hpi->fd = NULL;
}
}
return 0;
}
int hpi_close(struct hpi_data *hpi)
{
ALOGD("%s: device(hw:%d:%d)\n", __func__, hpi->in_card, hpi->in_device);
if (hpi->pcm != NULL) {
pcm_close(hpi->pcm);
hpi->pcm = NULL;
}
if (hpi->fd != NULL) {
fclose(hpi->fd);
hpi->fd = NULL;
}
return 0;
}
ssize_t hpi_read(struct hpi_data *hpi, const uint8_t* buffer, size_t bytes)
{
int ret = -1;
if (hpi->pcm == NULL) {
ALOGE("%s: pcm Null pointer", __func__);
return ret;
}
ret = pcm_read(hpi->pcm, (void*)buffer, bytes);
if (ret == 0) {
hpi->frames_read += bytes / (hpi->in->config.channels * sizeof(short));
if (hpi->fd != NULL) {
size_t count;
count = fwrite(buffer, 1, bytes, hpi->fd);
if (count < bytes) {
ALOGE("%s: not save all data! expect=%d actual=%d", __func__, bytes, count);
}
}
} else {
ALOGE("%s:%d byte written failed", __func__, bytes);
}
return 0;
}
void hpi_destroy(struct hpi_data* hpi)
{
ALOGD("in function %s, handle(%d)", __func__, hpi->in->handle);
if (hpi->fd != NULL) {
fclose(hpi->fd);
hpi->fd = NULL;
}
if (hpi->pcm != NULL) {
pcm_close(hpi->pcm);
hpi->pcm = NULL;
}
free(hpi);
}