Fix for new automake and 64 bit compatibility.
[platform/core/multimedia/avsystem.git] / avsys-audio-logical-volume.c
1 /*
2  * avsystem
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jonghyuk Choi <jhchoi.choi@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <iniparser.h>
26 #include "avsys-audio-logical-volume.h"
27 #include "avsys-audio-shm.h"
28 #include "avsys-error.h"
29 #include "avsys-debug.h"
30
31 /* {TYPE, {MAXLEN, {MAXLEN, SPK{L,R}...}, {MAXLEN, RECV {L,R}...}, {MAXLEN, HEADSET{L,R}...}, {MAXLEN, BT{L,R}...}}} */
32 static const avsys_audio_lvol_volume_info_t g_volume_table[AVSYS_AUDIO_LVOL_GAIN_TYPE_MAX] = {
33         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_0 */ /* system : 0~15, default : 5 */
34         {
35                 {
36                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{19000,19000}}, {{22323,22323}}, {{25647,25647}}, {{28971,28971}}, {{32295,32295}}, {{35619,35619}}, {{38943,38943}}, {{42267,42267}}, {{45591,45591}}, {{48915,48915}}, {{52239,52239}}, {{55563,55563}}, {{58887,58887}}, {{62211,62211}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
37                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
38                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
39                 },
40         },
41         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_1 */ /* notification : 0~15, default : 7 */
42         {
43                 {
44                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{19000,19000}}, {{22323,22323}}, {{25647,25647}}, {{28971,28971}}, {{32295,32295}}, {{35619,35619}}, {{38943,38943}}, {{42267,42267}}, {{45591,45591}}, {{48915,48915}}, {{52239,52239}}, {{55563,55563}}, {{58887,58887}}, {{62211,62211}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
45                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
46                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
47                 },
48         },
49         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_2 */ /* alarm : 0~15, default : 7 */
50         {
51                 {
52                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{19000,19000}}, {{22323,22323}}, {{25647,25647}}, {{28971,28971}}, {{32295,32295}}, {{35619,35619}}, {{38943,38943}}, {{42267,42267}}, {{45591,45591}}, {{48915,48915}}, {{52239,52239}}, {{55563,55563}}, {{58887,58887}}, {{62211,62211}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
53                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
54                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
55                 },
56         },
57         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_3 */ /* ringtone : 0~15, default : 13 */
58         {
59                 {
60                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{19000,19000}}, {{22323,22323}}, {{25647,25647}}, {{28971,28971}}, {{32295,32295}}, {{35619,35619}}, {{38943,38943}}, {{42267,42267}}, {{45591,45591}}, {{48915,48915}}, {{52239,52239}}, {{55563,55563}}, {{58887,58887}}, {{62211,62211}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
61                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
62                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
63                 },
64         },
65         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_4 */ /* media */
66         {
67                 {
68                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{19000,19000}}, {{22323,22323}}, {{25647,25647}}, {{28971,28971}}, {{32295,32295}}, {{35619,35619}}, {{38943,38943}}, {{42267,42267}}, {{45591,45591}}, {{48915,48915}}, {{52239,52239}}, {{55563,55563}}, {{58887,58887}}, {{62211,62211}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
69                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
70                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
71                 },
72         },
73         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_5 */ /* call */
74         {
75                 {
76                         {LVOLUME_MAX_BASIC, {{{0,0}}, {{19000,19000}}, {{25991,25991}}, {{32982,32982}}, {{39973,39973}}, {{46964,46964}}, {{53955,53955}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
77                         {LVOLUME_MAX_BASIC, {{{0,0}}, {{20480,20480}}, {{27225,27225}}, {{33969,33969}}, {{40714,40714}}, {{47458,47458}}, {{54203,54203}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
78                         {LVOLUME_MAX_BASIC, {{{0,0}}, {{20480,20480}}, {{27225,27225}}, {{33969,33969}}, {{40714,40714}}, {{47458,47458}}, {{54203,54203}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
79                 },
80         },
81         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_6 */ /* voip */
82         {
83                 {
84                         {LVOLUME_MAX_BASIC, {{{0,0}}, {{19000,19000}}, {{25991,25991}}, {{32982,32982}}, {{39973,39973}}, {{46964,46964}}, {{53955,53955}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
85                         {LVOLUME_MAX_BASIC, {{{0,0}}, {{20480,20480}}, {{27225,27225}}, {{33969,33969}}, {{40714,40714}}, {{47458,47458}}, {{54203,54203}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
86                         {LVOLUME_MAX_BASIC, {{{0,0}}, {{20480,20480}}, {{27225,27225}}, {{33969,33969}}, {{40714,40714}}, {{47458,47458}}, {{54203,54203}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}, {{60947,60947}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
87                 },
88         },
89         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_7 */ /* fixed */
90         {
91                 {
92                         {LVOLUME_MAX_SINGLE, {{{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
93                         {LVOLUME_MAX_SINGLE, {{{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
94                         {LVOLUME_MAX_SINGLE, {{{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
95                 },
96         },
97         /* AVSYS_AUDIO_LVOL_GAIN_TYPE_8 */ /* java */
98         {
99                 {
100                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{19000,19000}}, {{22323,22323}}, {{25647,25647}}, {{28971,28971}}, {{32295,32295}}, {{35619,35619}}, {{38943,38943}}, {{42267,42267}}, {{45591,45591}}, {{48915,48915}}, {{52239,52239}}, {{55563,55563}}, {{58887,58887}}, {{62211,62211}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
101                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
102                         {LVOLUME_MAX_MULTIMEDIA, {{{0,0}}, {{20480,20480}}, {{23698,23698}}, {{26916,26916}}, {{30135,30135}}, {{33353,33353}}, {{36571,36571}}, {{39789,39789}}, {{43008,43008}}, {{46226,46226}}, {{49444,49444}}, {{52662,52662}}, {{55880,55880}}, {{59099,59099}}, {{62317,62317}}, {{65535,65535}}}}, /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
103                 },
104         },
105 };
106
107 static const avsys_audio_lvol_gain_info_t g_gain_table[AVSYS_AUDIO_LVOL_GAIN_EXT_TYPE_MAX_IDX] = {
108         /* AVSYS_AUDIO_LVOL_GAIN_EXT_DIALER */
109         { 1.0, 1.0, 1.0 },
110         /* AVSYS_AUDIO_LVOL_GAIN_EXT_TOUCH */
111         { 1.0, 1.0, 1.0 },
112         /* AVSYS_AUDIO_LVOL_GAIN_EXT_AF */
113         { 1.0, 1.0, 1.0 },
114         /* AVSYS_AUDIO_LVOL_GAIN_EXT_SHUTTER1 */
115         { 1.0, 1.0, 1.0 },
116         /* AVSYS_AUDIO_LVOL_GAIN_EXT_SHUTTER2 */
117         { 1.0, 1.0, 1.0 },
118         /* AVSYS_AUDIO_LVOL_GAIN_EXT_CAMCORDING */
119         { 1.0, 1.0, 1.0 },
120         /* AVSYS_AUDIO_LVOL_GAIN_EXT_MIDI */
121         { 1.0, 1.0, 1.0 },
122         /* AVSYS_AUDIO_LVOL_GAIN_EXT_BOOTING */
123         { 1.0, 1.0, 1.0 },
124         /* AVSYS_AUDIO_LVOL_GAIN_EXT_VIDEO */
125         { 1.0, 1.0, 1.0 },
126         /* AVSYS_AUDIO_LVOL_GAIN_EXT_VIDEO_HDMI */
127         { 1.0, 1.0, 1.0 },
128 };
129
130 int avsys_audio_logical_volume_get_max(int volume_type, int dev_type, int *max_level)
131 {
132         void **data = NULL;
133         avsys_audio_lvol_info_t *info = NULL;
134         avsys_audio_lvol_volume_info_t *volume_table;
135
136         data = (void **)&info;
137         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
138                 avsys_error(AVAUDIO, "attach shared memory failed\n");
139                 return AVSYS_STATE_ERR_ALLOCATION;
140         }
141         volume_table = info->volume_table;
142
143         if ((max_level == NULL)
144                 || (volume_type < 0 || volume_type >= AVSYS_AUDIO_LVOL_GAIN_TYPE_MAX)
145                 || (dev_type < 0 || dev_type >= AVSYS_AUDIO_LVOL_DEV_TYPE_MAX)) {
146                 avsys_error(AVAUDIO, "Input param wrong. Please check params\n\t type %d\n\tdevicetype %d\n",
147                                         volume_type, dev_type);
148                 return AVSYS_STATE_ERR_INVALID_PARAMETER;
149         }
150
151         *max_level = volume_table[volume_type].devices[dev_type].max_level;
152         return AVSYS_STATE_SUCCESS;
153 }
154
155 int avsys_audio_logical_volume_set_table(int volume_config, int dev_type, avsys_audio_volume_setting_t *setting)
156 {
157         void **data = NULL;
158         avsys_audio_lvol_info_t *info = NULL;
159         avsys_audio_lvol_volume_info_t *volume_table;
160         int vol_conf_type, vol_conf_gain;
161
162         data = (void**)&info;
163         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
164                 avsys_error(AVAUDIO, "attach shared memory failed\n");
165                 return AVSYS_STATE_ERR_ALLOCATION;
166         }
167         volume_table = info->volume_table;
168         vol_conf_type = AVSYS_AUDIO_VOLUME_CONFIG_TYPE(volume_config);
169         vol_conf_gain = AVSYS_AUDIO_VOLUME_CONFIG_GAIN(volume_config);
170
171         avsys_info(AVAUDIO, "Set Logical volume table\n");
172         avsys_info(AVAUDIO, "\t vol_type %d vol_gain %x dev_type %d\n", vol_conf_type, vol_conf_gain, dev_type);
173
174         if (setting == NULL) {
175                 avsys_error(AVAUDIO, "setting is null in %s\n", __func__);
176                 return AVSYS_STATE_ERR_NULL_POINTER;
177         }
178         if ((vol_conf_type < 0 || vol_conf_type >= AVSYS_AUDIO_LVOL_GAIN_TYPE_MAX)
179                 || (dev_type < 0 || dev_type >= AVSYS_AUDIO_LVOL_DEV_TYPE_MAX)) {
180                 avsys_error(AVAUDIO, "Input param wrong. Please check params\n\ttype %d\n\tdevicetype %d\n",
181                                         vol_conf_type, dev_type);
182                 return AVSYS_STATE_ERR_INVALID_PARAMETER;
183         }
184
185         setting->volume_config = volume_config;
186         setting->dev_type = dev_type;
187         setting->max_level = volume_table[vol_conf_type].devices[dev_type].max_level;
188
189         avsys_info(AVAUDIO, "vol %d, dev%d table setted.\n", vol_conf_type, dev_type);
190         return AVSYS_STATE_SUCCESS;
191 }
192
193 int avsys_audio_logical_volume_update_table(int dev_type, avsys_audio_volume_setting_t *setting)
194 {
195         void **data = NULL;
196         avsys_audio_lvol_info_t *info = NULL;
197         avsys_audio_lvol_volume_info_t *volume_table;
198         int vol_conf_type;
199
200         if (setting == NULL) {
201                 avsys_error(AVAUDIO, "setting is null in %s\n", __func__);
202                 return AVSYS_STATE_ERR_NULL_POINTER;
203         }
204         if (dev_type < 0 || dev_type >= AVSYS_AUDIO_LVOL_DEV_TYPE_MAX) {
205                 avsys_error(AVAUDIO, "Input param wrong. Please check params\tdevicetype %d\n", dev_type);
206                 return AVSYS_STATE_ERR_INVALID_PARAMETER;
207         }
208
209         data = (void **)&info;
210         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
211                 avsys_error(AVAUDIO, "attach shared memory failed\n");
212                 return AVSYS_STATE_ERR_ALLOCATION;
213         }
214         volume_table = info->volume_table;
215         vol_conf_type = AVSYS_AUDIO_VOLUME_CONFIG_TYPE(setting->volume_config);
216
217         avsys_info(AVAUDIO, "Update Logical volume table\n");
218         avsys_info(AVAUDIO, "\t dev_type %d\n", dev_type);
219
220         setting->dev_type = dev_type;
221         setting->max_level = volume_table[vol_conf_type].devices[dev_type].max_level;
222
223         return AVSYS_STATE_SUCCESS;
224 }
225
226 int avsys_audio_logical_volume_convert(avsys_audio_volume_t *level, avsys_audio_volume_t *converted, avsys_audio_volume_setting_t *setting)
227 {
228         void **data = NULL;
229         avsys_audio_lvol_info_t *info = NULL;
230         avsys_audio_lvol_volume_info_t *volume_table;
231         avsys_audio_lvol_gain_info_t *gain_table;
232         int vol_conf_type, vol_conf_gain, volume_gain_idx;
233
234         data = (void **)&info;
235         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
236                 avsys_error(AVAUDIO, "attach shared memory failed\n");
237                 return AVSYS_STATE_ERR_ALLOCATION;
238         }
239         volume_table = info->volume_table;
240         gain_table = info->gain_table;
241         vol_conf_type = AVSYS_AUDIO_VOLUME_CONFIG_TYPE(setting->volume_config);
242         vol_conf_gain = AVSYS_AUDIO_VOLUME_CONFIG_GAIN(setting->volume_config);
243         volume_gain_idx = AVSYS_AUDIO_VOLUME_GAIN_IDX(vol_conf_gain);
244
245         if (level == NULL) {
246                 avsys_error(AVAUDIO, "level is null in %s\n", __func__);
247                 return AVSYS_STATE_ERR_NULL_POINTER;
248         }
249         if ((level->level[AVSYS_AUDIO_CHANNEL_LEFT] < 0 || level->level[AVSYS_AUDIO_CHANNEL_LEFT] >= setting->max_level)
250                 || (level->level[AVSYS_AUDIO_CHANNEL_RIGHT] < 0 || level->level[AVSYS_AUDIO_CHANNEL_RIGHT] >= setting->max_level)) {
251                 avsys_error(AVAUDIO, "Input param wrong. Please check params\n\t level %d %d\n", level->level[AVSYS_AUDIO_CHANNEL_LEFT], level->level[AVSYS_AUDIO_CHANNEL_RIGHT]);
252                 return AVSYS_STATE_ERR_INVALID_VALUE;
253         }
254
255         converted->level[AVSYS_AUDIO_CHANNEL_LEFT] = volume_table[vol_conf_type].devices[setting->dev_type].logical_values[level->level[AVSYS_AUDIO_CHANNEL_LEFT]].level[AVSYS_AUDIO_CHANNEL_LEFT];
256         converted->level[AVSYS_AUDIO_CHANNEL_RIGHT] = volume_table[vol_conf_type].devices[setting->dev_type].logical_values[level->level[AVSYS_AUDIO_CHANNEL_RIGHT]].level[AVSYS_AUDIO_CHANNEL_RIGHT];
257
258         if (volume_gain_idx >= 0) {
259                 converted->level[AVSYS_AUDIO_CHANNEL_LEFT] *= gain_table[volume_gain_idx].devices[setting->dev_type];
260                 converted->level[AVSYS_AUDIO_CHANNEL_RIGHT] *= gain_table[volume_gain_idx].devices[setting->dev_type];
261         }
262
263         avsys_warning(AVAUDIO, "Volume converted vol_type %d vol_gain %x dev_type %d\n", vol_conf_type, vol_conf_gain, setting->dev_type);
264         avsys_warning(AVAUDIO, "\tL: %d to %d\n", level->level[AVSYS_AUDIO_CHANNEL_LEFT], converted->level[AVSYS_AUDIO_CHANNEL_LEFT]);
265         avsys_warning(AVAUDIO, "\tR: %d to %d\n", level->level[AVSYS_AUDIO_CHANNEL_RIGHT], converted->level[AVSYS_AUDIO_CHANNEL_RIGHT]);
266
267         return AVSYS_STATE_SUCCESS;
268 }
269
270 int avsys_audio_logical_volume_init(void)
271 {
272         void **data = NULL;
273         avsys_audio_lvol_info_t *info = NULL;
274
275         data = (void **)&info;
276         avsys_audio_create_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME);
277         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
278                 avsys_error(AVAUDIO, "attach shared memory failed\n");
279                 return AVSYS_STATE_ERR_ALLOCATION;
280         }
281
282         memcpy(info->volume_table, g_volume_table, sizeof(avsys_audio_lvol_volume_info_t) * AVSYS_AUDIO_LVOL_GAIN_TYPE_MAX);
283         memcpy(info->gain_table, g_gain_table, sizeof(avsys_audio_lvol_gain_info_t) * AVSYS_AUDIO_LVOL_GAIN_EXT_TYPE_MAX_IDX);
284
285         if (AVSYS_FAIL(avsys_audio_load_volume_from_ini())) {
286                 avsys_error(AVAUDIO, "Loading volume table from file failed. use default table\n");
287         }
288
289         return AVSYS_STATE_SUCCESS;
290 }
291
292 int avsys_audio_logical_volume_set_to_table(int volume_type, int dev_type, int step, int lv, int rv)
293 {
294         void **data = NULL;
295         avsys_audio_lvol_info_t *info = NULL;
296         avsys_audio_lvol_volume_info_t *volume_table;
297
298         data = (void **)&info;
299         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
300                 avsys_error(AVAUDIO, "attach shared memory failed\n");
301                 return AVSYS_STATE_ERR_ALLOCATION;
302         }
303         volume_table = info->volume_table;
304
305         volume_table[volume_type].devices[dev_type].logical_values[step].level[AVSYS_AUDIO_CHANNEL_LEFT] = lv;
306         volume_table[volume_type].devices[dev_type].logical_values[step].level[AVSYS_AUDIO_CHANNEL_RIGHT] = rv;
307         return AVSYS_STATE_SUCCESS;
308 }
309
310 int avsys_audio_logical_volume_get_from_table(int volume_type, int dev_type, int step, int *lv, int *rv)
311 {
312         void **data = NULL;
313         avsys_audio_lvol_info_t *info = NULL;
314         avsys_audio_lvol_volume_info_t *volume_table;
315
316         data = (void **)&info;
317         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
318                 avsys_error(AVAUDIO, "attach shared memory failed\n");
319                 return AVSYS_STATE_ERR_ALLOCATION;
320         }
321         volume_table = info->volume_table;
322
323         *lv = volume_table[volume_type].devices[dev_type].logical_values[step].level[AVSYS_AUDIO_CHANNEL_LEFT];
324         *rv = volume_table[volume_type].devices[dev_type].logical_values[step].level[AVSYS_AUDIO_CHANNEL_RIGHT];
325
326         return AVSYS_STATE_SUCCESS;
327 }
328
329 int avsys_audio_logical_volume_set_gain_to_table(int volume_gain_idx, int dev_type, float lv, float rv)
330 {
331         void **data = NULL;
332         avsys_audio_lvol_info_t *info = NULL;
333         avsys_audio_lvol_gain_info_t *gain_table;
334
335         data = (void **)&info;
336         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
337                 avsys_error(AVAUDIO, "attach shared memory failed\n");
338                 return AVSYS_STATE_ERR_ALLOCATION;
339         }
340         gain_table = info->gain_table;
341
342         gain_table[volume_gain_idx].devices[dev_type] = lv;
343         gain_table[volume_gain_idx].devices[dev_type] = rv;
344
345         return AVSYS_STATE_SUCCESS;
346 }
347
348 int avsys_audio_logical_volume_get_gain_from_table(int volume_gain_idx, int dev_type, float *lv, float *rv)
349 {
350         void **data = NULL;
351         avsys_audio_lvol_info_t *info = NULL;
352         avsys_audio_lvol_gain_info_t *gain_table;
353
354         data = (void **)&info;
355         if (AVSYS_FAIL(avsys_audio_get_shm(AVSYS_AUDIO_SHM_IDEN_LVOLUME, data))) {
356                 avsys_error(AVAUDIO, "attach shared memory failed\n");
357                 return AVSYS_STATE_ERR_ALLOCATION;
358         }
359         gain_table = info->gain_table;
360
361         *lv = gain_table[volume_gain_idx].devices[dev_type];
362         *rv = gain_table[volume_gain_idx].devices[dev_type];
363
364         return AVSYS_STATE_SUCCESS;
365 }
366
367 int avsys_audio_load_volume_from_ini(void)
368 {
369         const char *dev_str[] = {
370                 "speaker",              /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
371                 "headset",              /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
372                 "btheadset"             /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
373         };
374         const char *vol_type_str[] = {
375                 "system",               /* AVSYS_AUDIO_LVOL_GAIN_TYPE_0 */
376                 "notification", /* AVSYS_AUDIO_LVOL_GAIN_TYPE_1 */
377                 "alarm",                /* AVSYS_AUDIO_LVOL_GAIN_TYPE_2 */
378                 "ringtone",             /* AVSYS_AUDIO_LVOL_GAIN_TYPE_3 */
379                 "media",                /* AVSYS_AUDIO_LVOL_GAIN_TYPE_4 */
380                 "call"                  /* AVSYS_AUDIO_LVOL_GAIN_TYPE_5 */
381         };
382         dictionary * dict = NULL;
383         int dev_idx, vol_type_idx, dev_cnt, vol_type_cnt;
384
385         dict = iniparser_load(AVSYS_VOLUME_INI_DEFAULT_PATH);
386         if (!dict) {
387                 avsys_info(AVAUDIO, "Use temporary volume ini file");
388                 dict = iniparser_load(AVSYS_VOLUME_INI_TEMP_PATH);
389                 if (!dict) {
390                         avsys_warning(AVAUDIO, "Loading volume table from ini file failed");
391                         return AVSYS_STATE_ERR_INTERNAL;
392                 }
393         }
394
395         dev_cnt = sizeof(dev_str) / sizeof(char *);
396         vol_type_cnt = sizeof(vol_type_str) / sizeof(char *);
397
398         for (dev_idx = 0; dev_idx < dev_cnt; dev_idx++) {
399                 const char delimiter[] = ", ";
400                 char *key, *list_str, *token, *ptr = NULL;
401                 int vol_gain_idx = 0;
402                 float gain_value = 1.0f;
403
404                 /* Get volume table */
405                 for (vol_type_idx = 0; vol_type_idx < vol_type_cnt; vol_type_idx++) {
406                         int step_idx = 0, volume_value;
407
408                         key = malloc(strlen(dev_str[dev_idx]) + strlen(vol_type_str[vol_type_idx]) + 2);
409                         if (key) {
410                                 sprintf(key, "%s:%s", dev_str[dev_idx], vol_type_str[vol_type_idx]);
411                                 list_str = iniparser_getstr(dict, key);
412                                 if (list_str) {
413                                         token = strtok_r(list_str, delimiter, &ptr);
414                                         while (token) {
415                                                 volume_value = atoi(token);
416                                                 avsys_audio_logical_volume_set_to_table(vol_type_idx, dev_idx, step_idx++, volume_value, volume_value);
417                                                 token = strtok_r(NULL, delimiter, &ptr);
418                                         }
419                                 }
420                                 free(key);
421                         }
422                 }
423
424                 /* Get gain table */
425                 key = malloc(strlen(dev_str[dev_idx]) + strlen("gain") + 2);
426                 if (key) {
427                         sprintf(key, "%s:gain", dev_str[dev_idx]);
428                         list_str = iniparser_getstr(dict, key);
429                         if (list_str) {
430                                 token = strtok_r(list_str, delimiter, &ptr);
431                                 while (token) {
432                                         gain_value = (float)atof(token);
433                                         avsys_audio_logical_volume_set_gain_to_table(vol_gain_idx++, dev_idx, gain_value, gain_value);
434                                         token = strtok_r(NULL, delimiter, &ptr);
435                                 }
436                         }
437                         free(key);
438                 }
439         }
440
441         iniparser_freedict(dict);
442         return AVSYS_STATE_SUCCESS;
443 }