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 #include <alsa/asoundlib.h>
24 #include "avsys-audio-alsa.h"
25 #include "avsys-types.h"
26 #include "avsys-error.h"
27 #include "avsys-debug.h"
29 #if defined(_MMFW_I386_ALL_SIMULATOR)
30 #define AIF_CP_DEVICE_NAME "default"
31 #define AIF_BT_DEVICE_NAME "default"
32 #define AIF_RADIO_DEVICE_NAME "default"
34 #define AIF_CP_DEVICE_NAME "AIF2"
35 #define AIF_BT_DEVICE_NAME "AIF3"
36 #define AIF_RADIO_DEVICE_NAME "AIF4"
39 int avsys_audio_alsa_open_AIF_device(aif_device_type_t aif_type, avsys_audio_alsa_aif_handle_t *handle)
41 snd_pcm_t *ahandle = NULL;
43 char dev_name[16] = { 0, };
44 snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK;
46 avsys_info(AVAUDIO, "%s\n", __func__);
48 return AVSYS_STATE_ERR_NULL_POINTER;
50 memset(dev_name, '\0', sizeof(dev_name));
53 strncpy(dev_name, AIF_CP_DEVICE_NAME, sizeof(dev_name) - 1);
54 stream = SND_PCM_STREAM_CAPTURE;
57 strncpy(dev_name, AIF_CP_DEVICE_NAME, sizeof(dev_name) - 1);
58 stream = SND_PCM_STREAM_PLAYBACK;
61 strncpy(dev_name, AIF_BT_DEVICE_NAME, sizeof(dev_name) - 1);
62 stream = SND_PCM_STREAM_CAPTURE;
65 strncpy(dev_name, AIF_BT_DEVICE_NAME, sizeof(dev_name) - 1);
66 stream = SND_PCM_STREAM_PLAYBACK;
68 case AIF_RADIO_PLAYBACK:
69 strncpy(dev_name, AIF_RADIO_DEVICE_NAME, sizeof(dev_name) - 1);
70 stream = SND_PCM_STREAM_PLAYBACK;
73 avsys_critical_r(AVAUDIO, "Invalid AIF device %d\n", aif_type);
74 return AVSYS_STATE_ERR_INVALID_MODE;
77 #if !defined(_MMFW_I386_ALL_SIMULATOR)
78 err = snd_pcm_open(&ahandle, dev_name, stream, 0);
80 avsys_warning_r(AVAUDIO, "Skip real device open in SDK\n");
81 err = 0; /* set fake return value */
85 avsys_error_r(AVAUDIO, "unable to open AIF device: %s\n", snd_strerror(err));
86 return AVSYS_STATE_ERR_INTERNAL;
89 handle->alsa_handle = (void *)ahandle;
90 handle->type = aif_type;
92 return AVSYS_STATE_SUCCESS;
95 int avsys_audio_alsa_close_AIF_device(avsys_audio_alsa_aif_handle_t* handle)
98 snd_pcm_t *ahandle = NULL;
100 avsys_info(AVAUDIO, "%s\n", __func__);
101 #if defined(_MMFW_I386_ALL_SIMULATOR)
102 avsys_warning(AVAUDIO, "Skip close call device in SDK");
103 return AVSYS_STATE_SUCCESS;
106 return AVSYS_STATE_ERR_NULL_POINTER;
108 ahandle = (snd_pcm_t *)handle->alsa_handle;
110 avsys_error_r(AVAUDIO, "[%s] alsa handle is null\n", __func__);
111 return AVSYS_STATE_ERR_NULL_POINTER;
114 err = snd_pcm_close(ahandle);
116 avsys_critical_r(AVAUDIO, "unable to close pcm device: %s\n", snd_strerror(err));
117 return AVSYS_STATE_ERR_INTERNAL;
120 handle->alsa_handle = NULL;
122 return AVSYS_STATE_SUCCESS;
125 int avsys_audio_alsa_set_AIF_params(avsys_audio_alsa_aif_handle_t *handle, aif_rate_t rate)
127 #if defined(_MMFW_I386_ALL_SIMULATOR)
128 return AVSYS_STATE_SUCCESS;
131 snd_pcm_t *ahandle = NULL;
132 snd_pcm_hw_params_t *params;
133 unsigned int val = 0;
136 avsys_info(AVAUDIO, "%s\n", __func__);
138 return AVSYS_STATE_ERR_NULL_POINTER;
140 ahandle = (snd_pcm_t *)handle->alsa_handle;
142 return AVSYS_STATE_ERR_NULL_POINTER;
144 /* Skip parameter setting to null device. */
145 if (snd_pcm_type(ahandle) == SND_PCM_TYPE_NULL)
146 return AVSYS_STATE_SUCCESS;
148 /* Allocate a hardware parameters object. */
149 snd_pcm_hw_params_alloca(¶ms);
150 /* Fill it in with default values. */
151 err = snd_pcm_hw_params_any(ahandle, params);
153 avsys_error_r(AVAUDIO, "snd_pcm_hw_params_any() : failed! - %s\n", snd_strerror(err));
154 return AVSYS_STATE_ERR_INTERNAL;
157 /* Set the desired hardware parameters. */
158 /* Interleaved mode */
159 err = snd_pcm_hw_params_set_access(ahandle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
161 avsys_error_r(AVAUDIO, "snd_pcm_hw_params_set_access() : failed! - %s\n", snd_strerror(err));
162 return AVSYS_STATE_ERR_INTERNAL;
165 if (rate == AIF_CONF_RATE) {
166 /* Auto rate by conf */
167 avsys_info(AVAUDIO, "Let rate by configuration\n");
169 /* Force input rate */
170 avsys_info(AVAUDIO, "Force rate (%d)\n", rate);
171 err = snd_pcm_hw_params_set_rate(ahandle, params, rate, 0);
173 avsys_error_r(AVAUDIO, "snd_pcm_hw_params_set_rate() : failed! - %s\n", snd_strerror(err));
174 return AVSYS_STATE_ERR_INTERNAL;
178 err = snd_pcm_hw_params(ahandle, params);
180 avsys_error_r(AVAUDIO, "snd_pcm_hw_params() : failed! - %s\n", snd_strerror(err));
181 return AVSYS_STATE_ERR_INTERNAL;
184 /* Dump current param */
185 snd_pcm_hw_params_get_access(params, (snd_pcm_access_t *) &val);
186 avsys_info(AVAUDIO, "access type = %s\n", snd_pcm_access_name((snd_pcm_access_t)val));
188 snd_pcm_hw_params_get_format(params, &val);
189 avsys_info(AVAUDIO, "format = '%s' (%s)\n",
190 snd_pcm_format_name((snd_pcm_format_t)val),
191 snd_pcm_format_description((snd_pcm_format_t)val));
193 snd_pcm_hw_params_get_subformat(params, (snd_pcm_subformat_t *)&val);
194 avsys_info(AVAUDIO, "subformat = '%s' (%s)\n",
195 snd_pcm_subformat_name((snd_pcm_subformat_t)val),
196 snd_pcm_subformat_description((snd_pcm_subformat_t)val));
198 snd_pcm_hw_params_get_channels(params, &val);
199 avsys_info(AVAUDIO, "channels = %d\n", val);
201 snd_pcm_hw_params_get_rate(params, &val, &dir);
202 avsys_info(AVAUDIO, "rate = %d(%d) Hz\n", val, dir);
204 /* Save current rate for later check */
207 return AVSYS_STATE_SUCCESS;
208 #endif /* _MMFW_I386_ALL_SIMULATOR */