4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jonghyuk Choi <jhchoi.choi@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
26 #include <sys/types.h>
29 #include <sys/syscall.h>
34 #include "avsys-types.h"
35 #include "avsys-error.h"
36 #include "avsys-debug.h"
37 #include "avsys-audio.h"
38 #include "avsys-audio-logical-volume.h"
39 #include "avsys-common.h"
41 #include "avsys-audio-path.h"
42 #include "avsys-audio-alsa.h"
44 #include "avsys-audio-pasimple.h"
45 #include "avsys-audio-pactrl.h"
48 * Internal functions definition
50 #define FADEUP_CALC_BIAS (1)
52 static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *param);
54 void __init_module(void);
55 void __fini_module(void);
57 #define AVSYS_GET_HANDLE_PTR(MODE) do { \
58 err = avsys_audio_handle_get_ptr((int)handle, &p, MODE); \
59 if (AVSYS_FAIL(err)) { \
64 #define AVSYS_RELEASE_HANDLE_PTR(MODE) do { \
65 if (AVSYS_FAIL(avsys_audio_handle_release_ptr((int)handle, MODE))) { \
66 avsys_error(AVAUDIO, "audio handle release failed\n"); \
67 return AVSYS_STATE_ERR_INTERNAL; \
71 #define AVSYS_STREAM_LOCK() do { \
72 pthread_mutex_lock(&gmutex);\
73 avsys_info(AVAUDIO, "(+) LOCKED\n"); \
76 #define AVSYS_STREAM_UNLOCK() do { \
77 pthread_mutex_unlock(&gmutex);\
78 avsys_info(AVAUDIO, "(-) UNLOCKED\n"); \
82 * Internal global variable
84 static pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;
87 /****************************************************************************
91 ***************************************************************************/
93 int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *size)
96 avsys_audio_handle_t *p = NULL;
97 int err = AVSYS_STATE_ERR_UNKNOWN;
99 avsys_info(AVAUDIO, "%s\n", __func__);
101 if (param == NULL || phandle == NULL) {
102 avsys_error(AVAUDIO, "param or phandle is null\n");
103 return AVSYS_STATE_ERR_NULL_POINTER;
106 if (param->channels > 2 || param->channels < 1) {
107 return AVSYS_STATE_ERR_INVALID_CHANNEL;
110 if (param->mode < AVSYS_AUDIO_MODE_OUTPUT || param->mode >= AVSYS_AUDIO_MODE_NUM) {
111 return AVSYS_STATE_ERR_INVALID_MODE;
114 if (param->format < AVSYS_AUDIO_FORMAT_MIN || param->format > AVSYS_AUDIO_FORMAT_MAX) {
115 return AVSYS_STATE_ERR_INVALID_FORMAT;
120 err = avsys_audio_handle_rejuvenation();
121 if (AVSYS_FAIL(err)) {
122 avsys_error(AVAUDIO, "Unused handle cleanup before handle allocation failed in %s\n", __func__);
125 err = avsys_audio_handle_alloc(&handle);
126 if (AVSYS_STATE_ERR_RANGE_OVER == err) {
127 avsys_error(AVAUDIO, "audio handle is fully allocated..try cleanup\n");
128 err = avsys_audio_handle_rejuvenation();
129 if (AVSYS_FAIL(err)) {
130 avsys_error(AVAUDIO, "Unused handle cleanup failed in %s\n", __func__);
133 avsys_error(AVAUDIO, "one more try...to allocate audio handle\n");
134 err = avsys_audio_handle_alloc(&handle);
135 if (AVSYS_FAIL(err)) {
136 avsys_error(AVAUDIO, "handle alloc failed 1 in %s\n", __func__);
139 } else if ((AVSYS_FAIL(err)) && (err != AVSYS_STATE_ERR_RANGE_OVER)) {
140 avsys_error(AVAUDIO, "handle alloc failed 2 in %s\n", __func__);
144 err = avsys_audio_handle_get_ptr(handle, &p, HANDLE_PTR_MODE_NORMAL);
145 if (AVSYS_FAIL(err)) {
149 /* set information to handle */
150 err = __avsys_audio_set_info(p, param);
151 if (AVSYS_FAIL(err)) {
155 if (p->mode == AVSYS_AUDIO_MODE_OUTPUT || p->mode == AVSYS_AUDIO_MODE_OUTPUT_CLOCK ||
156 p->mode == AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY || p->mode == AVSYS_AUDIO_MODE_OUTPUT_AP_CALL || p->mode == AVSYS_AUDIO_MODE_OUTPUT_VIDEO) {
157 /* set volume table */
158 err = avsys_audio_path_set_volume(handle);
159 if (AVSYS_FAIL(err)) {
163 /* update volume by type */
164 err = avsys_audio_handle_update_volume(p, p->gain_setting.vol_type);
165 if (AVSYS_FAIL(err)) {
168 err = avsys_audio_handle_update_priority(handle, param->priority, param->handle_route, AVSYS_AUDIO_SET_PRIORITY);
169 if (AVSYS_FAIL(err)) {
175 err = avsys_audio_pasimple_open_device(p->mode, p->format, p->channels, p->samplerate, p, param->handle_route);
176 if (AVSYS_FAIL(err)) {
180 case AVSYS_AUDIO_MODE_OUTPUT:
181 case AVSYS_AUDIO_MODE_OUTPUT_CLOCK:
182 case AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY:
183 case AVSYS_AUDIO_MODE_OUTPUT_VIDEO:
184 case AVSYS_AUDIO_MODE_OUTPUT_AP_CALL:
185 if (AVSYS_FAIL(avsys_audio_pasimple_set_volume(p, p->working_vol.level[AVSYS_AUDIO_CHANNEL_LEFT]))) {
186 avsys_error(AVAUDIO, "can not set volume in %s\n", __func__);
193 *phandle = (avsys_handle_t) handle;
194 /* set recommended buffer size */
198 avsys_warning(AVAUDIO, "Size is null\n");
200 err = avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL);
201 if (AVSYS_FAIL(err)) {
204 AVSYS_STREAM_UNLOCK();
205 return AVSYS_STATE_SUCCESS;
209 avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL);
213 if (AVSYS_FAIL(avsys_audio_handle_free(handle))) {
214 avsys_error(AVAUDIO, "Can not free handle %d\n", handle);
218 avsys_error(AVAUDIO, "failed to open : RESION %x\n", err);
220 *phandle = (avsys_handle_t)-1;
221 AVSYS_STREAM_UNLOCK();
226 int avsys_audio_close(avsys_handle_t handle)
228 avsys_audio_handle_t *p = NULL;
229 int err = AVSYS_STATE_ERR_UNKNOWN;
230 bool cp_audio = false;
231 bool bt_path = false;
234 avsys_info(AVAUDIO, "%s, handle=[%d]\n", __func__, (int)handle);
236 err = avsys_audio_handle_get_ptr((int)handle, &p, HANDLE_PTR_MODE_NORMAL);
237 if (AVSYS_FAIL(err)) {
238 AVSYS_STREAM_UNLOCK();
242 if (AVSYS_FAIL(avsys_audio_handle_update_priority((int)handle, p->priority, AVSYS_AUDIO_HANDLE_ROUTE_FOLLOWING_POLICY, AVSYS_AUDIO_UNSET_PRIORITY))) {
243 avsys_error(AVAUDIO, "unset priority of handle %d error: %x\n", handle, err);
246 err = avsys_audio_pasimple_close_device(p);
247 if (AVSYS_FAIL(err)) {
248 avsys_error_r(AVAUDIO, "audio device close error : %x\n", err);
251 if (AVSYS_FAIL(avsys_audio_path_check_cp_audio(&cp_audio, &bt_path))) {
252 avsys_error(AVAUDIO, "Can not check cp audio status\n");
255 if (p->during_cp_audio && cp_audio && bt_path) {
256 /* set cp bt path again */
257 avsys_audio_path_set_single_ascn("cp_to_bt");
260 if (AVSYS_FAIL(avsys_audio_handle_release_ptr((int)handle, HANDLE_PTR_MODE_NORMAL))) {
261 avsys_error(AVAUDIO, "audio handle release failed\n");
262 AVSYS_STREAM_UNLOCK();
263 return AVSYS_STATE_ERR_INTERNAL;
266 avsys_audio_handle_free((int)handle);
268 AVSYS_STREAM_UNLOCK();
274 int avsys_audio_ampon(void)
276 avsys_info(AVAUDIO, "%s\n", __func__);
277 return avsys_audio_path_ex_set_amp(AVSYS_AUDIO_AMP_ON);
281 int avsys_audio_ampoff(void)
283 avsys_info(AVAUDIO, "%s\n", __func__);
284 return avsys_audio_path_ex_set_amp(AVSYS_AUDIO_AMP_OFF);
289 int avsys_audio_ext_device_ampon(avsysaudio_ext_device_t device_type)
291 avsys_info(AVAUDIO, "%s\n", __func__);
292 return avsys_audio_handle_ext_dev_set_mute(device_type, AVSYS_AUDIO_UNMUTE);
296 int avsys_audio_ext_device_ampoff(avsysaudio_ext_device_t device_type)
298 avsys_info(AVAUDIO, "%s\n", __func__);
299 return avsys_audio_handle_ext_dev_set_mute(device_type, AVSYS_AUDIO_MUTE);
303 int avsys_audio_set_ext_device_status(avsysaudio_ext_device_t device_type, int onoff)
305 avsys_info(AVAUDIO, "%s\n", __func__);
306 return avsys_audio_handle_ext_dev_status_update(device_type, onoff);
310 int avsys_audio_get_ext_device_status(avsysaudio_ext_device_t device_type, int *onoff)
312 avsys_info(AVAUDIO, "%s\n", __func__);
313 return avsys_audio_handle_ext_dev_status(device_type, onoff);
317 int avsys_audio_flush(avsys_handle_t handle)
319 int err = AVSYS_STATE_SUCCESS;
320 avsys_audio_handle_t *p = NULL;
321 avsys_info(AVAUDIO, "%s\n", __func__);
323 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
325 err = avsys_audio_pasimple_reset(p);
327 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
333 int avsys_audio_drain(avsys_handle_t handle)
335 int err = AVSYS_STATE_SUCCESS;
336 avsys_audio_handle_t *p = NULL;
337 avsys_info(AVAUDIO, "%s\n", __func__);
339 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
341 err = avsys_audio_pasimple_drain(p);
343 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
349 int avsys_audio_read(avsys_handle_t handle, void *buf, int size)
351 int err = AVSYS_STATE_SUCCESS;
352 avsys_audio_handle_t *p = NULL;
354 avsys_info(AVAUDIO, "%s\n", __func__);
357 avsys_error(AVAUDIO, "input buffer pointer is null\n");
358 return AVSYS_STATE_ERR_NULL_POINTER;
361 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_FAST);
363 if (p->mode != AVSYS_AUDIO_MODE_INPUT && p->mode != AVSYS_AUDIO_MODE_INPUT_LOW_LATENCY &&
364 p->mode != AVSYS_AUDIO_MODE_INPUT_HIGH_LATENCY && p->mode != AVSYS_AUDIO_MODE_INPUT_AP_CALL) {
365 avsys_error(AVAUDIO, "opened output mode\n");
366 return AVSYS_STATE_ERR_INVALID_MODE;
369 err = avsys_audio_pasimple_read(p, buf, size);
371 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_FAST);
377 int avsys_audio_write(avsys_handle_t handle, void *buf, int size)
379 int err = AVSYS_STATE_SUCCESS;
380 avsys_audio_handle_t *p = NULL;
382 avsys_info(AVAUDIO, "%s\n", __func__);
385 avsys_error(AVAUDIO, "buf is null\n");
386 return AVSYS_STATE_ERR_NULL_POINTER;
389 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_FAST);
391 if (p->mode != AVSYS_AUDIO_MODE_OUTPUT && p->mode != AVSYS_AUDIO_MODE_OUTPUT_CLOCK &&
392 p->mode != AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY && p->mode != AVSYS_AUDIO_MODE_OUTPUT_AP_CALL && p->mode != AVSYS_AUDIO_MODE_OUTPUT_VIDEO) {
393 avsys_error(AVAUDIO, "opened input mode\n");
394 avsys_audio_handle_release_ptr((int)handle, HANDLE_PTR_MODE_FAST);
395 return AVSYS_STATE_ERR_INVALID_MODE;
398 if (p->fadeup_vol > 1) {
399 if (p->fadeup_multiplier == 0) {
400 avsys_audio_volume_t fade_volume;
401 fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT] = p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT] - (p->fadeup_vol - FADEUP_CALC_BIAS);
402 fade_volume.level[AVSYS_AUDIO_CHANNEL_RIGHT] = p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT] - (p->fadeup_vol - FADEUP_CALC_BIAS);
404 if (fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT] < 0) {
405 fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT] = 0;
407 if (fade_volume.level[AVSYS_AUDIO_CHANNEL_RIGHT] < 0) {
408 fade_volume.level[AVSYS_AUDIO_CHANNEL_RIGHT] = 0;
411 avsys_info(AVAUDIO, "fade_volume : %d (%d-(%d)+%d) p->fadeup_m = %d, p->msec_per_period = %d\n",
412 fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT],p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT],p->fadeup_vol,FADEUP_CALC_BIAS,
413 p->fadeup_multiplier, p->msec_per_period
416 avsys_audio_logical_volume_convert(&fade_volume, &p->working_vol, &p->gain_setting);
417 avsys_audio_pasimple_set_volume(p, p->working_vol.level[AVSYS_AUDIO_CHANNEL_LEFT]);
419 if (p->msec_per_period > 50)
420 p->fadeup_multiplier = 0;
422 p->fadeup_multiplier = FADE_UP_MULTIPLIER;
424 p->fadeup_multiplier--;
426 } else if (p->fadeup_vol <= -1) {
427 if (p->fadeup_multiplier == 0) {
428 int fadedown_vol = 0;
429 avsys_audio_volume_t fade_volume;
431 fadedown_vol = (-1) * (p->fadeup_vol) - FADEUP_CALC_BIAS;
432 fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT] = fadedown_vol;
433 fade_volume.level[AVSYS_AUDIO_CHANNEL_RIGHT] = fadedown_vol;
435 if (fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT] < 0) {
436 fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT] = 0;
438 if (fade_volume.level[AVSYS_AUDIO_CHANNEL_RIGHT] < 0) {
439 fade_volume.level[AVSYS_AUDIO_CHANNEL_RIGHT] = 0;
442 avsys_info(AVAUDIO, "fade_volume : %d (%d-%d) p->fadeup_m = %d, p->msec_per_period = %d\n",
443 fade_volume.level[AVSYS_AUDIO_CHANNEL_LEFT],p->fadeup_vol,FADEUP_CALC_BIAS,
444 p->fadeup_multiplier, p->msec_per_period);
446 avsys_audio_logical_volume_convert(&fade_volume, &p->working_vol, &p->gain_setting);
447 avsys_audio_pasimple_set_volume(p, p->working_vol.level[AVSYS_AUDIO_CHANNEL_LEFT]);
448 if (p->fadeup_vol < -1) {
450 } else if (p->fadeup_vol == -1) {
451 p->mute = AVSYS_AUDIO_MUTE;
453 if (p->msec_per_period > 50)
454 p->fadeup_multiplier = 0;
456 p->fadeup_multiplier = FADE_DOWN_MULTIPLIER;
458 p->fadeup_multiplier--;
461 err = avsys_audio_pasimple_write(p, buf, size);
463 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_FAST);
469 int avsys_audio_set_volume_fadeup(avsys_handle_t handle)
471 int err = AVSYS_STATE_SUCCESS;
472 avsys_audio_handle_t *p = NULL;
474 avsys_warning(AVAUDIO, "%s\n", __func__);
476 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
478 if (p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT] >= p->setting_vol.level[AVSYS_AUDIO_CHANNEL_RIGHT]) {
479 p->fadeup_vol = p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT]; /* + FADEUP_CALC_BIAS */
481 p->fadeup_vol = p->setting_vol.level[AVSYS_AUDIO_CHANNEL_RIGHT]; /* + FADEUP_CALC_BIAS; */
483 p->fadeup_multiplier = 0;
485 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
491 int avsys_audio_set_mute_fadedown(avsys_handle_t handle)
493 int err = AVSYS_STATE_SUCCESS;
494 avsys_audio_handle_t *p = NULL;
496 avsys_warning(AVAUDIO, "%s\n", __func__);
498 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
500 if (p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT] >= p->setting_vol.level[AVSYS_AUDIO_CHANNEL_RIGHT]) {
501 p->fadeup_vol = (-1) * p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT];
503 p->fadeup_vol = (-1) * p->setting_vol.level[AVSYS_AUDIO_CHANNEL_RIGHT];
505 p->fadeup_multiplier = 0;
507 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
514 int avsys_audio_set_volume_table(int gain_type, int dev_type, int step, int lv, int rv)
516 int ret = avsys_audio_logical_volume_set_to_table(gain_type, dev_type, step, lv, rv);
517 avsys_audio_handle_t *ptr = NULL;
520 if (AVSYS_FAIL(ret)) {
524 while(++handle < AVSYS_AUDIO_HANDLE_MAX) {
527 if (AVSYS_SUCCESS(avsys_audio_handle_get_ptr(handle, &ptr, HANDLE_PTR_MODE_NORMAL))) {
528 avsys_audio_logical_volume_convert(&ptr->setting_vol, &ptr->working_vol, &ptr->gain_setting);
529 avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL);
532 return AVSYS_STATE_SUCCESS;
536 int avsys_audio_get_volume_table(int gain_type, int dev_type, int step, int *lv, int *rv)
538 return avsys_audio_logical_volume_get_from_table(gain_type, dev_type, step, lv, rv);
542 int avsys_audio_get_volume_max_ex(int volume_type, int *max_step)
544 int volume_table = 0;
545 if (max_step == NULL) {
546 return AVSYS_STATE_ERR_NULL_POINTER;
549 volume_table = volume_type;
551 return avsys_audio_logical_volume_get_max(volume_table, AVSYS_AUDIO_LVOL_DEV_TYPE_SPK, max_step);
555 int avsys_audio_set_mute(avsys_handle_t handle, int mute)
557 avsys_info(AVAUDIO, "%s\n", __func__);
559 if (mute > AVSYS_AUDIO_MUTE || mute < AVSYS_AUDIO_UNMUTE) {
560 return AVSYS_STATE_ERR_INVALID_PARAMETER;
563 if (AVSYS_FAIL(avsys_audio_handle_set_mute((int)handle, mute))) {
564 avsys_error(AVAUDIO, "failed to set handle mute\n");
567 return AVSYS_STATE_SUCCESS;
571 int avsys_audio_get_mute(avsys_handle_t handle, int *pmute)
573 int err = AVSYS_STATE_SUCCESS;
574 avsys_audio_handle_t *p = NULL;
576 avsys_info(AVAUDIO, "%s\n", __func__);
579 avsys_error(AVAUDIO, "pvolume is null\n");
580 return AVSYS_STATE_ERR_NULL_POINTER;
583 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
587 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
589 return AVSYS_STATE_SUCCESS;
593 * Option : AVSYS_AUDIO_PATH_OPTION_LEGACY_MODE support NowPlus style sound path function
594 * Option : AVSYS_AUDIO_PATH_OPTION_DUAL_OUT will effect only when out is speaker.
595 * Option : AVSYS_AUDIO_PATH_OPTION_JACK_AUTO will effect only when out is speaker or receiver.
596 * Option : AVSYS_AUDIO_PATH_OPTION_FORCED is avail only for shutdown animation
598 * Limitation : Only FORCED option can be used same time with other options (exclude LEGACY_MODE)
601 int avsys_audio_set_path_ex(int gain, int out, int in, int option)
603 if (AVSYS_AUDIO_GAIN_EX_KEYTONE > gain || AVSYS_AUDIO_GAIN_EX_MAX <= gain ||
604 AVSYS_AUDIO_PATH_EX_NONE > out || AVSYS_AUDIO_PATH_EX_OUTMAX <= out ||
605 AVSYS_AUDIO_PATH_EX_NONE > in || AVSYS_AUDIO_PATH_EX_INMAX <= in) {
606 avsys_error(AVAUDIO, "Your input parameter is invalid. Please check\n");
607 avsys_error(AVAUDIO, " gain %d, out %d, in %d\n", gain, out, in);
608 return AVSYS_STATE_ERR_INVALID_PARAMETER;
611 return avsys_audio_path_ex_set_path(gain, out, in, option);
614 int avsys_audio_get_path_ex(int *gain, int *out, int *in, int *option)
616 if (!gain || !out || !in || !option) {
617 avsys_warning(AVAUDIO, "Your input parameter is NULL pointer. Please check.\n");
618 avsys_warning(AVAUDIO, " gain %p, out %p, in %p, option %p\n", gain, out, in, option);
619 return AVSYS_STATE_ERR_INVALID_PARAMETER;
621 return avsys_audio_path_ex_get_path(gain, out, in, option);
625 int avsys_audio_set_global_mute(int mute)
627 int err = AVSYS_STATE_SUCCESS;
629 avsys_info(AVAUDIO, "%s : mute=%d\n", __func__, mute);
631 if (mute < AVSYS_AUDIO_UNMUTE && mute > AVSYS_AUDIO_MUTE_NOLOCK) {
632 err = AVSYS_STATE_ERR_INVALID_PARAMETER;
634 err = avsys_audio_path_ex_set_mute(mute);
640 int avsys_audio_get_global_mute(int *pmute)
642 int err = AVSYS_STATE_SUCCESS;
644 avsys_info(AVAUDIO, "%s\n", __func__);
646 err = AVSYS_STATE_ERR_NULL_POINTER;
648 err = avsys_audio_path_ex_get_mute(pmute);
654 * Internal functions implementation
657 static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *param)
659 avsys_info(AVAUDIO, "%s\n", __func__);
661 avsys_info(AVAUDIO, "=============================================\n");
662 avsys_info(AVAUDIO, " Input Parameters (Basic Information)\n");
663 avsys_info(AVAUDIO, "=============================================\n");
664 avsys_info(AVAUDIO, " Op Mode = %d (0:out, 1:input)\n", param->mode);
665 avsys_info(AVAUDIO, " format = %d (0: 8bits, 1:16bits, 2:32bits)\n", param->format);
666 avsys_info(AVAUDIO, " channel = %d\n", param->channels);
667 avsys_info(AVAUDIO, " samplerate = %d\n", param->samplerate);
668 avsys_info(AVAUDIO, " route = %d (0: default, 1: handset)\n", param->handle_route);
669 avsys_info(AVAUDIO, " Vol type = %d\n", param->vol_type);
670 avsys_info(AVAUDIO, "=============================================\n");
672 p->mode = param->mode;
673 p->channels = param->channels;
674 p->samplerate = param->samplerate;
675 p->format = param->format;
676 p->priority = param->priority;
678 if ((param->vol_type < 0) || (param->vol_type >= AVSYS_AUDIO_VOLUME_TYPE_MAX)) {
679 avsys_error(AVAUDIO, "[%s] Invalid volume type %d. use default system type\n", __func__, param->vol_type);
680 p->gain_setting.vol_type = AVSYS_AUDIO_VOLUME_TYPE_SYSTEM;
682 p->gain_setting.vol_type = param->vol_type;
685 /* trivial volume value */
686 p->setting_vol.level[AVSYS_AUDIO_CHANNEL_LEFT] = 0;
687 p->setting_vol.level[AVSYS_AUDIO_CHANNEL_RIGHT] = 0;
688 p->working_vol.level[AVSYS_AUDIO_CHANNEL_LEFT] = 0;
689 p->working_vol.level[AVSYS_AUDIO_CHANNEL_RIGHT] = 0;
692 return AVSYS_STATE_SUCCESS;
696 int avsys_audio_earjack_manager_init(int *earjack_type, int *waitfd)
698 return avsys_audio_path_earjack_init(earjack_type, waitfd);
702 int avsys_audio_earjack_manager_wait(int waitfd, int *current_earjack_type, int *new_earjack_type, int *need_mute)
704 return avsys_audio_path_earjack_wait(waitfd, current_earjack_type, new_earjack_type, need_mute);
708 int avsys_audio_earjack_manager_process(int new_earjack_type)
710 return avsys_audio_path_earjack_process(new_earjack_type);
714 int avsys_audio_earjack_manager_deinit(int waitfd)
716 return avsys_audio_path_earjack_deinit(waitfd);
720 int avsys_audio_earjack_manager_get_type(void)
722 return avsys_audio_path_earjack_get_type();
726 int avsys_audio_earjack_manager_unlock(void)
728 return avsys_audio_path_earjack_unlock();
732 int avsys_audio_set_route_policy(avsys_audio_route_policy_t route)
739 int avsys_audio_get_route_policy(avsys_audio_route_policy_t *route)
746 int avsys_audio_get_current_playing_volume_type(int *volume_type)
748 if (volume_type == NULL)
749 return AVSYS_STATE_ERR_NULL_POINTER;
750 return avsys_audio_handle_current_playing_volume_type(volume_type);
753 static inline int __avsys_audio_validate_volume(const int type, const int value)
758 case AVSYS_AUDIO_VOLUME_TYPE_CALL:
759 if (value >= LVOLUME_MAX_BASIC) {
763 case AVSYS_AUDIO_VOLUME_TYPE_ALARM:
764 case AVSYS_AUDIO_VOLUME_TYPE_RINGTONE:
765 case AVSYS_AUDIO_VOLUME_TYPE_NOTIFICATION:
766 case AVSYS_AUDIO_VOLUME_TYPE_SYSTEM:
767 case AVSYS_AUDIO_VOLUME_TYPE_MEDIA:
768 case AVSYS_AUDIO_VOLUME_TYPE_MEDIA_HL:
769 case AVSYS_AUDIO_VOLUME_TYPE_EXT_SYSTEM_JAVA:
770 if (value >= LVOLUME_MAX_MULTIMEDIA) {
774 case AVSYS_AUDIO_VOLUME_TYPE_EXT_SYSTEM_ANDROID:
775 if (value >= LVOLUME_MAX_SINGLE) {
787 int avsys_audio_set_volume_by_type(const int type, const int value)
789 if (type < 0 || type >= AVSYS_AUDIO_VOLUME_TYPE_MAX)
790 return AVSYS_STATE_ERR_INVALID_PARAMETER;
791 if (0 > __avsys_audio_validate_volume(type, value))
792 return AVSYS_STATE_ERR_INVALID_PARAMETER;
793 return avsys_audio_handle_update_volume_by_type(type, value);
797 int avsys_audio_set_primary_volume(const int pid, const int type)
799 return avsys_audio_handle_set_primary_volume_type(pid, type, AVSYS_AUDIO_PRIMARY_VOLUME_SET);
803 int avsys_audio_clear_primary_volume(const int pid)
805 return avsys_audio_handle_set_primary_volume_type(pid, 0, AVSYS_AUDIO_PRIMARY_VOLUME_CLEAR);
809 int avsys_audio_hibernation_reset(int *vol)
811 int err = AVSYS_STATE_SUCCESS;
812 err = avsys_audio_path_ex_reset(1);
813 if (AVSYS_FAIL(err)) {
814 avsys_error(AVAUDIO, "avsys_audio_path_ex_reset(forced) failed 0x%x\n", err);
818 err = avsys_audio_handle_reset(vol);
819 if (AVSYS_FAIL(err)) {
820 avsys_error(AVAUDIO, "avsys_audio_handle_reset() failed 0x%x\n", err);
827 int avsys_audio_delay(avsys_handle_t handle, int *delay)
829 int err = AVSYS_STATE_SUCCESS;
831 avsys_audio_handle_t *p = NULL;
833 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
835 err = avsys_audio_pasimple_delay(p, &frame_delay);
836 if (AVSYS_SUCCESS(err)) {
837 *delay = frame_delay;
840 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
846 int avsys_audio_reset(avsys_handle_t handle)
848 int err = AVSYS_STATE_SUCCESS;
849 avsys_audio_handle_t *p = NULL;
851 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
853 err = avsys_audio_pasimple_reset(p);
854 if (AVSYS_FAIL(err)) {
855 avsys_error(AVAUDIO, "avsys_audio_reset() failed, 0x%X\n", err);
858 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
865 int avsys_audio_get_period_buffer_time(avsys_handle_t handle, unsigned int *period_time, unsigned int *buffer_time)
867 int err = AVSYS_STATE_SUCCESS;
868 avsys_audio_handle_t *p = NULL;
869 unsigned int p_time = 0, b_time=0;
871 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
873 err = avsys_audio_pasimple_get_period_buffer_time(p, &p_time, &b_time);
874 if(AVSYS_FAIL(err)) {
875 avsys_error(AVAUDIO, "avsys_audio_get_period_buffer_time() failed, 0x%X\n",err);
879 *period_time = p_time;
880 *buffer_time = b_time;
881 avsys_info(AVAUDIO,"period time : %u, buffer_time : %u\n", p_time, b_time);
884 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
890 int avsys_audio_cork (avsys_handle_t handle, int cork)
892 int err = AVSYS_STATE_SUCCESS;
893 avsys_audio_handle_t *p = NULL;
895 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
897 err = avsys_audio_pasimple_cork(p, cork);
898 if(AVSYS_FAIL(err)) {
899 avsys_error(AVAUDIO, "avsys_audio_pasimple_cork() failed, 0x%X\n",err);
902 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
908 int avsys_audio_is_corked (avsys_handle_t handle, int *is_corked)
910 int err = AVSYS_STATE_SUCCESS;
911 avsys_audio_handle_t *p = NULL;
913 if (is_corked == NULL) {
914 return AVSYS_STATE_ERR_NULL_POINTER;
917 AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
919 err = avsys_audio_pasimple_is_corked(p, is_corked);
920 if(AVSYS_FAIL(err)) {
921 avsys_error(AVAUDIO, "avsys_audio_pasimple_cork() failed, 0x%X\n",err);
924 AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
930 int avsys_audio_get_capture_status(int *on_capture)
932 return avsys_audio_handle_current_capture_status(on_capture);
935 __attribute__ ((constructor))
936 void __init_module(void)
940 __attribute__ ((destructor))
941 void __fini_module(void)