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.
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"
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 */
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 */
41 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_1 */ /* notification : 0~15, default : 7 */
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 */
49 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_2 */ /* alarm : 0~15, default : 7 */
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 */
57 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_3 */ /* ringtone : 0~15, default : 13 */
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 */
65 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_4 */ /* media */
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 */
73 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_5 */ /* call */
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 */
81 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_6 */ /* voip */
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 */
89 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_7 */ /* fixed */
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 */
97 /* AVSYS_AUDIO_LVOL_GAIN_TYPE_8 */ /* java */
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 */
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 */
110 /* AVSYS_AUDIO_LVOL_GAIN_EXT_TOUCH */
112 /* AVSYS_AUDIO_LVOL_GAIN_EXT_AF */
114 /* AVSYS_AUDIO_LVOL_GAIN_EXT_SHUTTER1 */
116 /* AVSYS_AUDIO_LVOL_GAIN_EXT_SHUTTER2 */
118 /* AVSYS_AUDIO_LVOL_GAIN_EXT_CAMCORDING */
120 /* AVSYS_AUDIO_LVOL_GAIN_EXT_MIDI */
122 /* AVSYS_AUDIO_LVOL_GAIN_EXT_BOOTING */
124 /* AVSYS_AUDIO_LVOL_GAIN_EXT_VIDEO */
126 /* AVSYS_AUDIO_LVOL_GAIN_EXT_VIDEO_HDMI */
130 int avsys_audio_logical_volume_get_max(int volume_type, int dev_type, int *max_level)
133 avsys_audio_lvol_info_t *info = NULL;
134 avsys_audio_lvol_volume_info_t *volume_table;
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;
141 volume_table = info->volume_table;
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;
151 *max_level = volume_table[volume_type].devices[dev_type].max_level;
152 return AVSYS_STATE_SUCCESS;
155 int avsys_audio_logical_volume_set_table(int volume_config, int dev_type, avsys_audio_volume_setting_t *setting)
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;
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;
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);
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);
174 if (setting == NULL) {
175 avsys_error(AVAUDIO, "setting is null in %s\n", __func__);
176 return AVSYS_STATE_ERR_NULL_POINTER;
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;
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;
189 avsys_info(AVAUDIO, "vol %d, dev%d table setted.\n", vol_conf_type, dev_type);
190 return AVSYS_STATE_SUCCESS;
193 int avsys_audio_logical_volume_update_table(int dev_type, avsys_audio_volume_setting_t *setting)
196 avsys_audio_lvol_info_t *info = NULL;
197 avsys_audio_lvol_volume_info_t *volume_table;
200 if (setting == NULL) {
201 avsys_error(AVAUDIO, "setting is null in %s\n", __func__);
202 return AVSYS_STATE_ERR_NULL_POINTER;
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;
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;
214 volume_table = info->volume_table;
215 vol_conf_type = AVSYS_AUDIO_VOLUME_CONFIG_TYPE(setting->volume_config);
217 avsys_info(AVAUDIO, "Update Logical volume table\n");
218 avsys_info(AVAUDIO, "\t dev_type %d\n", dev_type);
220 setting->dev_type = dev_type;
221 setting->max_level = volume_table[vol_conf_type].devices[dev_type].max_level;
223 return AVSYS_STATE_SUCCESS;
226 int avsys_audio_logical_volume_convert(avsys_audio_volume_t *level, avsys_audio_volume_t *converted, avsys_audio_volume_setting_t *setting)
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;
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;
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);
246 avsys_error(AVAUDIO, "level is null in %s\n", __func__);
247 return AVSYS_STATE_ERR_NULL_POINTER;
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;
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];
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];
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]);
267 return AVSYS_STATE_SUCCESS;
270 int avsys_audio_logical_volume_init(void)
273 avsys_audio_lvol_info_t *info = NULL;
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;
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);
285 if (AVSYS_FAIL(avsys_audio_load_volume_from_ini())) {
286 avsys_error(AVAUDIO, "Loading volume table from file failed. use default table\n");
289 return AVSYS_STATE_SUCCESS;
292 int avsys_audio_logical_volume_set_to_table(int volume_type, int dev_type, int step, int lv, int rv)
295 avsys_audio_lvol_info_t *info = NULL;
296 avsys_audio_lvol_volume_info_t *volume_table;
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;
303 volume_table = info->volume_table;
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;
310 int avsys_audio_logical_volume_get_from_table(int volume_type, int dev_type, int step, int *lv, int *rv)
313 avsys_audio_lvol_info_t *info = NULL;
314 avsys_audio_lvol_volume_info_t *volume_table;
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;
321 volume_table = info->volume_table;
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];
326 return AVSYS_STATE_SUCCESS;
329 int avsys_audio_logical_volume_set_gain_to_table(int volume_gain_idx, int dev_type, float lv, float rv)
332 avsys_audio_lvol_info_t *info = NULL;
333 avsys_audio_lvol_gain_info_t *gain_table;
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;
340 gain_table = info->gain_table;
342 gain_table[volume_gain_idx].devices[dev_type] = lv;
343 gain_table[volume_gain_idx].devices[dev_type] = rv;
345 return AVSYS_STATE_SUCCESS;
348 int avsys_audio_logical_volume_get_gain_from_table(int volume_gain_idx, int dev_type, float *lv, float *rv)
351 avsys_audio_lvol_info_t *info = NULL;
352 avsys_audio_lvol_gain_info_t *gain_table;
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;
359 gain_table = info->gain_table;
361 *lv = gain_table[volume_gain_idx].devices[dev_type];
362 *rv = gain_table[volume_gain_idx].devices[dev_type];
364 return AVSYS_STATE_SUCCESS;
367 int avsys_audio_load_volume_from_ini(void)
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 */
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 */
382 dictionary * dict = NULL;
383 int dev_idx, vol_type_idx, dev_cnt, vol_type_cnt;
385 dict = iniparser_load(AVSYS_VOLUME_INI_DEFAULT_PATH);
387 avsys_info(AVAUDIO, "Use temporary volume ini file");
388 dict = iniparser_load(AVSYS_VOLUME_INI_TEMP_PATH);
390 avsys_warning(AVAUDIO, "Loading volume table from ini file failed");
391 return AVSYS_STATE_ERR_INTERNAL;
395 dev_cnt = sizeof(dev_str) / sizeof(char *);
396 vol_type_cnt = sizeof(vol_type_str) / sizeof(char *);
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;
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;
408 key = malloc(strlen(dev_str[dev_idx]) + strlen(vol_type_str[vol_type_idx]) + 2);
410 sprintf(key, "%s:%s", dev_str[dev_idx], vol_type_str[vol_type_idx]);
411 list_str = iniparser_getstr(dict, key);
413 token = strtok_r(list_str, delimiter, &ptr);
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);
425 key = malloc(strlen(dev_str[dev_idx]) + strlen("gain") + 2);
427 sprintf(key, "%s:gain", dev_str[dev_idx]);
428 list_str = iniparser_getstr(dict, key);
430 token = strtok_r(list_str, delimiter, &ptr);
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);
441 iniparser_freedict(dict);
442 return AVSYS_STATE_SUCCESS;