4 * Copyright (c) 2016 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"
25 #include "tizen-audio-impl.h"
27 audio_return_t _audio_pcm_init(audio_hal_t *ah)
29 AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
31 ah->device.pcm_in = NULL;
32 ah->device.pcm_out = NULL;
33 pthread_mutex_init(&ah->device.pcm_lock, NULL);
34 ah->device.pcm_count = 0;
39 audio_return_t _audio_pcm_deinit(audio_hal_t *ah)
41 AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
43 pthread_mutex_destroy(&ah->device.pcm_lock);
48 audio_return_t audio_pcm_open(void *audio_handle, void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods)
50 audio_return_t audio_ret = AUDIO_RET_OK;
51 audio_hal_t *ah = NULL;
53 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
54 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
55 AUDIO_RETURN_VAL_IF_FAIL(sample_spec, AUDIO_ERR_PARAMETER);
56 AUDIO_RETURN_VAL_IF_FAIL((period_size > 0), AUDIO_ERR_PARAMETER);
57 AUDIO_RETURN_VAL_IF_FAIL((periods > 0), AUDIO_ERR_PARAMETER);
59 if ((audio_ret = _pcm_open(pcm_handle, direction, sample_spec, period_size, periods)))
62 ah = (audio_hal_t*)audio_handle;
63 ah->device.pcm_count++;
64 AUDIO_LOG_INFO("Opening PCM handle 0x%x", *pcm_handle);
69 audio_return_t audio_pcm_start(void *audio_handle, void *pcm_handle)
71 audio_return_t audio_ret = AUDIO_RET_OK;
73 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
74 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
76 audio_ret = _pcm_start(pcm_handle);
81 audio_return_t audio_pcm_stop(void *audio_handle, void *pcm_handle)
83 audio_return_t audio_ret = AUDIO_RET_OK;
85 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
86 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
88 audio_ret = _pcm_stop(pcm_handle);
93 audio_return_t audio_pcm_close(void *audio_handle, void *pcm_handle)
95 audio_return_t audio_ret = AUDIO_RET_OK;
96 audio_hal_t *ah = NULL;
98 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
99 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
101 if ((audio_ret = _pcm_close(pcm_handle)))
105 ah = (audio_hal_t*)audio_handle;
106 ah->device.pcm_count--;
108 AUDIO_LOG_INFO("PCM handle close success (count:%d)", ah->device.pcm_count);
113 audio_return_t audio_pcm_avail(void *audio_handle, void *pcm_handle, uint32_t *avail)
115 audio_return_t audio_ret = AUDIO_RET_OK;
117 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
118 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
119 AUDIO_RETURN_VAL_IF_FAIL(avail, AUDIO_ERR_PARAMETER);
121 audio_ret = _pcm_avail(pcm_handle, avail);
126 audio_return_t audio_pcm_write(void *audio_handle, void *pcm_handle, const void *buffer, uint32_t frames)
128 audio_return_t audio_ret = AUDIO_RET_OK;
130 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
131 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
133 audio_ret = _pcm_write(pcm_handle, buffer, frames);
138 audio_return_t audio_pcm_read(void *audio_handle, void *pcm_handle, void *buffer, uint32_t frames)
140 audio_return_t audio_ret = AUDIO_RET_OK;
142 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
143 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
145 audio_ret = _pcm_read(pcm_handle, buffer, frames);
150 audio_return_t audio_pcm_get_fd(void *audio_handle, void *pcm_handle, int *fd)
152 audio_return_t audio_ret = AUDIO_RET_OK;
154 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
155 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
156 AUDIO_RETURN_VAL_IF_FAIL(fd, AUDIO_ERR_PARAMETER);
158 audio_ret = _pcm_get_fd(pcm_handle, fd);
163 audio_return_t audio_pcm_recover(void *audio_handle, void *pcm_handle, int revents)
165 audio_return_t audio_ret = AUDIO_RET_OK;
167 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
168 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
170 audio_ret = _pcm_recover(pcm_handle, revents);
175 audio_return_t audio_pcm_get_params(void *audio_handle, void *pcm_handle, uint32_t direction, void **sample_spec, uint32_t *period_size, uint32_t *periods)
177 audio_return_t audio_ret = AUDIO_RET_OK;
179 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
180 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
181 AUDIO_RETURN_VAL_IF_FAIL(sample_spec, AUDIO_ERR_PARAMETER);
182 AUDIO_RETURN_VAL_IF_FAIL(period_size, AUDIO_ERR_PARAMETER);
183 AUDIO_RETURN_VAL_IF_FAIL(periods, AUDIO_ERR_PARAMETER);
185 audio_ret = _pcm_get_params(pcm_handle, direction, sample_spec, period_size, periods);
190 audio_return_t audio_pcm_set_params(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods)
192 audio_return_t audio_ret = AUDIO_RET_OK;
194 AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
195 AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
196 AUDIO_RETURN_VAL_IF_FAIL(sample_spec, AUDIO_ERR_PARAMETER);
197 AUDIO_RETURN_VAL_IF_FAIL(period_size, AUDIO_ERR_PARAMETER);
198 AUDIO_RETURN_VAL_IF_FAIL(periods, AUDIO_ERR_PARAMETER);
200 audio_ret = _pcm_set_params(pcm_handle, direction, sample_spec, period_size, periods);