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.
22 #if !defined(_MMFW_I386_ALL_SIMULATOR)
23 #include <alsa/ascenario.h>
27 #include "avsys-audio-ascenario.h"
28 #include "avsys-types.h"
29 #include "avsys-error.h"
30 #include "avsys-debug.h"
31 #if defined(TIME_CHECK)
36 #define STR_BUFF_MAX 128
39 #define CARD_NUMBER 0 /* ALSA card number */
41 static int __avsys_audio_ascn_make_scenario_str(int input, char *buf, int buf_len)
43 char fromStr[P_STR_MAX] = { 0, };
44 char toStr[P_STR_MAX] = { 0, };
45 char optStr[O_STR_MAX] = { 0, };
48 avsys_error(AVAUDIO, "Input Buf is null\n");
49 return AVSYS_STATE_ERR_NULL_POINTER;
52 if (input & INPUT_MAIN_MIC) {
53 strncpy(fromStr, "mainmic", sizeof(fromStr) - 1);
55 if (input & INPUT_SUB_MIC) {
56 strncpy(fromStr, "submic", sizeof(fromStr) - 1);
58 if (input & INPUT_STEREO_MIC) {
59 strncpy(fromStr, "stereomic", sizeof(fromStr) - 1);
61 if (input & INPUT_EAR_MIC) {
62 strncpy(fromStr, "earmic", sizeof(fromStr) - 1);
64 if (input & INPUT_BT_MIC) {
65 strncpy(fromStr, "bt", sizeof(fromStr) - 1);
67 if (input & INPUT_AP) {
68 strncpy(fromStr, "ap", sizeof(fromStr) - 1);
70 if (input & INPUT_CP) {
71 strncpy(fromStr, "cp", sizeof(fromStr) - 1);
73 if (input & INPUT_FMRADIO) {
74 strncpy(fromStr, "fmradio", sizeof(fromStr) - 1);
77 if (input & OUTPUT_HEADSET) {
78 strncpy(toStr, "headset", sizeof(toStr) - 1);
80 if (input & OUTPUT_LEFT_SPK) {
81 strncpy(toStr, "speaker_left", sizeof(toStr) - 1);
83 if (input & OUTPUT_RIGHT_SPK) {
84 strncpy(toStr, "speaker_right", sizeof(toStr) - 1);
86 if (input & OUTPUT_STEREO_SPK) {
87 strncpy(toStr, "speaker", sizeof(toStr) - 1);
89 if (input & OUTPUT_RECV) {
90 strncpy(toStr, "receiver", sizeof(toStr) - 1);
92 if (input & OUTPUT_BT_HEADSET) {
93 strncpy(toStr, "bt", sizeof(toStr) - 1);
95 if (input & OUTPUT_CP) {
96 strncpy(toStr, "cp", sizeof(toStr) - 1);
98 if (input & OUTPUT_AP) {
99 strncpy(toStr, "ap", sizeof(toStr) - 1);
101 if (input & OUTPUT_HDMI) {
102 strncpy(toStr, "hdmi", sizeof(toStr) - 1);
104 if (input & OUTPUT_DOCK) {
105 strncpy(toStr, "dock", sizeof(toStr) - 1);
107 if (input & GAIN_MODE) {
108 strncpy(optStr, "_gain", sizeof(optStr) - 1);
110 if (input & GAIN_VIDEO_CALL) {
111 strncpy(optStr, "_videocall_gain", sizeof(optStr) - 1);
113 if (input & GAIN_VOICE_CALL) {
114 strncpy(optStr, "_voicecall_gain", sizeof(optStr) - 1);
116 if (input & GAIN_CALLALERT) {
117 strncpy(optStr, "_ringtone_gain", sizeof(optStr) - 1);
120 snprintf(buf, buf_len - 1, "%s_to_%s%s", fromStr, toStr, optStr);
121 //avsys_info(AVAUDIO, "rslt str : %s\n", buf);
122 return AVSYS_STATE_SUCCESS;
125 int avsys_audio_ascn_bulk_set(int * bulk, int bulk_cnt, AscnResetType clear)
127 struct snd_scenario *scn = NULL;
128 int card = CARD_NUMBER;
130 char str_buf[STR_BUFF_MAX] = { 0, };
131 char reset_str[STR_BUFF_MAX] = { 0, };
132 int err = AVSYS_STATE_SUCCESS;
134 #if defined(TIME_CHECK)
135 struct timeval t_start, t_stop;
136 unsigned long check = 0;
139 avsys_info(AVAUDIO, "<< %s, clear = %d\n", __func__, clear);
141 if (clear < ASCN_RESET_NONE || clear > ASCN_RESET_MODEM) {
142 avsys_error_r(AVAUDIO, "invalid clear type %d\n", clear);
143 return AVSYS_STATE_ERR_RANGE_OVER;
147 avsys_error_r(AVAUDIO, "input bulk is null\n");
148 return AVSYS_STATE_ERR_NULL_POINTER;
151 avsys_error_r(AVAUDIO, "bulk_cnt is negative\n");
152 return AVSYS_STATE_ERR_RANGE_OVER;
155 /* Try to get card name from CARD_NUMBER. */
156 snd_card_get_name(card, &name);
157 #if defined(TIME_CHECK)
158 gettimeofday(&t_start, NULL);
161 scn = snd_scenario_open("default");
164 avsys_error(AVAUDIO, "snd_scenario_open() failed to open with default\n");
165 return AVSYS_STATE_ERR_INTERNAL;
168 scn = snd_scenario_open(name);
172 scn = snd_scenario_open("default");
175 avsys_error(AVAUDIO, "snd_scenario_open() failed to open with default\n");
176 return AVSYS_STATE_ERR_INTERNAL;
180 #if defined(TIME_CHECK)
181 gettimeofday(&t_stop, NULL);
182 if (t_stop.tv_sec == t_start.tv_sec)
183 check = (t_stop.tv_usec - t_start.tv_usec) / 1000;
185 check = (t_stop.tv_sec - t_start.tv_sec) * 1000 + (t_stop.tv_usec - t_start.tv_usec) / 1000;
186 avsys_warning(AVAUDIO, "[snd_scenario_open()] takes %u msec\n", check);
188 if (clear != ASCN_RESET_NONE) {
191 snprintf(reset_str, sizeof(reset_str) - 1, "%s", ASCN_STR_RESET);
193 case ASCN_RESET_PLAYBACK:
194 snprintf(reset_str, sizeof(reset_str) - 1, "%s", ASCN_STR_RESET_PLAYBACK);
196 case ASCN_RESET_CAPTURE:
197 snprintf(reset_str, sizeof(reset_str) - 1, "%s", ASCN_STR_RESET_CAPTURE);
200 #if defined(TIME_CHECK)
201 gettimeofday(&t_start, NULL);
203 err = snd_scenario_set_scn(scn, reset_str);
204 #if defined(TIME_CHECK)
205 gettimeofday(&t_stop, NULL);
206 if (t_stop.tv_sec == t_start.tv_sec)
207 check = (t_stop.tv_usec - t_start.tv_usec) / 1000;
209 check = (t_stop.tv_sec - t_start.tv_sec) * 1000 + (t_stop.tv_usec - t_start.tv_usec) / 1000;
210 avsys_warning(AVAUDIO, "[%s] takes %u msec\n", reset_str, check);
213 avsys_error(AVAUDIO, "Alsa sceanrio [%s] failed\n", reset_str);
215 avsys_warning(AVAUDIO, "Set [%s] success\n", reset_str);
219 for (i = 0; i < bulk_cnt; i++) {
222 memset(str_buf, '\0', sizeof(str_buf));
223 //avsys_info(AVAUDIO, "make string for 0x%X\n", bulk[i]);
224 __avsys_audio_ascn_make_scenario_str(bulk[i], str_buf, sizeof(str_buf));
225 //avsys_info(AVAUDIO, "result string [%s]\n", str_buf);
226 #if defined(TIME_CHECK)
227 gettimeofday(&t_start, NULL);
229 err = snd_scenario_set_scn(scn, str_buf);
230 #if defined(TIME_CHECK)
231 gettimeofday(&t_stop, NULL);
232 if (t_stop.tv_sec == t_start.tv_sec)
233 check = (t_stop.tv_usec - t_start.tv_usec) / 1000;
235 check = (t_stop.tv_sec - t_start.tv_sec) * 1000 + (t_stop.tv_usec - t_start.tv_usec) / 1000;
236 avsys_warning(AVAUDIO, "[%s] takes %u msec\n", str_buf, check);
239 avsys_error_r(AVAUDIO, "snd_scenario_set_scn(%s) failed with %d\n", str_buf, err);
242 avsys_warning(AVAUDIO, "* [0x%010X] Set [%s] success\n", bulk[i], str_buf);
246 #if defined(TIME_CHECK)
247 gettimeofday(&t_start, NULL);
249 snd_scenario_close(scn);
250 #if defined(TIME_CHECK)
251 gettimeofday(&t_stop, NULL);
252 if (t_stop.tv_sec == t_start.tv_sec)
253 check = (t_stop.tv_usec - t_start.tv_usec) / 1000;
255 check = (t_stop.tv_sec - t_start.tv_sec) * 1000 + (t_stop.tv_usec - t_start.tv_usec) / 1000;
256 avsys_warning(AVAUDIO, "[snd_scenario_close()] takes %u msec\n", check);
262 int avsys_audio_ascn_single_set(char * str)
264 struct snd_scenario *scn = NULL;
265 int card = CARD_NUMBER;
267 char cmd_str[STR_BUFF_MAX] = { 0, };
268 int err = AVSYS_STATE_SUCCESS;
269 #if defined(TIME_CHECK)
270 struct timeval t_start, t_stop;
271 unsigned long check = 0;
275 avsys_error_r(AVAUDIO, "input str is null\n");
276 return AVSYS_STATE_ERR_NULL_POINTER;
279 #if defined(TIME_CHECK)
280 gettimeofday(&t_start, NULL);
283 /* Try to get card name from CARD_NUMBER. */
284 snd_card_get_name(card, &name);
287 scn = snd_scenario_open("default");
290 avsys_error(AVAUDIO, "snd_scenario_open() failed to open with default\n");
291 return AVSYS_STATE_ERR_INTERNAL;
294 scn = snd_scenario_open(name);
298 scn = snd_scenario_open("default");
301 avsys_error(AVAUDIO, "snd_scenario_open() failed to open with default\n");
302 return AVSYS_STATE_ERR_INTERNAL;
308 strncpy(cmd_str, str, sizeof(cmd_str) - 1);
309 err = snd_scenario_set_scn(scn, str);
310 avsys_info(AVAUDIO, "alsa scenario set [%s]\n", str);
313 avsys_error(AVAUDIO, "snd_scenario_set(%s) failed\n", str);
316 /* Close scenario manager core */
317 snd_scenario_close(scn);
319 #if defined(TIME_CHECK)
320 gettimeofday(&t_stop, NULL);
321 if (t_stop.tv_sec == t_start.tv_sec)
322 check = (t_stop.tv_usec - t_start.tv_usec) / 1000;
324 check = (t_stop.tv_sec - t_start.tv_sec) * 1000 + (t_stop.tv_usec - t_start.tv_usec) / 1000;
325 avsys_warning(AVAUDIO, "[%s] takes %u msec\n", str, check);