4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
24 #include "tizen-audio-internal.h"
26 int audio_get_revision (void)
28 return AUDIO_REVISION;
31 audio_return_t audio_init (void **userdata, void *platform_data)
34 audio_return_t ret = AUDIO_RET_OK;
36 if (!(am = malloc(sizeof(audio_mgr_t)))) {
37 AUDIO_LOG_ERROR("am malloc failed");
38 return AUDIO_ERR_RESOURCE;
40 am->platform_data = platform_data;
41 memset(&am->cb_intf, 0, sizeof(audio_cb_interface_t));
42 if (AUDIO_IS_ERROR((ret = _audio_device_init(am)))) {
43 AUDIO_LOG_ERROR("device init failed");
46 if (AUDIO_IS_ERROR((ret = _audio_volume_init(am)))) {
47 AUDIO_LOG_ERROR("stream init failed");
50 if (AUDIO_IS_ERROR((ret = _audio_ucm_init(am)))) {
51 AUDIO_LOG_ERROR("ucm init failed");
54 if (AUDIO_IS_ERROR((ret = _audio_util_init(am)))) {
55 AUDIO_LOG_ERROR("mixer init failed");
59 *userdata = (void *)am;
69 audio_return_t audio_deinit (void **userdata)
71 audio_mgr_t *am = (audio_mgr_t *)*userdata;
74 _audio_device_deinit(am);
75 _audio_volume_deinit(am);
76 _audio_ucm_deinit(am);
77 _audio_util_deinit(am);
85 audio_return_t audio_reset_volume (void **userdata)
87 audio_mgr_t *am = (audio_mgr_t *)*userdata;
88 audio_return_t ret = AUDIO_RET_OK;
91 _audio_volume_deinit(am);
93 if (AUDIO_IS_ERROR((ret = _audio_volume_init(am)))) {
94 AUDIO_LOG_ERROR("stream init failed");
109 audio_return_t audio_set_callback (void *userdata, audio_cb_interface_t *cb_interface)
111 audio_mgr_t *am = (audio_mgr_t *)userdata;
114 memcpy(&am->cb_intf, cb_interface, sizeof(audio_cb_interface_t));
117 return AUDIO_ERR_PARAMETER;
122 static const unsigned int SAMPLES_PER_PERIOD_DEFAULT = 1536; /* Frames */
123 static const unsigned int PERIODS_PER_BUFFER_FASTMODE = 4;
124 static const unsigned int PERIODS_PER_BUFFER_DEFAULT = 6;
125 static const unsigned int PERIODS_PER_BUFFER_VOIP = 2;
126 static const unsigned int PERIODS_PER_BUFFER_PLAYBACK = 8;
127 static const unsigned int PERIODS_PER_BUFFER_CAPTURE = 12;
128 static const unsigned int PERIODS_PER_BUFFER_VIDEO = 10;
132 static const unsigned int PERIOD_TIME_FOR_ULOW_LATENCY_MSEC = 20;
133 static const unsigned int PERIOD_TIME_FOR_LOW_LATENCY_MSEC = 25;
134 static const unsigned int PERIOD_TIME_FOR_MID_LATENCY_MSEC = 50;
135 static const unsigned int PERIOD_TIME_FOR_HIGH_LATENCY_MSEC = 75;
136 static const unsigned int PERIOD_TIME_FOR_UHIGH_LATENCY_MSEC = 150;
137 static const unsigned int PERIOD_TIME_FOR_VOIP_LATENCY_MSEC = 20;
139 static const uint32_t g_size_table[] = {
140 [AUDIO_SAMPLE_U8] = 1,
141 [AUDIO_SAMPLE_ULAW] = 1,
142 [AUDIO_SAMPLE_ALAW] = 1,
143 [AUDIO_SAMPLE_S16LE] = 2,
144 [AUDIO_SAMPLE_S16BE] = 2,
145 [AUDIO_SAMPLE_FLOAT32LE] = 4,
146 [AUDIO_SAMPLE_FLOAT32BE] = 4,
147 [AUDIO_SAMPLE_S32LE] = 4,
148 [AUDIO_SAMPLE_S32BE] = 4,
149 [AUDIO_SAMPLE_S24LE] = 3,
150 [AUDIO_SAMPLE_S24BE] = 3,
151 [AUDIO_SAMPLE_S24_32LE] = 4,
152 [AUDIO_SAMPLE_S24_32BE] = 4
155 int _sample_spec_valid(uint32_t rate, audio_sample_format_t format, uint32_t channels)
158 rate > (48000U*4U) ||
161 format >= AUDIO_SAMPLE_MAX ||
162 format < AUDIO_SAMPLE_U8))
165 AUDIO_LOG_ERROR("hal-latency - _sample_spec_valid() -> return true");
170 uint32_t _audio_usec_to_bytes(uint64_t t, uint32_t rate, audio_sample_format_t format, uint32_t channels)
172 uint32_t ret = (uint32_t) (((t * rate) / 1000000ULL)) * (g_size_table[format] * channels);
173 AUDIO_LOG_DEBUG("hal-latency - return %d", ret);
177 uint32_t _audio_sample_size(audio_sample_format_t format)
179 return g_size_table[format];
181 audio_return_t audio_get_buffer_attr(void *userdata,
182 audio_latency_t latency,
184 audio_sample_format_t format,
199 AUDIO_LOG_DEBUG("hal-latency - audio_get_buffer_attr(latency:%d, samplerate:%d, format:%d, channels:%d)", latency, samplerate, format, channels);
201 audio_mgr_t *am = (audio_mgr_t *)userdata;
203 uint32_t period_time = 0,
204 sample_per_period = 0,
205 periods_per_buffer = 0;
207 if (_sample_spec_valid(samplerate, format, channels) == 0) {
208 return AUDIO_ERR_PARAMETER;
212 case AUDIO_IN_LATENCY_LOW:
213 AUDIO_LOG_DEBUG("AUDIO_IN_LATENCY_LOW");
214 period_time = PERIOD_TIME_FOR_LOW_LATENCY_MSEC;
215 sample_per_period = (samplerate * period_time) / 1000;
216 periods_per_buffer = PERIODS_PER_BUFFER_FASTMODE;
221 *fragsize = sample_per_period * _audio_sample_size(format);
224 case AUDIO_IN_LATENCY_MID:
225 AUDIO_LOG_DEBUG("AUDIO_IN_LATENCY_MID");
226 period_time = PERIOD_TIME_FOR_MID_LATENCY_MSEC;
227 sample_per_period = (samplerate * period_time) / 1000;
228 periods_per_buffer = PERIODS_PER_BUFFER_DEFAULT;
233 *fragsize = _audio_usec_to_bytes(100000, samplerate, format, channels);
236 case AUDIO_IN_LATENCY_HIGH:
237 AUDIO_LOG_DEBUG("AUDIO_IN_LATENCY_HIGH");
238 period_time = PERIOD_TIME_FOR_HIGH_LATENCY_MSEC;
239 sample_per_period = (samplerate * period_time) / 1000;
240 periods_per_buffer = PERIODS_PER_BUFFER_CAPTURE;
245 *fragsize = sample_per_period * _audio_sample_size(format);
248 case AUDIO_IN_LATENCY_VOIP:
249 AUDIO_LOG_DEBUG("AUDIO_IN_LATENCY_VOIP");
250 period_time = PERIOD_TIME_FOR_VOIP_LATENCY_MSEC;
251 sample_per_period = (samplerate * period_time) / 1000;
252 periods_per_buffer = PERIODS_PER_BUFFER_VOIP;
257 *fragsize = sample_per_period * _audio_sample_size(format);
260 case AUDIO_OUT_LATENCY_LOW:
261 AUDIO_LOG_DEBUG("AUDIO_OUT_LATENCY_LOW");
262 period_time = PERIOD_TIME_FOR_LOW_LATENCY_MSEC;
263 sample_per_period = (samplerate * period_time) / 1000;
264 periods_per_buffer = PERIODS_PER_BUFFER_FASTMODE;
265 *prebuf = (samplerate / 100) * _audio_sample_size(format) * channels;
267 *tlength = (samplerate / 10) * _audio_sample_size(format) * channels;
272 case AUDIO_OUT_LATENCY_MID:
273 AUDIO_LOG_DEBUG("AUDIO_OUT_LATENCY_MID");
274 period_time = PERIOD_TIME_FOR_MID_LATENCY_MSEC;
275 sample_per_period = (samplerate * period_time) / 1000;
276 periods_per_buffer = PERIODS_PER_BUFFER_DEFAULT;
279 *tlength = (uint32_t) _audio_usec_to_bytes(350000, samplerate, format, channels);
284 case AUDIO_OUT_LATENCY_HIGH:
285 AUDIO_LOG_DEBUG("AUDIO_OUT_LATENCY_HIGH");
286 period_time = PERIOD_TIME_FOR_HIGH_LATENCY_MSEC;
287 sample_per_period = (samplerate * period_time) / 1000;
288 periods_per_buffer = PERIODS_PER_BUFFER_PLAYBACK;
291 *tlength = (uint32_t) _audio_usec_to_bytes(500000, samplerate, format, channels);
296 case AUDIO_OUT_LATENCY_VOIP:
297 AUDIO_LOG_DEBUG("AUDIO_OUT_LATENCY_VOIP");
298 period_time = PERIOD_TIME_FOR_VOIP_LATENCY_MSEC;
299 sample_per_period = (samplerate * period_time) / 1000;
300 periods_per_buffer = PERIODS_PER_BUFFER_VOIP;
302 *minreq = _audio_usec_to_bytes(20000, samplerate, format, channels);
303 *tlength = _audio_usec_to_bytes(100000, samplerate, format, channels);
309 AUDIO_LOG_ERROR("hal-latency - The latency(%d) is undefined", latency);
310 return AUDIO_ERR_UNDEFINED;
313 AUDIO_LOG_INFO("hal-latency - return attr --> prebuf:%d, minreq:%d, tlength:%d, maxlength:%d, fragsize:%d", *prebuf, *minreq, *tlength, *maxlength, *fragsize);