Fix SVACE defects: add checking higher bound
[platform/adaptation/spreadtrum/audio-hal-sc7727.git] / tizen-audio.h
1 /*
2  * audio-hal
3  *
4  * Copyright (c) 2015 - 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 #ifndef footizenaudiofoo
21 #define footizenaudiofoo
22
23 #include <stdint.h>
24
25 /**
26  * @file tizen-audio.h
27  * @brief This file contains the Audio Hardware Abstraction Layer Interfaces.
28  */
29
30 /**
31  * @addtogroup TIZEN_AUDIO_HAL_MODULE
32  * @{
33  */
34
35 /**
36  * @brief Enumeration for return codes.
37  * @since_tizen 3.0
38  */
39 typedef enum audio_return {
40     AUDIO_RET_OK                        = 0,
41     AUDIO_ERR_UNDEFINED                 = (int32_t)0x80001000,
42     AUDIO_ERR_RESOURCE                  = (int32_t)0x80001001,
43     AUDIO_ERR_PARAMETER                 = (int32_t)0x80001002,
44     AUDIO_ERR_IOCTL                     = (int32_t)0x80001003,
45     AUDIO_ERR_INVALID_STATE             = (int32_t)0x80001004,
46     AUDIO_ERR_INTERNAL                  = (int32_t)0x80001005,
47     /* add new enemerator here */
48     AUDIO_ERR_NOT_IMPLEMENTED           = (int32_t)0x80001100,
49 } audio_return_t ;
50
51 /**
52  * @brief Enumeration for audio direction.
53  * @since_tizen 3.0
54  */
55 typedef enum audio_direction {
56     AUDIO_DIRECTION_IN,                 /**< Capture */
57     AUDIO_DIRECTION_OUT,                /**< Playback */
58 } audio_direction_t;
59
60 /**
61  * @brief Device information including type, direction and id.
62  * @since_tizen 3.0
63  */
64 typedef struct device_info {
65     const char *type;
66     uint32_t direction;
67     uint32_t id;
68 } device_info_t;
69
70 /**
71  * @brief Volume information including type, gain and direction.
72  * @since_tizen 3.0
73  */
74 typedef struct audio_volume_info {
75     const char *type;
76     const char *gain;
77     uint32_t direction;
78 } audio_volume_info_t ;
79
80 /**
81  * @brief Route information including role and device.
82  * @since_tizen 3.0
83  */
84 typedef struct audio_route_info {
85     const char *role;
86     device_info_t *device_infos;
87     uint32_t num_of_devices;
88 } audio_route_info_t;
89
90 /**
91  * @brief Route option including role, name and value.
92  * @since_tizen 3.0
93  */
94 typedef struct audio_route_option {
95     const char *role;
96     const char *name;
97     int32_t value;
98 } audio_route_option_t;
99
100 /**
101  * @brief Stream information including role, direction and index.
102  * @since_tizen 3.0
103  */
104 typedef struct audio_stream_info {
105     const char *role;
106     uint32_t direction;
107     uint32_t idx;
108 } audio_stream_info_t ;
109
110 /**
111  * @brief Called when audio hal implementation needs to send a message.
112  * @since_tizen 3.0
113  * @param[in] name The message name
114  * @param[in] value The message value
115  * @param[in] user_data The user data passed from the callback registration function
116  *
117  * @see audio_add_message_cb()
118  * @see audio_remove_message_cb()
119  */
120 typedef void (*message_cb)(const char *name, int value, void *user_data);
121
122 /* Overall */
123 typedef struct audio_interface {
124     /* Initialization & de-initialization */
125     audio_return_t (*init)(void **audio_handle);
126     audio_return_t (*deinit)(void *audio_handle);
127     /* Volume */
128     audio_return_t (*get_volume_level_max)(void *audio_handle, audio_volume_info_t *info, uint32_t *level);
129     audio_return_t (*get_volume_level)(void *audio_handle, audio_volume_info_t *info, uint32_t *level);
130     audio_return_t (*set_volume_level)(void *audio_handle, audio_volume_info_t *info, uint32_t level);
131     audio_return_t (*get_volume_value)(void *audio_handle, audio_volume_info_t *info, uint32_t level, double *value);
132     audio_return_t (*get_volume_mute)(void *audio_handle, audio_volume_info_t *info, uint32_t *mute);
133     audio_return_t (*set_volume_mute)(void *audio_handle, audio_volume_info_t *info, uint32_t mute);
134     /* Routing */
135     audio_return_t (*update_route)(void *audio_handle, audio_route_info_t *info);
136     audio_return_t (*update_route_option)(void *audio_handle, audio_route_option_t *option);
137     /* Stream */
138     audio_return_t (*notify_stream_connection_changed)(void *audio_handle, audio_stream_info_t *info, uint32_t is_connected);
139     /* PCM */
140     audio_return_t (*pcm_open)(void *audio_handle, void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
141     audio_return_t (*pcm_start)(void *audio_handle, void *pcm_handle);
142     audio_return_t (*pcm_stop)(void *audio_handle, void *pcm_handle);
143     audio_return_t (*pcm_close)(void *audio_handle, void *pcm_handle);
144     audio_return_t (*pcm_avail)(void *audio_handle, void *pcm_handle, uint32_t *avail);
145     audio_return_t (*pcm_write)(void *audio_handle, void *pcm_handle, const void *buffer, uint32_t frames);
146     audio_return_t (*pcm_read)(void *audio_handle, void *pcm_handle, void *buffer, uint32_t frames);
147     audio_return_t (*pcm_get_fd)(void *audio_handle, void *pcm_handle, int *fd);
148     audio_return_t (*pcm_recover)(void *audio_handle, void *pcm_handle, int revents);
149     audio_return_t (*pcm_get_params)(void *audio_handle, void *pcm_handle, uint32_t direction, void **sample_spec, uint32_t *period_size, uint32_t *periods);
150     audio_return_t (*pcm_set_params)(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
151     /* Message callback */
152     audio_return_t (*add_message_cb)(void *audio_handle, message_cb callback, void *user_data);
153     audio_return_t (*remove_message_cb)(void *audio_handle, message_cb callback);
154 } audio_interface_t;
155
156 /**
157  * @brief Initializes audio hal.
158  * @since_tizen 3.0
159  * @param[out] audio_handle The audio hal handle
160  *
161  * @return @c 0 on success,
162  *         otherwise a negative error value
163  * @retval #AUDIO_RET_OK Success
164  * @see audio_deinit()
165  */
166 audio_return_t audio_init(void **audio_handle);
167
168 /**
169  * @brief De-initializes audio hal.
170  * @since_tizen 3.0
171  * @param[in] audio_handle The audio hal handle
172  *
173  * @return @c 0 on success,
174  *         otherwise a negative error value
175  * @retval #AUDIO_RET_OK Success
176  * @see audio_init()
177  */
178 audio_return_t audio_deinit(void *audio_handle);
179
180 /**
181  * @brief Gets the maximum volume level supported for a particular volume information.
182  * @since_tizen 3.0
183  * @param[in] audio_handle The audio hal handle
184  * @param[in] info The audio volume information
185  * @param[out] level The maximum volume level
186  *
187  * @return @c 0 on success,
188  *         otherwise a negative error value
189  * @retval #AUDIO_RET_OK Success
190  * @see audio_set_volume_level()
191  * @see audio_get_volume_level()
192  * @see audio_get_volume_value()
193  */
194 audio_return_t audio_get_volume_level_max(void *audio_handle, audio_volume_info_t *info, uint32_t *level);
195
196 /**
197  * @brief Gets the volume level specified for a particular volume information.
198  * @since_tizen 3.0
199  * @param[in] audio_handle The audio hal handle
200  * @param[in] info The audio volume information
201  * @param[out] level The current volume level
202  *
203  * @return @c 0 on success,
204  *         otherwise a negative error value
205  * @retval #AUDIO_RET_OK Success
206  * @see audio_set_volume_level()
207  * @see audio_get_volume_level_max()
208  * @see audio_get_volume_value()
209  */
210 audio_return_t audio_get_volume_level(void *audio_handle, audio_volume_info_t *info, uint32_t *level);
211
212 /**
213  * @brief Sets the volume level specified for a particular volume information.
214  * @since_tizen 3.0
215  * @param[in] audio_handle The audio hal handle
216  * @param[in] info The audio volume information
217  * @param[in] level The volume level to be set
218  *
219  * @return @c 0 on success,
220  *         otherwise a negative error value
221  * @retval #AUDIO_RET_OK Success
222  * @see audio_get_volume_level()
223  * @see audio_get_volume_level_max()
224  * @see audio_get_volume_value()
225  */
226 audio_return_t audio_set_volume_level(void *audio_handle, audio_volume_info_t *info, uint32_t level);
227
228 /**
229  * @brief Gets the volume value specified for a particular volume information and level.
230  * @since_tizen 3.0
231  * @param[in] audio_handle The audio hal handle
232  * @param[in] info The audio volume information
233  * @param[in] level The volume level
234  * @param[out] value The volume value (range is from 0.0 to 1.0 inclusive, 1.0 = 100%)
235  *
236  * @return @c 0 on success,
237  *         otherwise a negative error value
238  * @retval #AUDIO_RET_OK Success
239  * @see audio_set_volume_level()
240  * @see audio_get_volume_level()
241  * @see audio_get_volume_level_max()
242  */
243 audio_return_t audio_get_volume_value(void *audio_handle, audio_volume_info_t *info, uint32_t level, double *value);
244
245 /**
246  * @brief Gets the volume mute specified for a particular volume information.
247  * @since_tizen 3.0
248  * @param[in] audio_handle The audio hal handle
249  * @param[in] info The audio volume information
250  * @param[out] mute The volume mute state : (@c 0 = unmute, @c 1 = mute)
251  *
252  * @return @c 0 on success,
253  *         otherwise a negative error value
254  * @retval #AUDIO_RET_OK Success
255  * @see audio_set_volume_mute()
256  */
257 audio_return_t audio_get_volume_mute(void *audio_handle, audio_volume_info_t *info, uint32_t *mute);
258
259 /**
260  * @brief Sets the volume mute specified for a particular volume information.
261  * @since_tizen 3.0
262  * @param[in] audio_handle The audio hal handle
263  * @param[in] info The audio volume information
264  * @param[in] mute The volume mute state to be set : (@c 0 = unmute, @c 1 = mute)
265  *
266  * @return @c 0 on success,
267  *         otherwise a negative error value
268  * @retval #AUDIO_RET_OK Success
269  * @see audio_get_volume_mute()
270  */
271 audio_return_t audio_set_volume_mute(void *audio_handle, audio_volume_info_t *info, uint32_t mute);
272
273 /**
274  * @brief Updates the audio routing according to audio route information.
275  * @since_tizen 3.0
276  * @param[in] audio_handle The audio hal handle
277  * @param[in] info The audio route information including role and devices
278  *
279  * @return @c 0 on success,
280  *         otherwise a negative error value
281  * @retval #AUDIO_RET_OK Success
282  * @see audio_update_route_option()
283  */
284 audio_return_t audio_update_route(void *audio_handle, audio_route_info_t *info);
285
286 /**
287  * @brief Updates audio routing option according to audio route option.
288  * @since_tizen 3.0
289  * @param[in] audio_handle The audio hal handle
290  * @param[in] option The option that can be used for audio routing including role, name and value
291  *
292  * @remarks This option can be used for audio routing.\n
293  * It is recommended to apply this option for routing per each role.
294  *
295  * @return @c 0 on success,
296  *         otherwise a negative error value
297  * @retval #AUDIO_RET_OK Success
298  * @see audio_update_route()
299  */
300 audio_return_t audio_update_route_option(void *audio_handle, audio_route_option_t *option);
301
302 /**
303  * @brief Gets notified when a stream is connected and disconnected.
304  * @since_tizen 3.0
305  * @param[in] audio_handle The audio hal handle
306  * @param[in] info The stream information including role, direction, index
307  * @param[in] is_connected The connection state of this stream (@c true = connected, @c false = disconnected)
308  *
309  * @remarks This information can be used for audio routing, volume controls and so on.
310  *
311  * @return @c 0 on success,
312  *         otherwise a negative error value
313  * @retval #AUDIO_RET_OK Success
314  */
315 audio_return_t audio_notify_stream_connection_changed(void *audio_handle, audio_stream_info_t *info, uint32_t is_connected);
316
317 /**
318  * @brief Opens a PCM device.
319  * @since_tizen 3.0
320  * @param[in] audio_handle The audio hal handle
321  * @param[out] pcm_handle The PCM handle
322  * @param[in] direction The direction of PCM
323  * @param[in] sample_spec The sample specification
324  * @param[in] period_size The period size
325  * @param[in] periods The periods
326  *
327  * @return @c 0 on success,
328  *         otherwise a negative error value
329  * @retval #AUDIO_RET_OK Success
330  * @see audio_pcm_close()
331  */
332 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);
333
334 /**
335  * @brief Starts a PCM device.
336  * @since_tizen 3.0
337  * @param[in] audio_handle The audio hal handle
338  * @param[in] pcm_handle The PCM handle to be started
339  *
340  * @return @c 0 on success,
341  *         otherwise a negative error value
342  * @retval #AUDIO_RET_OK Success
343  * @see audio_pcm_avail()
344  * @see audio_pcm_write()
345  * @see audio_pcm_read()
346  * @see audio_pcm_stop()
347  * @see audio_pcm_recover()
348  */
349 audio_return_t audio_pcm_start(void *audio_handle, void *pcm_handle);
350
351 /**
352  * @brief Stops a PCM device.
353  * @since_tizen 3.0
354  * @param[in] audio_handle The audio hal handle
355  * @param[in] pcm_handle The PCM handle to be stopped
356  *
357  * @return @c 0 on success,
358  *         otherwise a negative error value
359  * @retval #AUDIO_RET_OK Success
360  * @see audio_pcm_start()
361  */
362 audio_return_t audio_pcm_stop(void *audio_handle, void *pcm_handle);
363
364 /**
365  * @brief Closes a PCM device.
366  * @since_tizen 3.0
367  * @param[in] audio_handle The audio hal handle
368  * @param[in] pcm_handle The PCM handle to be closed
369  *
370  * @return @c 0 on success,
371  *         otherwise a negative error value
372  * @retval #AUDIO_RET_OK Success
373  * @see audio_pcm_open()
374  */
375 audio_return_t audio_pcm_close(void *audio_handle, void *pcm_handle);
376
377 /**
378  * @brief Gets available number of frames.
379  * @since_tizen 3.0
380  * @param[in] audio_handle The audio hal handle
381  * @param[in] pcm_handle The PCM handle
382  * @param[out] avail The available number of frames
383  *
384  * @return @c 0 on success,
385  *         otherwise a negative error value
386  * @retval #AUDIO_RET_OK Success
387  * @see audio_pcm_write()
388  * @see audio_pcm_read()
389  */
390 audio_return_t audio_pcm_avail(void *audio_handle, void *pcm_handle, uint32_t *avail);
391
392 /**
393  * @brief Writes frames to a PCM device.
394  * @since_tizen 3.0
395  * @param[in] audio_handle The audio hal handle
396  * @param[in] pcm_handle The PCM handle
397  * @param[in] buffer The buffer containing frames
398  * @param[in] frames The number of frames to be written
399  *
400  * @return @c 0 on success,
401  *         otherwise a negative error value
402  * @retval #AUDIO_RET_OK Success
403  * @see audio_pcm_avail()
404  * @see audio_pcm_recover()
405  */
406 audio_return_t audio_pcm_write(void *audio_handle, void *pcm_handle, const void *buffer, uint32_t frames);
407
408 /**
409  * @brief Reads frames from a PCM device.
410  * @since_tizen 3.0
411  * @param[in] audio_handle The audio hal handle
412  * @param[in] pcm_handle The PCM handle
413  * @param[out] buffer The buffer containing frames
414  * @param[in] frames The number of frames to be read
415  *
416  * @return @c 0 on success,
417  *         otherwise a negative error value
418  * @retval #AUDIO_RET_OK Success
419  * @see audio_pcm_avail()
420  * @see audio_pcm_recover()
421  */
422 audio_return_t audio_pcm_read(void *audio_handle, void *pcm_handle, void *buffer, uint32_t frames);
423
424 /**
425  * @brief Gets poll descriptor for a PCM handle.
426  * @since_tizen 3.0
427  * @param[in] audio_handle The audio hal handle
428  * @param[in] pcm_handle The PCM handle
429  * @param[out] fd The poll descriptor
430  *
431  * @return @c 0 on success,
432  *         otherwise a negative error value
433  * @retval #AUDIO_RET_OK Success
434  * @see audio_pcm_open()
435  * @see audio_pcm_recover()
436  */
437 audio_return_t audio_pcm_get_fd(void *audio_handle, void *pcm_handle, int *fd);
438
439 /**
440  * @brief Recovers the PCM state.
441  * @since_tizen 3.0
442  * @param[in] audio_handle The audio hal handle
443  * @param[in] pcm_handle The PCM handle
444  * @param[in] revents The returned event from pollfd
445  *
446  * @return @c 0 on success,
447  *         otherwise a negative error value
448  * @retval #AUDIO_RET_OK Success
449  * @see audio_pcm_start()
450  * @see audio_pcm_write()
451  * @see audio_pcm_read()
452  * @see audio_pcm_get_fd()
453  */
454 audio_return_t audio_pcm_recover(void *audio_handle, void *pcm_handle, int revents);
455
456 /**
457  * @brief Gets parameters of a PCM device.
458  * @since_tizen 3.0
459  * @param[in] audio_handle The audio hal handle
460  * @param[in] pcm_handle The PCM handle
461  * @param[in] direction The direction of PCM
462  * @param[out] sample_spec The sample specification
463  * @param[out] period_size The period size
464  * @param[out] periods The periods
465  *
466  * @return @c 0 on success,
467  *         otherwise a negative error value
468  * @retval #AUDIO_RET_OK Success
469  * @see audio_pcm_set_params()
470  */
471 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);
472
473 /**
474  * @brief Sets hardware and software parameters of a PCM device.
475  * @since_tizen 3.0
476  * @param[in] audio_handle The audio hal handle
477  * @param[in] pcm_handle The PCM handle
478  * @param[in] direction The direction of PCM
479  * @param[in] sample_spec The sample specification
480  * @param[in] period_size The period size
481  * @param[in] periods The periods
482  *
483  * @return @c 0 on success,
484  *         otherwise a negative error value
485  * @retval #AUDIO_RET_OK Success
486  * @see audio_pcm_set_params()
487  */
488 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);
489
490 /**
491  * @brief Adds the message callback function.
492  * @since_tizen 3.0
493  * @param[in] audio_handle The audio hal handle
494  * @param[in] message_cb The message callback function
495  * @param[in] user_data The user data passed to the callback function
496  *
497  * @see message_cb()
498  * @see audio_remove_message_cb()
499  */
500 audio_return_t audio_add_message_cb(void *audio_handle, message_cb callback, void *user_data);
501
502 /**
503  * @brief Removes the message callback function.
504  * @since_tizen 3.0
505  * @param[in] audio_handle The audio hal handle
506  * @param[in] message_cb The message callback function to be removed
507  *
508  * @see message_cb()
509  * @see audio_add_message_cb()
510  */
511 audio_return_t audio_remove_message_cb(void *audio_handle, message_cb callback);
512
513 /**
514 * @}
515 */
516
517 /**
518 * @}
519 */
520
521 #endif