Fix for audio-hal testcase
[platform/adaptation/samsung_exynos/audio-hal-max98090.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 <dlog.h>
24 #include <time.h>
25 #include <sys/types.h>
26 #include <asoundlib.h>
27 #ifdef __USE_TINYALSA__
28 #include <tinyalsa/asoundlib.h>
29 #endif
30 #include <pthread.h>
31 #include <use-case.h>
32 #include "tizen-audio.h"
33
34 /* Debug */
35
36 //#define AUDIO_DEBUG
37 #define PROPERTY_VALUE_MAX 92
38 #define BUF_SIZE 1024
39 #define AUDIO_DUMP_STR_LEN              256
40 #define AUDIO_DEVICE_INFO_LIST_MAX      16
41 #ifdef USE_DLOG
42 #ifdef DLOG_TAG
43 #undef DLOG_TAG
44 #endif
45 #define DLOG_TAG "AUDIO_HAL"
46 #define AUDIO_LOG_ERROR(...)            SLOG(LOG_ERROR, DLOG_TAG, __VA_ARGS__)
47 #define AUDIO_LOG_WARN(...)             SLOG(LOG_WARN, DLOG_TAG, __VA_ARGS__)
48 #define AUDIO_LOG_INFO(...)             SLOG(LOG_INFO, DLOG_TAG, __VA_ARGS__)
49 #define AUDIO_LOG_DEBUG(...)            SLOG(LOG_DEBUG, DLOG_TAG, __VA_ARGS__)
50 #define AUDIO_LOG_VERBOSE(...)          SLOG(LOG_DEBUG, DLOG_TAG, __VA_ARGS__)
51 #else
52 #define AUDIO_LOG_ERROR(...)            fprintf(stderr, __VA_ARGS__)
53 #define AUDIO_LOG_WARN(...)             fprintf(stderr, __VA_ARGS__)
54 #define AUDIO_LOG_INFO(...)             fprintf(stdout, __VA_ARGS__)
55 #define AUDIO_LOG_DEBUG(...)            fprintf(stdout, __VA_ARGS__)
56 #define AUDIO_LOG_VERBOSE(...)          fprintf(stdout, __VA_ARGS__)
57 #endif
58
59 #define AUDIO_RETURN_IF_FAIL(expr) do { \
60     if (!(expr)) { \
61         AUDIO_LOG_ERROR("%s failed", #expr); \
62         return; \
63     } \
64 } while (0)
65 #define AUDIO_RETURN_VAL_IF_FAIL(expr, val) do { \
66     if (!(expr)) { \
67         AUDIO_LOG_ERROR("%s failed", #expr); \
68         return val; \
69     } \
70 } while (0)
71 #define AUDIO_RETURN_NULL_IF_FAIL(expr) do { \
72     if (!(expr)) { \
73         AUDIO_LOG_ERROR("%s failed", #expr); \
74         return NULL; \
75     } \
76 } while (0)
77
78 /* Devices : Normal  */
79 #define AUDIO_DEVICE_OUT               0x00000000
80 #define AUDIO_DEVICE_IN                0x80000000
81 enum audio_device_type {
82     AUDIO_DEVICE_NONE                 = 0,
83
84     /* output devices */
85     AUDIO_DEVICE_OUT_SPEAKER          = AUDIO_DEVICE_OUT | 0x00000001,
86     AUDIO_DEVICE_OUT_RECEIVER         = AUDIO_DEVICE_OUT | 0x00000002,
87     AUDIO_DEVICE_OUT_JACK             = AUDIO_DEVICE_OUT | 0x00000004,
88     AUDIO_DEVICE_OUT_BT_SCO           = AUDIO_DEVICE_OUT | 0x00000008,
89     AUDIO_DEVICE_OUT_AUX              = AUDIO_DEVICE_OUT | 0x00000010,
90     AUDIO_DEVICE_OUT_HDMI             = AUDIO_DEVICE_OUT | 0x00000020,
91     AUDIO_DEVICE_OUT_ALL              = (AUDIO_DEVICE_OUT_SPEAKER |
92                                          AUDIO_DEVICE_OUT_RECEIVER |
93                                          AUDIO_DEVICE_OUT_JACK |
94                                          AUDIO_DEVICE_OUT_BT_SCO |
95                                          AUDIO_DEVICE_OUT_AUX |
96                                          AUDIO_DEVICE_OUT_HDMI),
97     /* input devices */
98     AUDIO_DEVICE_IN_MAIN_MIC          = AUDIO_DEVICE_IN | 0x00000001,
99     AUDIO_DEVICE_IN_SUB_MIC           = AUDIO_DEVICE_IN | 0x00000002,
100     AUDIO_DEVICE_IN_JACK              = AUDIO_DEVICE_IN | 0x00000004,
101     AUDIO_DEVICE_IN_BT_SCO            = AUDIO_DEVICE_IN | 0x00000008,
102     AUDIO_DEVICE_IN_ALL               = (AUDIO_DEVICE_IN_MAIN_MIC |
103                                          AUDIO_DEVICE_IN_SUB_MIC |
104                                          AUDIO_DEVICE_IN_JACK |
105                                          AUDIO_DEVICE_IN_BT_SCO),
106 };
107
108 typedef struct device_type {
109     uint32_t type;
110     const char *name;
111 } device_type_t;
112
113 /* Verbs */
114 #define AUDIO_USE_CASE_VERB_INACTIVE                "Inactive"
115 #define AUDIO_USE_CASE_VERB_HIFI                    "HiFi"
116
117 /* Modifiers */
118 #define AUDIO_USE_CASE_MODIFIER_VOICESEARCH              "VoiceSearch"
119 #define AUDIO_USE_CASE_MODIFIER_CAMCORDING               "Camcording"
120 #define AUDIO_USE_CASE_MODIFIER_MEDIA                    "Media"
121 #define AUDIO_USE_CASE_MODIFIER_DUAL_MEDIA               "DualMedia"
122
123 #define streq !strcmp
124 #define strneq strcmp
125
126 #define ALSA_DEFAULT_CARD       "max98090"
127
128 #define MAX_DEVICES             5
129 #define MAX_MODIFIERS           5
130 #define MAX_NAME_LEN           32
131
132 /* type definitions */
133 typedef signed char int8_t;
134
135 /* PCM */
136 typedef struct {
137     snd_pcm_format_t format;
138     uint32_t rate;
139     uint8_t channels;
140 } audio_pcm_sample_spec_t;
141
142 /* Routing */
143 typedef enum audio_route_mode {
144     VERB_NORMAL,
145 } audio_route_mode_t;
146
147 typedef struct audio_hal_device {
148     uint32_t active_in;
149     uint32_t active_out;
150     snd_pcm_t *pcm_in;
151     snd_pcm_t *pcm_out;
152     pthread_mutex_t pcm_lock;
153     uint32_t pcm_count;
154     audio_route_mode_t mode;
155 } audio_hal_device_t;
156
157 /* Volume */
158 #define AUDIO_VOLUME_LEVEL_MAX 16
159
160 typedef enum audio_volume {
161     AUDIO_VOLUME_TYPE_SYSTEM,           /**< System volume type */
162     AUDIO_VOLUME_TYPE_NOTIFICATION,     /**< Notification volume type */
163     AUDIO_VOLUME_TYPE_ALARM,            /**< Alarm volume type */
164     AUDIO_VOLUME_TYPE_RINGTONE,         /**< Ringtone volume type */
165     AUDIO_VOLUME_TYPE_MEDIA,            /**< Media volume type */
166     AUDIO_VOLUME_TYPE_CALL,             /**< Call volume type */
167     AUDIO_VOLUME_TYPE_VOIP,             /**< VOIP volume type */
168     AUDIO_VOLUME_TYPE_VOICE,            /**< Voice volume type */
169     AUDIO_VOLUME_TYPE_MAX,              /**< Volume type count */
170 } audio_volume_t;
171
172 typedef enum audio_gain {
173     AUDIO_GAIN_TYPE_DEFAULT,
174     AUDIO_GAIN_TYPE_DIALER,
175     AUDIO_GAIN_TYPE_TOUCH,
176     AUDIO_GAIN_TYPE_AF,
177     AUDIO_GAIN_TYPE_SHUTTER1,
178     AUDIO_GAIN_TYPE_SHUTTER2,
179     AUDIO_GAIN_TYPE_CAMCODING,
180     AUDIO_GAIN_TYPE_MIDI,
181     AUDIO_GAIN_TYPE_BOOTING,
182     AUDIO_GAIN_TYPE_VIDEO,
183     AUDIO_GAIN_TYPE_TTS,
184     AUDIO_GAIN_TYPE_MAX,
185 } audio_gain_t;
186
187 typedef struct audio_volume_value_table {
188     double volume[AUDIO_VOLUME_TYPE_MAX][AUDIO_VOLUME_LEVEL_MAX];
189     double gain[AUDIO_GAIN_TYPE_MAX];
190 } audio_volume_value_table_t;
191
192 enum {
193     AUDIO_VOLUME_DEVICE_DEFAULT,
194     AUDIO_VOLUME_DEVICE_MAX,
195 };
196
197 typedef struct audio_hal_volume {
198     uint32_t volume_level_max[AUDIO_VOLUME_LEVEL_MAX];
199     uint32_t volume_level[AUDIO_VOLUME_TYPE_MAX];
200     audio_volume_value_table_t *volume_value_table;
201 } audio_hal_volume_t;
202
203 /* UCM */
204 typedef struct audio_hal_ucm {
205     snd_use_case_mgr_t* uc_mgr;
206 } audio_hal_ucm_t;
207
208 /* Mixer */
209 typedef struct audio_hal_mixer {
210     snd_mixer_t *mixer;
211     pthread_mutex_t mutex;
212     struct {
213         snd_ctl_elem_value_t *value;
214         snd_ctl_elem_id_t *id;
215         snd_ctl_elem_info_t *info;
216     } control;
217 } audio_hal_mixer_t;
218
219 /* Audio format */
220 typedef enum audio_sample_format {
221     AUDIO_SAMPLE_U8,
222     AUDIO_SAMPLE_ALAW,
223     AUDIO_SAMPLE_ULAW,
224     AUDIO_SAMPLE_S16LE,
225     AUDIO_SAMPLE_S16BE,
226     AUDIO_SAMPLE_FLOAT32LE,
227     AUDIO_SAMPLE_FLOAT32BE,
228     AUDIO_SAMPLE_S32LE,
229     AUDIO_SAMPLE_S32BE,
230     AUDIO_SAMPLE_S24LE,
231     AUDIO_SAMPLE_S24BE,
232     AUDIO_SAMPLE_S24_32LE,
233     AUDIO_SAMPLE_S24_32BE,
234     AUDIO_SAMPLE_MAX,
235     AUDIO_SAMPLE_INVALID = -1
236 } audio_sample_format_t;
237
238 typedef struct audio_hal_comm {
239     message_cb msg_cb;
240     void *user_data;
241 } audio_hal_comm_t;
242
243 /* Overall */
244 typedef struct audio_hal {
245     audio_hal_device_t device;
246     audio_hal_volume_t volume;
247     audio_hal_ucm_t ucm;
248     audio_hal_mixer_t mixer;
249     audio_hal_comm_t comm;
250 } audio_hal_t;
251
252 audio_return_t _audio_ctrl_init(audio_hal_t *ah);
253 audio_return_t _audio_ctrl_deinit(audio_hal_t *ah);
254 audio_return_t _audio_volume_init(audio_hal_t *ah);
255 audio_return_t _audio_volume_deinit(audio_hal_t *ah);
256 audio_return_t _audio_routing_init(audio_hal_t *ah);
257 audio_return_t _audio_routing_deinit(audio_hal_t *ah);
258 audio_return_t _audio_stream_init(audio_hal_t *ah);
259 audio_return_t _audio_stream_deinit(audio_hal_t *ah);
260 audio_return_t _audio_pcm_init(audio_hal_t *ah);
261 audio_return_t _audio_pcm_deinit(audio_hal_t *ah);
262 audio_return_t _audio_comm_init(audio_hal_t *ah);
263 audio_return_t _audio_comm_deinit(audio_hal_t *ah);
264 audio_return_t _audio_comm_send_message(audio_hal_t *ah, const char *name, int value);
265
266 typedef struct _dump_data {
267     char *strbuf;
268     int left;
269     char *p;
270 } dump_data_t;
271
272 dump_data_t* _audio_dump_new(int length);
273 void _audio_dump_add_str(dump_data_t *dump, const char *fmt, ...);
274 char* _audio_dump_get_str(dump_data_t *dump);
275 void _audio_dump_free(dump_data_t *dump);
276
277 #endif