typdef postfix is changed to {enum}_e and {struct}_s
[platform/adaptation/samsung_exynos/audio-hal-exynos9110.git] / tizen-audio-internal.h
1 #ifndef footizenaudiointernalfoo
2 #define footizenaudiointernalfoo
3
4 /*
5  * audio-hal
6  *
7  * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */
22
23 #include <stdbool.h>
24 #include <dlog.h>
25 #include <time.h>
26 #include <sys/types.h>
27 #include <asoundlib.h>
28 #ifdef __USE_TINYALSA__
29 #include <tinyalsa/asoundlib.h>
30 #endif
31 #include <pthread.h>
32 #include <use-case.h>
33 #include "tizen-audio.h"
34
35 /* Debug */
36
37 //#define AUDIO_DEBUG
38 #define PROPERTY_VALUE_MAX 92
39 #define BUF_SIZE 1024
40 #define AUDIO_DUMP_STR_LEN              256
41 #define AUDIO_DEVICE_INFO_LIST_MAX      16
42 #ifdef USE_DLOG
43 #ifdef DLOG_TAG
44 #undef DLOG_TAG
45 #endif
46 #define DLOG_TAG "AUDIO_HAL"
47 #define AUDIO_LOG_ERROR(...)            SLOG(LOG_ERROR, DLOG_TAG, __VA_ARGS__)
48 #define AUDIO_LOG_WARN(...)             SLOG(LOG_WARN, DLOG_TAG, __VA_ARGS__)
49 #define AUDIO_LOG_INFO(...)             SLOG(LOG_INFO, DLOG_TAG, __VA_ARGS__)
50 #define AUDIO_LOG_DEBUG(...)            SLOG(LOG_DEBUG, DLOG_TAG, __VA_ARGS__)
51 #define AUDIO_LOG_VERBOSE(...)          SLOG(LOG_DEBUG, DLOG_TAG, __VA_ARGS__)
52 #else
53 #define AUDIO_LOG_ERROR(...)            fprintf(stderr, __VA_ARGS__)
54 #define AUDIO_LOG_WARN(...)             fprintf(stderr, __VA_ARGS__)
55 #define AUDIO_LOG_INFO(...)             fprintf(stdout, __VA_ARGS__)
56 #define AUDIO_LOG_DEBUG(...)            fprintf(stdout, __VA_ARGS__)
57 #define AUDIO_LOG_VERBOSE(...)          fprintf(stdout, __VA_ARGS__)
58 #endif
59
60 #define AUDIO_RETURN_IF_FAIL(expr) do { \
61     if (!(expr)) { \
62         AUDIO_LOG_ERROR("%s failed", #expr); \
63         return; \
64     } \
65 } while (0)
66 #define AUDIO_RETURN_VAL_IF_FAIL(expr, val) do { \
67     if (!(expr)) { \
68         AUDIO_LOG_ERROR("%s failed", #expr); \
69         return val; \
70     } \
71 } while (0)
72 #define AUDIO_RETURN_NULL_IF_FAIL(expr) do { \
73     if (!(expr)) { \
74         AUDIO_LOG_ERROR("%s failed", #expr); \
75         return NULL; \
76     } \
77 } while (0)
78 /*
79 static device_type_s outDeviceTypes[] = {
80     { AUDIO_DEVICE_OUT_SPEAKER, "speaker" },
81     { AUDIO_DEVICE_OUT_BT_SCO, "bt-sco-headset" },
82     { AUDIO_DEVICE_OUT_BT_SCO_8K_NB, "bt-8k-sco-nb-headset" },
83     { AUDIO_DEVICE_OUT_BT_SCO_16K_NB, "bt-16k-sco-nb-headset" },
84     { AUDIO_DEVICE_OUT_BT_SCO_8K_WB, "bt-8k-sco-wb-headset" },
85     { AUDIO_DEVICE_OUT_BT_SCO_16K_WB, "bt-16k-sco-wb-headset" },
86     { 0, 0 },
87 };
88
89 static device_type_s inDeviceTypes[] = {
90     { AUDIO_DEVICE_IN_MAIN_MIC, "main-mic" },
91     { AUDIO_DEVICE_IN_BT_SCO, "bt-sco-mic" },
92     { AUDIO_DEVICE_IN_BT_SCO_8K_NB, "bt-8k-sco-nb-mic" },
93     { AUDIO_DEVICE_IN_BT_SCO_16K_NB, "bt-16k-sco-nb-mic" },
94     { AUDIO_DEVICE_IN_BT_SCO_8K_WB, "bt-8k-sco-wb-mic" },
95     { AUDIO_DEVICE_IN_BT_SCO_16K_WB, "bt-16k-sco-wb-mic" },
96     { 0, 0 },
97 };
98
99
100 */
101
102 /* Devices : Normal  */
103 #define AUDIO_DEVICE_OUT               0x00000000
104 #define AUDIO_DEVICE_IN                0x80000000
105 enum audio_device_type {
106     AUDIO_DEVICE_NONE                 = 0,
107
108     /* output devices */
109     AUDIO_DEVICE_OUT_SPEAKER          = AUDIO_DEVICE_OUT | 0x00000001,
110     AUDIO_DEVICE_OUT_RECEIVER         = AUDIO_DEVICE_OUT | 0x00000002,
111     AUDIO_DEVICE_OUT_JACK             = AUDIO_DEVICE_OUT | 0x00000004,
112     AUDIO_DEVICE_OUT_BT_SCO           = AUDIO_DEVICE_OUT | 0x00000008,
113     AUDIO_DEVICE_OUT_BT_SCO_8K_NB     = AUDIO_DEVICE_OUT | 0x00000010,
114     AUDIO_DEVICE_OUT_BT_SCO_16K_NB    = AUDIO_DEVICE_OUT | 0x00000020,
115     AUDIO_DEVICE_OUT_BT_SCO_8K_WB     = AUDIO_DEVICE_OUT | 0x00000040,
116     AUDIO_DEVICE_OUT_BT_SCO_16K_WB    = AUDIO_DEVICE_OUT | 0x00000080,
117     AUDIO_DEVICE_OUT_ALL              = (AUDIO_DEVICE_OUT_SPEAKER |
118                                          AUDIO_DEVICE_OUT_RECEIVER |
119                                          AUDIO_DEVICE_OUT_JACK |
120                                          AUDIO_DEVICE_OUT_BT_SCO |
121                                          AUDIO_DEVICE_OUT_BT_SCO_8K_NB |
122                                          AUDIO_DEVICE_OUT_BT_SCO_16K_NB |
123                                          AUDIO_DEVICE_OUT_BT_SCO_8K_WB |
124                                          AUDIO_DEVICE_OUT_BT_SCO_16K_WB),
125     /* input devices */
126     AUDIO_DEVICE_IN_MAIN_MIC          = AUDIO_DEVICE_IN | 0x00000001,
127     AUDIO_DEVICE_IN_SUB_MIC           = AUDIO_DEVICE_IN | 0x00000002,
128     AUDIO_DEVICE_IN_JACK              = AUDIO_DEVICE_IN | 0x00000004,
129     AUDIO_DEVICE_IN_BT_SCO            = AUDIO_DEVICE_IN | 0x00000008,
130     AUDIO_DEVICE_IN_BT_SCO_8K_NB      = AUDIO_DEVICE_IN | 0x00000010,
131     AUDIO_DEVICE_IN_BT_SCO_16K_NB     = AUDIO_DEVICE_IN | 0x00000020,
132     AUDIO_DEVICE_IN_BT_SCO_8K_WB      = AUDIO_DEVICE_IN | 0x00000040,
133     AUDIO_DEVICE_IN_BT_SCO_16K_WB     = AUDIO_DEVICE_IN | 0x00000080,
134     AUDIO_DEVICE_IN_ALL               = (AUDIO_DEVICE_IN_MAIN_MIC |
135                                          AUDIO_DEVICE_IN_SUB_MIC |
136                                          AUDIO_DEVICE_IN_JACK |
137                                          AUDIO_DEVICE_IN_BT_SCO |
138                                          AUDIO_DEVICE_IN_BT_SCO_8K_NB |
139                                          AUDIO_DEVICE_IN_BT_SCO_16K_NB |
140                                          AUDIO_DEVICE_IN_BT_SCO_8K_WB |
141                                          AUDIO_DEVICE_IN_BT_SCO_16K_WB),
142 };
143
144 /* Verbs */
145 #define AUDIO_USE_CASE_VERB_INACTIVE                "Inactive"
146 #define AUDIO_USE_CASE_VERB_HIFI                    "HiFi"
147 #define AUDIO_USE_CASE_VERB_VOICECALL               "Voice"
148 #define AUDIO_USE_CASE_VERB_VOIP                    "VoIP"
149
150 #define streq !strcmp
151 #define strneq strcmp
152
153 #define ALSA_DEFAULT_CARD       "Exynos9110Sound"
154
155 /* DAI PCM DEVICE */
156 #define VOICE_PCM_DEVICE        "hw:0,1"
157 #define BT_PCM_DEVICE           "hw:0,2"
158
159 #define MAX_DEVICES             5
160 #define MAX_NAME_LEN           32
161
162 /* type definitions */
163 typedef signed char int8_t;
164
165 typedef struct device_type {
166     uint32_t type;
167     const char *name;
168 } device_type_s;
169
170 /* PCM */
171 typedef struct {
172     snd_pcm_format_t format;
173     uint32_t rate;
174     uint8_t channels;
175 } audio_pcm_sample_spec_s;
176
177 /* Routing */
178 typedef enum audio_route_mode {
179     VERB_NORMAL,
180     VERB_VOICECALL,
181     VERB_VOIP,
182 } audio_route_mode_e;
183
184 typedef struct {
185     snd_pcm_t *in;
186     snd_pcm_t *out;
187 } audio_pcm_devices_s;
188
189 typedef struct audio_hal_device {
190     uint32_t active_in;
191     uint32_t active_out;
192     audio_pcm_devices_s voice_pcm;
193     audio_pcm_devices_s bt_pcm;
194     audio_route_mode_e mode;
195     bool bt_wideband;
196     bool bt_sco_ready;
197 } audio_hal_device_s;
198
199 /* Volume */
200 #define AUDIO_VOLUME_LEVEL_MAX 16
201
202 typedef enum audio_volume {
203     AUDIO_VOLUME_TYPE_SYSTEM,           /**< System volume type */
204     AUDIO_VOLUME_TYPE_NOTIFICATION,     /**< Notification volume type */
205     AUDIO_VOLUME_TYPE_ALARM,            /**< Alarm volume type */
206     AUDIO_VOLUME_TYPE_RINGTONE,         /**< Ringtone volume type */
207     AUDIO_VOLUME_TYPE_MEDIA,            /**< Media volume type */
208     AUDIO_VOLUME_TYPE_CALL,             /**< Call volume type */
209     AUDIO_VOLUME_TYPE_VOIP,             /**< VOIP volume type */
210     AUDIO_VOLUME_TYPE_VOICE,            /**< Voice volume type */
211     AUDIO_VOLUME_TYPE_MAX,              /**< Volume type count */
212 } audio_volume_e;
213
214 typedef enum audio_gain {
215     AUDIO_GAIN_TYPE_DEFAULT,
216     AUDIO_GAIN_TYPE_DIALER,
217     AUDIO_GAIN_TYPE_TOUCH,
218     AUDIO_GAIN_TYPE_AF,
219     AUDIO_GAIN_TYPE_SHUTTER1,
220     AUDIO_GAIN_TYPE_SHUTTER2,
221     AUDIO_GAIN_TYPE_CAMCODING,
222     AUDIO_GAIN_TYPE_MIDI,
223     AUDIO_GAIN_TYPE_BOOTING,
224     AUDIO_GAIN_TYPE_VIDEO,
225     AUDIO_GAIN_TYPE_TTS,
226     AUDIO_GAIN_TYPE_MAX,
227 } audio_gain_e;
228
229 typedef struct audio_volume_value_table {
230     double volume[AUDIO_VOLUME_TYPE_MAX][AUDIO_VOLUME_LEVEL_MAX];
231     double gain[AUDIO_GAIN_TYPE_MAX];
232 } audio_volume_value_table_s;
233
234 enum {
235     AUDIO_DEVICE_DIRECTION_IN  = 0x01,
236     AUDIO_DEVICE_DIRECTION_OUT = 0x02
237 };
238
239 enum {
240     AUDIO_VOLUME_DEVICE_DEFAULT,
241     AUDIO_VOLUME_DEVICE_MAX,
242 };
243
244 typedef struct audio_hal_volume {
245     uint32_t volume_level_max[AUDIO_VOLUME_LEVEL_MAX];
246     uint32_t volume_level[AUDIO_VOLUME_TYPE_MAX];
247     audio_volume_value_table_s *volume_value_table;
248 } audio_hal_volume_s;
249
250 /* UCM */
251 typedef struct audio_hal_ucm {
252     snd_use_case_mgr_t* uc_mgr;
253 } audio_hal_ucm_s;
254
255 /* Mixer */
256 typedef struct audio_hal_mixer {
257     snd_mixer_t *mixer;
258     pthread_mutex_t mutex;
259     struct {
260         snd_ctl_elem_value_t *value;
261         snd_ctl_elem_id_t *id;
262         snd_ctl_elem_info_t *info;
263     } control;
264 } audio_hal_mixer_s;
265
266 /* Audio format */
267 typedef enum audio_sample_format {
268     AUDIO_SAMPLE_U8,
269     AUDIO_SAMPLE_ALAW,
270     AUDIO_SAMPLE_ULAW,
271     AUDIO_SAMPLE_S16LE,
272     AUDIO_SAMPLE_S16BE,
273     AUDIO_SAMPLE_FLOAT32LE,
274     AUDIO_SAMPLE_FLOAT32BE,
275     AUDIO_SAMPLE_S32LE,
276     AUDIO_SAMPLE_S32BE,
277     AUDIO_SAMPLE_S24LE,
278     AUDIO_SAMPLE_S24BE,
279     AUDIO_SAMPLE_S24_32LE,
280     AUDIO_SAMPLE_S24_32BE,
281     AUDIO_SAMPLE_MAX,
282     AUDIO_SAMPLE_INVALID = -1
283 } audio_sample_format_s;
284
285 typedef struct audio_hal_comm {
286     message_cb msg_cb;
287     void *user_data;
288 } audio_hal_comm_s;
289
290 /* Overall */
291 #define MAX_DIRECTION 2
292 typedef struct audio_hal {
293     audio_hal_device_s device;
294     audio_hal_volume_s volume;
295     audio_hal_ucm_s ucm;
296     audio_hal_mixer_s mixer;
297     audio_hal_comm_s comm;
298     audio_route_info_s *saved_route_infos[MAX_DIRECTION];
299     bool call_wideband;
300 } audio_hal_s;
301
302 audio_return_e _audio_ctrl_init(audio_hal_s *ah);
303 audio_return_e _audio_ctrl_deinit(audio_hal_s *ah);
304 audio_return_e _audio_volume_init(audio_hal_s *ah);
305 audio_return_e _audio_volume_deinit(audio_hal_s *ah);
306 audio_return_e _audio_routing_init(audio_hal_s *ah);
307 audio_return_e _audio_routing_deinit(audio_hal_s *ah);
308 audio_return_e _audio_stream_init(audio_hal_s *ah);
309 audio_return_e _audio_stream_deinit(audio_hal_s *ah);
310 audio_return_e _audio_pcm_init(audio_hal_s *ah);
311 audio_return_e _audio_pcm_deinit(audio_hal_s *ah);
312 audio_return_e _audio_comm_init(audio_hal_s *ah);
313 audio_return_e _audio_comm_deinit(audio_hal_s *ah);
314 audio_return_e _audio_comm_send_message(audio_hal_s *ah, const char *name, int value);
315
316 typedef struct _dump_data {
317     char *strbuf;
318     int left;
319     char *p;
320 } dump_data_t;
321
322 dump_data_t* _audio_dump_new(int length);
323 void _audio_dump_add_str(dump_data_t *dump, const char *fmt, ...);
324 char* _audio_dump_get_str(dump_data_t *dump);
325 void _audio_dump_free(dump_data_t *dump);
326
327 #endif