hal: Add API support to stop input stream
Add API support to stop input stream. Expose in_stop in HAL via QAHW so that clients may call it when necessary. Change-Id: I5b1112166453371ab4d79c31fa99fb1f6b3bff3f
This commit is contained in:
parent
007e5e9cd5
commit
46e079872c
|
@ -98,9 +98,10 @@ bool cin_applicable_stream(struct stream_in *in);
|
||||||
bool cin_attached_usecase(audio_usecase_t uc_id);
|
bool cin_attached_usecase(audio_usecase_t uc_id);
|
||||||
bool cin_format_supported(audio_format_t format);
|
bool cin_format_supported(audio_format_t format);
|
||||||
size_t cin_get_buffer_size(struct stream_in *in);
|
size_t cin_get_buffer_size(struct stream_in *in);
|
||||||
int cin_start_input_stream(struct stream_in *in);
|
int cin_open_input_stream(struct stream_in *in);
|
||||||
void cin_stop_input_stream(struct stream_in *in);
|
void cin_stop_input_stream(struct stream_in *in);
|
||||||
void cin_close_input_stream(struct stream_in *in);
|
void cin_close_input_stream(struct stream_in *in);
|
||||||
|
void cin_free_input_stream_resources(struct stream_in *in);
|
||||||
int cin_read(struct stream_in *in, void *buffer,
|
int cin_read(struct stream_in *in, void *buffer,
|
||||||
size_t bytes, size_t *bytes_read);
|
size_t bytes, size_t *bytes_read);
|
||||||
int cin_configure_input_stream(struct stream_in *in);
|
int cin_configure_input_stream(struct stream_in *in);
|
||||||
|
@ -5063,9 +5064,9 @@ size_t audio_extn_cin_get_buffer_size(struct stream_in *in)
|
||||||
{
|
{
|
||||||
return (audio_extn_compress_in_enabled? cin_get_buffer_size(in): 0);
|
return (audio_extn_compress_in_enabled? cin_get_buffer_size(in): 0);
|
||||||
}
|
}
|
||||||
int audio_extn_cin_start_input_stream(struct stream_in *in)
|
int audio_extn_cin_open_input_stream(struct stream_in *in)
|
||||||
{
|
{
|
||||||
return (audio_extn_compress_in_enabled? cin_start_input_stream(in): -1);
|
return (audio_extn_compress_in_enabled? cin_open_input_stream(in): -1);
|
||||||
}
|
}
|
||||||
void audio_extn_cin_stop_input_stream(struct stream_in *in)
|
void audio_extn_cin_stop_input_stream(struct stream_in *in)
|
||||||
{
|
{
|
||||||
|
@ -5075,6 +5076,10 @@ void audio_extn_cin_close_input_stream(struct stream_in *in)
|
||||||
{
|
{
|
||||||
(audio_extn_compress_in_enabled? cin_close_input_stream(in): NULL);
|
(audio_extn_compress_in_enabled? cin_close_input_stream(in): NULL);
|
||||||
}
|
}
|
||||||
|
void audio_extn_cin_free_input_stream_resources(struct stream_in *in)
|
||||||
|
{
|
||||||
|
return (audio_extn_compress_in_enabled? cin_free_input_stream_resources(in): NULL);
|
||||||
|
}
|
||||||
int audio_extn_cin_read(struct stream_in *in, void *buffer,
|
int audio_extn_cin_read(struct stream_in *in, void *buffer,
|
||||||
size_t bytes, size_t *bytes_read)
|
size_t bytes, size_t *bytes_read)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1011,9 +1011,10 @@ bool audio_extn_cin_applicable_stream(struct stream_in *in);
|
||||||
bool audio_extn_cin_attached_usecase(audio_usecase_t uc_id);
|
bool audio_extn_cin_attached_usecase(audio_usecase_t uc_id);
|
||||||
bool audio_extn_cin_format_supported(audio_format_t format);
|
bool audio_extn_cin_format_supported(audio_format_t format);
|
||||||
size_t audio_extn_cin_get_buffer_size(struct stream_in *in);
|
size_t audio_extn_cin_get_buffer_size(struct stream_in *in);
|
||||||
int audio_extn_cin_start_input_stream(struct stream_in *in);
|
int audio_extn_cin_open_input_stream(struct stream_in *in);
|
||||||
void audio_extn_cin_stop_input_stream(struct stream_in *in);
|
void audio_extn_cin_stop_input_stream(struct stream_in *in);
|
||||||
void audio_extn_cin_close_input_stream(struct stream_in *in);
|
void audio_extn_cin_close_input_stream(struct stream_in *in);
|
||||||
|
void audio_extn_cin_free_input_stream_resources(struct stream_in *in);
|
||||||
int audio_extn_cin_read(struct stream_in *in, void *buffer,
|
int audio_extn_cin_read(struct stream_in *in, void *buffer,
|
||||||
size_t bytes, size_t *bytes_read);
|
size_t bytes, size_t *bytes_read);
|
||||||
int audio_extn_cin_configure_input_stream(struct stream_in *in);
|
int audio_extn_cin_configure_input_stream(struct stream_in *in);
|
||||||
|
|
|
@ -179,7 +179,7 @@ size_t cin_get_buffer_size(struct stream_in *in)
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cin_start_input_stream(struct stream_in *in)
|
int cin_open_input_stream(struct stream_in *in)
|
||||||
{
|
{
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
struct audio_device *adev = in->dev;
|
struct audio_device *adev = in->dev;
|
||||||
|
@ -206,6 +206,17 @@ void cin_stop_input_stream(struct stream_in *in)
|
||||||
{
|
{
|
||||||
cin_private_data_t *cin_data = (cin_private_data_t *) in->cin_extn;
|
cin_private_data_t *cin_data = (cin_private_data_t *) in->cin_extn;
|
||||||
|
|
||||||
|
ALOGV("%s: in %p, cin_data %p", __func__, in, cin_data);
|
||||||
|
if (cin_data->compr) {
|
||||||
|
compress_stop(cin_data->compr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cin_close_input_stream(struct stream_in *in)
|
||||||
|
{
|
||||||
|
cin_private_data_t *cin_data = (cin_private_data_t *) in->cin_extn;
|
||||||
|
|
||||||
ALOGV("%s: in %p, cin_data %p", __func__, in, cin_data);
|
ALOGV("%s: in %p, cin_data %p", __func__, in, cin_data);
|
||||||
if (cin_data->compr) {
|
if (cin_data->compr) {
|
||||||
compress_close(cin_data->compr);
|
compress_close(cin_data->compr);
|
||||||
|
@ -213,7 +224,7 @@ void cin_stop_input_stream(struct stream_in *in)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cin_close_input_stream(struct stream_in *in)
|
void cin_free_input_stream_resources(struct stream_in *in)
|
||||||
{
|
{
|
||||||
cin_private_data_t *cin_data = (cin_private_data_t *) in->cin_extn;
|
cin_private_data_t *cin_data = (cin_private_data_t *) in->cin_extn;
|
||||||
|
|
||||||
|
@ -332,6 +343,6 @@ int cin_configure_input_stream(struct stream_in *in)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
err_config:
|
err_config:
|
||||||
cin_close_input_stream(in);
|
cin_free_input_stream_resources(in);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2910,7 +2910,7 @@ int start_input_stream(struct stream_in *in)
|
||||||
ALOGE("%s: failed to start ext hw plugin", __func__);
|
ALOGE("%s: failed to start ext hw plugin", __func__);
|
||||||
|
|
||||||
if (audio_extn_cin_attached_usecase(in->usecase)) {
|
if (audio_extn_cin_attached_usecase(in->usecase)) {
|
||||||
ret = audio_extn_cin_start_input_stream(in);
|
ret = audio_extn_cin_open_input_stream(in);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error_open;
|
goto error_open;
|
||||||
else
|
else
|
||||||
|
@ -6228,7 +6228,7 @@ static int in_standby(struct audio_stream *stream)
|
||||||
in->capture_started = false;
|
in->capture_started = false;
|
||||||
} else {
|
} else {
|
||||||
if (audio_extn_cin_attached_usecase(in->usecase))
|
if (audio_extn_cin_attached_usecase(in->usecase))
|
||||||
audio_extn_cin_stop_input_stream(in);
|
audio_extn_cin_close_input_stream(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in->pcm) {
|
if (in->pcm) {
|
||||||
|
@ -9007,7 +9007,7 @@ static void adev_close_input_stream(struct audio_hw_device *dev,
|
||||||
audio_extn_compr_cap_deinit();
|
audio_extn_compr_cap_deinit();
|
||||||
|
|
||||||
if (audio_extn_cin_attached_usecase(in->usecase))
|
if (audio_extn_cin_attached_usecase(in->usecase))
|
||||||
audio_extn_cin_close_input_stream(in);
|
audio_extn_cin_free_input_stream_resources(in);
|
||||||
|
|
||||||
if (in->is_st_session) {
|
if (in->is_st_session) {
|
||||||
ALOGV("%s: sound trigger pcm stop lab", __func__);
|
ALOGV("%s: sound trigger pcm stop lab", __func__);
|
||||||
|
|
|
@ -190,6 +190,27 @@ int qahwi_set_param_data(struct audio_hw_device *adev,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qahwi_in_stop(struct audio_stream_in* stream) {
|
||||||
|
struct stream_in *in = (struct stream_in *)stream;
|
||||||
|
struct audio_device *adev = in->dev;
|
||||||
|
|
||||||
|
ALOGD("%s processing, in %p", __func__, in);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&adev->lock);
|
||||||
|
|
||||||
|
if (!in->standby) {
|
||||||
|
if (in->pcm != NULL ) {
|
||||||
|
pcm_stop(in->pcm);
|
||||||
|
} else if (audio_extn_cin_format_supported(in->format)) {
|
||||||
|
audio_extn_cin_stop_input_stream(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&adev->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t qahwi_in_read_v2(struct audio_stream_in *stream, void* buffer,
|
ssize_t qahwi_in_read_v2(struct audio_stream_in *stream, void* buffer,
|
||||||
size_t bytes, uint64_t *timestamp)
|
size_t bytes, uint64_t *timestamp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -357,6 +357,10 @@ char* qahw_in_get_parameters_l(const qahw_stream_handle_t *in_handle,
|
||||||
*/
|
*/
|
||||||
ssize_t qahw_in_read_l(qahw_stream_handle_t *in_handle,
|
ssize_t qahw_in_read_l(qahw_stream_handle_t *in_handle,
|
||||||
qahw_in_buffer_t *in_buf);
|
qahw_in_buffer_t *in_buf);
|
||||||
|
/*
|
||||||
|
* Stop input stream. Returns zero on success.
|
||||||
|
*/
|
||||||
|
int qahw_in_stop_l(qahw_stream_handle_t *in_handle);
|
||||||
/*
|
/*
|
||||||
* Return the amount of input frames lost in the audio driver since the
|
* Return the amount of input frames lost in the audio driver since the
|
||||||
* last call of this function.
|
* last call of this function.
|
||||||
|
|
|
@ -61,6 +61,8 @@ typedef int (*qahwi_set_param_data_t) (audio_hw_device_t *,
|
||||||
typedef uint64_t (*qahwi_in_read_v2_t)(audio_stream_in_t *in, void* buffer,
|
typedef uint64_t (*qahwi_in_read_v2_t)(audio_stream_in_t *in, void* buffer,
|
||||||
size_t bytes, int64_t *timestamp);
|
size_t bytes, int64_t *timestamp);
|
||||||
|
|
||||||
|
typedef int (*qahwi_in_stop_t)(audio_stream_in_t *in);
|
||||||
|
|
||||||
typedef int (*qahwi_out_set_param_data_t)(struct audio_stream_out *out,
|
typedef int (*qahwi_out_set_param_data_t)(struct audio_stream_out *out,
|
||||||
qahw_param_id param_id,
|
qahw_param_id param_id,
|
||||||
qahw_param_payload *payload);
|
qahw_param_payload *payload);
|
||||||
|
@ -109,6 +111,7 @@ typedef struct {
|
||||||
struct listnode list;
|
struct listnode list;
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
qahwi_in_read_v2_t qahwi_in_read_v2;
|
qahwi_in_read_v2_t qahwi_in_read_v2;
|
||||||
|
qahwi_in_stop_t qahwi_in_stop;
|
||||||
} qahw_stream_in_t;
|
} qahw_stream_in_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -1034,6 +1037,31 @@ exit:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stop input stream. Returns zero on success.
|
||||||
|
*/
|
||||||
|
int qahw_in_stop_l(qahw_stream_handle_t *in_handle)
|
||||||
|
{
|
||||||
|
int rc = -EINVAL;
|
||||||
|
qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
|
||||||
|
audio_stream_in_t *in = NULL;
|
||||||
|
|
||||||
|
if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
|
||||||
|
ALOGV("%s::Invalid in handle %p", __func__, in_handle);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
ALOGD("%s", __func__);
|
||||||
|
|
||||||
|
in = qahw_stream_in->stream;
|
||||||
|
|
||||||
|
if (qahw_stream_in->qahwi_in_stop)
|
||||||
|
rc = qahw_stream_in->qahwi_in_stop(in);
|
||||||
|
ALOGD("%s: exit", __func__);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the amount of input frames lost in the audio driver since the
|
* Return the amount of input frames lost in the audio driver since the
|
||||||
* last call of this function.
|
* last call of this function.
|
||||||
|
@ -1718,6 +1746,7 @@ int qahw_open_input_stream_l(qahw_module_handle_t *hw_module,
|
||||||
qahw_module_t *qahw_module_temp = NULL;
|
qahw_module_t *qahw_module_temp = NULL;
|
||||||
audio_hw_device_t *audio_device = NULL;
|
audio_hw_device_t *audio_device = NULL;
|
||||||
qahw_stream_in_t *qahw_stream_in = NULL;
|
qahw_stream_in_t *qahw_stream_in = NULL;
|
||||||
|
const char *error;
|
||||||
|
|
||||||
pthread_mutex_lock(&qahw_module_init_lock);
|
pthread_mutex_lock(&qahw_module_init_lock);
|
||||||
qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
|
qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
|
||||||
|
@ -1747,6 +1776,7 @@ int qahw_open_input_stream_l(qahw_module_handle_t *hw_module,
|
||||||
if (rc) {
|
if (rc) {
|
||||||
ALOGE("%s::open input stream failed %d",__func__, rc);
|
ALOGE("%s::open input stream failed %d",__func__, rc);
|
||||||
free(qahw_stream_in);
|
free(qahw_stream_in);
|
||||||
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
qahw_stream_in->module = hw_module;
|
qahw_stream_in->module = hw_module;
|
||||||
*in_handle = (void *)qahw_stream_in;
|
*in_handle = (void *)qahw_stream_in;
|
||||||
|
@ -1757,7 +1787,6 @@ int qahw_open_input_stream_l(qahw_module_handle_t *hw_module,
|
||||||
/* dlsym qahwi_in_read_v2 if timestamp flag is used */
|
/* dlsym qahwi_in_read_v2 if timestamp flag is used */
|
||||||
if (!rc && ((flags & QAHW_INPUT_FLAG_TIMESTAMP) ||
|
if (!rc && ((flags & QAHW_INPUT_FLAG_TIMESTAMP) ||
|
||||||
(flags & QAHW_INPUT_FLAG_PASSTHROUGH))) {
|
(flags & QAHW_INPUT_FLAG_PASSTHROUGH))) {
|
||||||
const char *error;
|
|
||||||
|
|
||||||
/* clear any existing errors */
|
/* clear any existing errors */
|
||||||
dlerror();
|
dlerror();
|
||||||
|
@ -1769,6 +1798,15 @@ int qahw_open_input_stream_l(qahw_module_handle_t *hw_module,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* clear any existing errors */
|
||||||
|
dlerror();
|
||||||
|
qahw_stream_in->qahwi_in_stop = (qahwi_in_stop_t)
|
||||||
|
dlsym(qahw_module->module->dso, "qahwi_in_stop");
|
||||||
|
if ((error = dlerror()) != NULL) {
|
||||||
|
ALOGI("%s: dlsym error %s for qahwi_in_stop", __func__, error);
|
||||||
|
qahw_stream_in->qahwi_in_stop = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
pthread_mutex_unlock(&qahw_module->lock);
|
pthread_mutex_unlock(&qahw_module->lock);
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -353,6 +353,10 @@ char* qahw_in_get_parameters(const qahw_stream_handle_t *in_handle,
|
||||||
*/
|
*/
|
||||||
ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
|
ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
|
||||||
qahw_in_buffer_t *in_buf);
|
qahw_in_buffer_t *in_buf);
|
||||||
|
/*
|
||||||
|
* Stop input stream. Returns zero on success.
|
||||||
|
*/
|
||||||
|
int qahw_in_stop(qahw_stream_handle_t *in_handle);
|
||||||
/*
|
/*
|
||||||
* Return the amount of input frames lost in the audio driver since the
|
* Return the amount of input frames lost in the audio driver since the
|
||||||
* last call of this function.
|
* last call of this function.
|
||||||
|
|
|
@ -678,6 +678,22 @@ ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qahw_in_stop(qahw_stream_handle_t *in_handle)
|
||||||
|
{
|
||||||
|
if (g_binder_enabled) {
|
||||||
|
if (!g_qas_died) {
|
||||||
|
sp<Iqti_audio_server> qas = get_qti_audio_server();
|
||||||
|
if (qas_status(qas) == -1)
|
||||||
|
return -ENODEV;
|
||||||
|
return qas->qahw_in_stop(in_handle);
|
||||||
|
} else {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return qahw_in_stop_l(in_handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
|
uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
|
||||||
{
|
{
|
||||||
ALOGV("%d:%s",__LINE__, __func__);
|
ALOGV("%d:%s",__LINE__, __func__);
|
||||||
|
@ -1544,6 +1560,11 @@ ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
|
||||||
return qahw_in_read_l(in_handle, in_buf);
|
return qahw_in_read_l(in_handle, in_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qahw_in_stop(qahw_stream_handle_t *in_handle)
|
||||||
|
{
|
||||||
|
return qahw_in_stop_l(in_handle);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
|
uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
|
||||||
{
|
{
|
||||||
ALOGV("%d:%s",__LINE__, __func__);
|
ALOGV("%d:%s",__LINE__, __func__);
|
||||||
|
|
Loading…
Reference in New Issue