summaryrefslogtreecommitdiff
path: root/avsys-audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'avsys-audio.c')
-rw-r--r--avsys-audio.c53
1 files changed, 40 insertions, 13 deletions
diff --git a/avsys-audio.c b/avsys-audio.c
index 029d93a..39dd1c8 100644
--- a/avsys-audio.c
+++ b/avsys-audio.c
@@ -37,6 +37,7 @@
#include "avsys-audio.h"
#include "avsys-audio-logical-volume.h"
#include "avsys-common.h"
+#include "avsys-audio-sync.h"
#include "avsys-audio-path.h"
#include "avsys-audio-alsa.h"
@@ -50,6 +51,10 @@
#define FADEUP_CALC_BIAS (1)
static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *param);
+static int __avsys_audio_handle_init(int *handle,
+ avsys_audio_handle_t **ptr,
+ avsys_audio_param_t *param);
+
void __init_module(void);
void __fini_module(void);
@@ -122,7 +127,9 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
avsys_error(AVAUDIO, "Unused handle cleanup before handle allocation failed in %s\n", __func__);
goto error;
}
- err = avsys_audio_handle_alloc(&handle);
+
+ err = __avsys_audio_handle_init(&handle,&p,param);
+
if (AVSYS_STATE_ERR_RANGE_OVER == err) {
avsys_error(AVAUDIO, "audio handle is fully allocated..try cleanup\n");
err = avsys_audio_handle_rejuvenation();
@@ -131,7 +138,7 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
goto error;
}
avsys_error(AVAUDIO, "one more try...to allocate audio handle\n");
- err = avsys_audio_handle_alloc(&handle);
+ err = __avsys_audio_handle_init(&handle,&p,param);
if (AVSYS_FAIL(err)) {
avsys_error(AVAUDIO, "handle alloc failed 1 in %s\n", __func__);
goto error;
@@ -141,17 +148,6 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
goto error;
}
- err = avsys_audio_handle_get_ptr(handle, &p, HANDLE_PTR_MODE_NORMAL);
- if (AVSYS_FAIL(err)) {
- goto error;
- }
-
- /* set information to handle */
- err = __avsys_audio_set_info(p, param);
- if (AVSYS_FAIL(err)) {
- goto error;
- }
-
if (p->mode == AVSYS_AUDIO_MODE_OUTPUT || p->mode == AVSYS_AUDIO_MODE_OUTPUT_CLOCK ||
p->mode == AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY || p->mode == AVSYS_AUDIO_MODE_OUTPUT_AP_CALL || p->mode == AVSYS_AUDIO_MODE_OUTPUT_VIDEO) {
/* set volume table */
@@ -756,6 +752,37 @@ static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *
return AVSYS_STATE_SUCCESS;
}
+static int __avsys_audio_handle_init(int *handle,
+ avsys_audio_handle_t **ptr,
+ avsys_audio_param_t *param)
+{
+ int err = AVSYS_STATE_ERR_UNKNOWN;
+
+ if (AVSYS_FAIL(avsys_audio_lock_sync(AVSYS_AUDIO_SYNC_IDEN_HANDLE))) {
+ avsys_error(AVAUDIO,"avsys_audio_lock_sync() failed in %s\n", __func__);
+ return AVSYS_STATE_ERR_INTERNAL;
+ }
+
+ err = avsys_audio_handle_alloc_unlocked(handle);
+
+ if (AVSYS_STATE_SUCCESS == err) {
+
+ err = avsys_audio_handle_get_ptr_unlocked(*handle, ptr, HANDLE_PTR_MODE_NORMAL);
+ if(AVSYS_STATE_SUCCESS == err) {
+
+ /* set information to handle */
+ err = __avsys_audio_set_info(*ptr, param);
+ }
+ }
+
+ if (AVSYS_FAIL(avsys_audio_unlock_sync(AVSYS_AUDIO_SYNC_IDEN_HANDLE))) {
+ avsys_error(AVAUDIO,"avsys_audio_unlock_sync() failed in %s\n", __func__);
+ return AVSYS_STATE_ERR_INTERNAL;
+ }
+
+ return err;
+}
+
EXPORT_API
int avsys_audio_earjack_manager_init(int *earjack_type, int *waitfd)
{