Fix SVACE defect (DEREF_OF_NULL.RET.ALLOC)
[platform/adaptation/samsung_exynos/audio-hal-wm1831-tw2.git] / tizen-audio-pcm.c
1 /*
2  * audio-hal
3  *
4  * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #include "tizen-audio-internal.h"
25 #include "tizen-audio-impl.h"
26
27 audio_return_t _audio_pcm_init(audio_hal_t *ah)
28 {
29     AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
30
31     ah->device.voice_pcm.in = NULL;
32     ah->device.voice_pcm.out = NULL;
33     ah->device.bt_pcm.in = NULL;
34     ah->device.bt_pcm.out = NULL;
35
36     return AUDIO_RET_OK;
37 }
38
39 audio_return_t _audio_pcm_deinit(audio_hal_t *ah)
40 {
41     AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
42
43     return AUDIO_RET_OK;
44 }
45
46 audio_return_t audio_pcm_open(void *audio_handle, const char *card, const char *device, uint32_t direction, void *sample_spec,
47         uint32_t period_size, uint32_t periods, void **pcm_handle)
48 {
49     audio_return_t audio_ret = AUDIO_RET_OK;
50
51     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
52     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
53     AUDIO_RETURN_VAL_IF_FAIL(sample_spec, AUDIO_ERR_PARAMETER);
54     AUDIO_RETURN_VAL_IF_FAIL((period_size > 0), AUDIO_ERR_PARAMETER);
55     AUDIO_RETURN_VAL_IF_FAIL((periods > 0), AUDIO_ERR_PARAMETER);
56
57     if ((audio_ret = _pcm_open(card, device, direction, sample_spec, period_size, periods, pcm_handle)))
58         return audio_ret;
59
60     AUDIO_LOG_INFO("Opening PCM handle %p", *pcm_handle);
61
62     return AUDIO_RET_OK;
63 }
64
65 audio_return_t audio_pcm_start(void *audio_handle, void *pcm_handle)
66 {
67     audio_return_t audio_ret = AUDIO_RET_OK;
68
69     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
70     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
71
72     audio_ret = _pcm_start(pcm_handle);
73
74     return audio_ret;
75 }
76
77 audio_return_t audio_pcm_stop(void *audio_handle, void *pcm_handle)
78 {
79     audio_return_t audio_ret = AUDIO_RET_OK;
80
81     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
82     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
83
84     audio_ret = _pcm_stop(pcm_handle);
85
86     return audio_ret;
87 }
88
89 audio_return_t audio_pcm_close(void *audio_handle, void *pcm_handle)
90 {
91     audio_return_t audio_ret = AUDIO_RET_OK;
92
93     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
94     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
95
96     if ((audio_ret = _pcm_close(pcm_handle)))
97         return audio_ret;
98
99     pcm_handle = NULL;
100
101     AUDIO_LOG_INFO("PCM handle close success");
102
103     return audio_ret;
104 }
105
106 audio_return_t audio_pcm_avail(void *audio_handle, void *pcm_handle, uint32_t *avail)
107 {
108     audio_return_t audio_ret = AUDIO_RET_OK;
109
110     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
111     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
112     AUDIO_RETURN_VAL_IF_FAIL(avail, AUDIO_ERR_PARAMETER);
113
114     audio_ret = _pcm_avail(pcm_handle, avail);
115
116     return audio_ret;
117 }
118
119 audio_return_t audio_pcm_write(void *audio_handle, void *pcm_handle, const void *buffer, uint32_t frames)
120 {
121     audio_return_t audio_ret = AUDIO_RET_OK;
122
123     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
124     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
125
126     audio_ret = _pcm_write(pcm_handle, buffer, frames);
127
128     return audio_ret;
129 }
130
131 audio_return_t audio_pcm_read(void *audio_handle, void *pcm_handle, void *buffer, uint32_t frames)
132 {
133     audio_return_t audio_ret = AUDIO_RET_OK;
134
135     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
136     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
137
138     audio_ret = _pcm_read(pcm_handle, buffer, frames);
139
140     return audio_ret;
141 }
142
143 audio_return_t audio_pcm_get_fd(void *audio_handle, void *pcm_handle, int *fd)
144 {
145     audio_return_t audio_ret = AUDIO_RET_OK;
146
147     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
148     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
149     AUDIO_RETURN_VAL_IF_FAIL(fd, AUDIO_ERR_PARAMETER);
150
151     audio_ret = _pcm_get_fd(pcm_handle, fd);
152
153     return audio_ret;
154 }
155
156 audio_return_t audio_pcm_recover(void *audio_handle, void *pcm_handle, int revents)
157 {
158     audio_return_t audio_ret = AUDIO_RET_OK;
159
160     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
161     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
162
163     audio_ret = _pcm_recover(pcm_handle, revents);
164
165     return audio_ret;
166 }
167
168 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)
169 {
170     audio_return_t audio_ret = AUDIO_RET_OK;
171
172     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
173     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
174     AUDIO_RETURN_VAL_IF_FAIL(sample_spec, AUDIO_ERR_PARAMETER);
175     AUDIO_RETURN_VAL_IF_FAIL(period_size, AUDIO_ERR_PARAMETER);
176     AUDIO_RETURN_VAL_IF_FAIL(periods, AUDIO_ERR_PARAMETER);
177
178     audio_ret = _pcm_get_params(pcm_handle, direction, sample_spec, period_size, periods);
179
180     return audio_ret;
181 }
182
183 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)
184 {
185     audio_return_t audio_ret = AUDIO_RET_OK;
186
187     AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
188     AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER);
189     AUDIO_RETURN_VAL_IF_FAIL(sample_spec, AUDIO_ERR_PARAMETER);
190     AUDIO_RETURN_VAL_IF_FAIL(period_size, AUDIO_ERR_PARAMETER);
191     AUDIO_RETURN_VAL_IF_FAIL(periods, AUDIO_ERR_PARAMETER);
192
193     audio_ret = _pcm_set_params(pcm_handle, direction, sample_spec, period_size, periods);
194
195     return audio_ret;
196 }