Correct VOICE_PCM_DEVICE to "hw:sprdphone,1" and remove an unused device AUDIO_DEVICE...
[platform/adaptation/spreadtrum/audio-hal-sc7727.git] / tizen-audio-internal.h
1 #ifndef footizenaudiointernalfoo
2 #define footizenaudiointernalfoo
3
4 /*
5  * audio-hal
6  *
7  * Copyright (c) 2000 - 2013 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_HDMI             = AUDIO_DEVICE_OUT | 0x00000010,
90     AUDIO_DEVICE_OUT_ALL              = (AUDIO_DEVICE_OUT_SPEAKER |
91                                          AUDIO_DEVICE_OUT_RECEIVER |
92                                          AUDIO_DEVICE_OUT_JACK |
93                                          AUDIO_DEVICE_OUT_BT_SCO |
94                                          AUDIO_DEVICE_OUT_HDMI),
95     /* input devices */
96     AUDIO_DEVICE_IN_MAIN_MIC          = AUDIO_DEVICE_IN | 0x00000001,
97     AUDIO_DEVICE_IN_SUB_MIC           = AUDIO_DEVICE_IN | 0x00000002,
98     AUDIO_DEVICE_IN_JACK              = AUDIO_DEVICE_IN | 0x00000004,
99     AUDIO_DEVICE_IN_BT_SCO            = AUDIO_DEVICE_IN | 0x00000008,
100     AUDIO_DEVICE_IN_ALL               = (AUDIO_DEVICE_IN_MAIN_MIC |
101                                          AUDIO_DEVICE_IN_SUB_MIC |
102                                          AUDIO_DEVICE_IN_JACK |
103                                          AUDIO_DEVICE_IN_BT_SCO),
104 };
105
106 typedef struct device_type {
107     uint32_t type;
108     const char *name;
109 } device_type_t;
110
111 /* Verbs */
112 #define AUDIO_USE_CASE_VERB_INACTIVE                "Inactive"
113 #define AUDIO_USE_CASE_VERB_HIFI                    "HiFi"
114 #define AUDIO_USE_CASE_VERB_VOICECALL               "VoiceCall"
115 #define AUDIO_USE_CASE_VERB_LOOPBACK                "Loopback"
116 #define AUDIO_USE_CASE_VERB_FMRADIO                 "FM_Radio"
117
118 /* Modifiers */
119 #define AUDIO_USE_CASE_MODIFIER_VOICESEARCH              "VoiceSearch"
120 #define AUDIO_USE_CASE_MODIFIER_CAMCORDING               "Camcording"
121 #define AUDIO_USE_CASE_MODIFIER_RINGTONE                 "Ringtone"
122 #define AUDIO_USE_CASE_MODIFIER_DUAL_RINGTONE            "DualRingtone"
123 #define AUDIO_USE_CASE_MODIFIER_MEDIA                    "Media"
124 #define AUDIO_USE_CASE_MODIFIER_DUAL_MEDIA               "DualMedia"
125
126 #define streq !strcmp
127 #define strneq strcmp
128
129 #define ALSA_DEFAULT_CARD       "sprdphone"
130 #define VOICE_PCM_DEVICE        "hw:sprdphone,1"
131 #define PLAYBACK_PCM_DEVICE     "hw:sprdphone,0"
132 #define CAPTURE_PCM_DEVICE      "hw:sprdphone,0"
133
134 #define PLAYBACK_CARD_ID        ALSA_DEFAULT_CARD
135 #define PLAYBACK_PCM_DEVICE_ID  0
136
137 #define CAPTURE_CARD_ID         ALSA_DEFAULT_CARD
138 #define CAPTURE_PCM_DEVICE_ID   0
139
140 #define MAX_DEVICES             5
141 #define MAX_MODIFIERS           5
142 #define MAX_NAME_LEN           32
143
144 /* type definitions */
145 typedef signed char int8_t;
146
147 /* pcm */
148 typedef struct {
149     snd_pcm_format_t format;
150     uint32_t rate;
151     uint8_t channels;
152 } audio_pcm_sample_spec_t;
153
154 /* Device */
155 typedef enum audio_device_api {
156     AUDIO_DEVICE_API_UNKNOWN,
157     AUDIO_DEVICE_API_ALSA,
158     AUDIO_DEVICE_API_BLUEZ,
159 } audio_device_api_t;
160
161 typedef struct audio_device_alsa_info {
162     char *card_name;
163     uint32_t card_idx;
164     uint32_t device_idx;
165 } audio_device_alsa_info_t;
166
167 typedef struct audio_device_bluz_info {
168     char *protocol;
169     uint32_t nrec;
170 } audio_device_bluez_info_t;
171
172 typedef struct audio_device_info {
173     audio_device_api_t api;
174     audio_direction_t direction;
175     char *name;
176     uint8_t is_default_device;
177     union {
178         audio_device_alsa_info_t alsa;
179         audio_device_bluez_info_t bluez;
180     };
181 } audio_device_info_t;
182
183 typedef enum audio_route_mode {
184     VERB_NORMAL,
185     VERB_CALL,
186     VERB_VOIP
187 } audio_route_mode_t;
188
189 typedef struct audio_hal_device {
190     uint32_t active_in;
191     uint32_t active_out;
192     snd_pcm_t *pcm_in;
193     snd_pcm_t *pcm_out;
194     pthread_mutex_t pcm_lock;
195     uint32_t pcm_count;
196     audio_route_mode_t mode;
197 } audio_hal_device_t;
198
199
200 /* Stream */
201 #define AUDIO_VOLUME_LEVEL_MAX 16
202
203 typedef enum audio_volume {
204     AUDIO_VOLUME_TYPE_SYSTEM,           /**< System volume type */
205     AUDIO_VOLUME_TYPE_NOTIFICATION,     /**< Notification volume type */
206     AUDIO_VOLUME_TYPE_ALARM,            /**< Alarm volume type */
207     AUDIO_VOLUME_TYPE_RINGTONE,         /**< Ringtone volume type */
208     AUDIO_VOLUME_TYPE_MEDIA,            /**< Media volume type */
209     AUDIO_VOLUME_TYPE_CALL,             /**< Call volume type */
210     AUDIO_VOLUME_TYPE_VOIP,             /**< VOIP volume type */
211     AUDIO_VOLUME_TYPE_VOICE,            /**< Voice volume type */
212     AUDIO_VOLUME_TYPE_MAX,              /**< Volume type count */
213 } audio_volume_t;
214
215 typedef enum audio_gain {
216     AUDIO_GAIN_TYPE_DEFAULT,
217     AUDIO_GAIN_TYPE_DIALER,
218     AUDIO_GAIN_TYPE_TOUCH,
219     AUDIO_GAIN_TYPE_AF,
220     AUDIO_GAIN_TYPE_SHUTTER1,
221     AUDIO_GAIN_TYPE_SHUTTER2,
222     AUDIO_GAIN_TYPE_CAMCODING,
223     AUDIO_GAIN_TYPE_MIDI,
224     AUDIO_GAIN_TYPE_BOOTING,
225     AUDIO_GAIN_TYPE_VIDEO,
226     AUDIO_GAIN_TYPE_TTS,
227     AUDIO_GAIN_TYPE_MAX,
228 } audio_gain_t;
229
230 typedef struct audio_volume_value_table {
231     double volume[AUDIO_VOLUME_TYPE_MAX][AUDIO_VOLUME_LEVEL_MAX];
232     uint32_t volume_level_max[AUDIO_VOLUME_LEVEL_MAX];
233     double gain[AUDIO_GAIN_TYPE_MAX];
234 } audio_volume_value_table_t;
235
236 enum {
237     AUDIO_VOLUME_DEVICE_DEFAULT,
238     AUDIO_VOLUME_DEVICE_MAX,
239 };
240
241 typedef struct audio_hal_volume {
242     uint32_t volume_level[AUDIO_VOLUME_TYPE_MAX];
243     audio_volume_value_table_t *volume_value_table;
244 } audio_hal_volume_t;
245
246 typedef struct audio_hal_ucm {
247     snd_use_case_mgr_t* uc_mgr;
248 } audio_hal_ucm_t;
249
250 typedef struct audio_hal_mixer {
251     snd_mixer_t *mixer;
252     pthread_mutex_t mutex;
253     struct {
254         snd_ctl_elem_value_t *value;
255         snd_ctl_elem_id_t *id;
256         snd_ctl_elem_info_t *info;
257     } control;
258 } audio_hal_mixer_t;
259
260 /* Audio format */
261 typedef enum audio_sample_format {
262     AUDIO_SAMPLE_U8,
263     AUDIO_SAMPLE_ALAW,
264     AUDIO_SAMPLE_ULAW,
265     AUDIO_SAMPLE_S16LE,
266     AUDIO_SAMPLE_S16BE,
267     AUDIO_SAMPLE_FLOAT32LE,
268     AUDIO_SAMPLE_FLOAT32BE,
269     AUDIO_SAMPLE_S32LE,
270     AUDIO_SAMPLE_S32BE,
271     AUDIO_SAMPLE_S24LE,
272     AUDIO_SAMPLE_S24BE,
273     AUDIO_SAMPLE_S24_32LE,
274     AUDIO_SAMPLE_S24_32BE,
275     AUDIO_SAMPLE_MAX,
276     AUDIO_SAMPLE_INVALID = -1
277 } audio_sample_format_t;
278
279 /* Overall */
280 typedef struct audio_hal {
281     audio_hal_device_t device;
282     audio_hal_volume_t volume;
283     audio_hal_ucm_t ucm;
284     audio_hal_mixer_t mixer;
285 } audio_hal_t;
286
287 typedef struct {
288     unsigned short      is_open; /* if is_open is true, open device; else close device.*/
289     unsigned short      is_headphone;
290     unsigned int        is_downlink_mute;
291     unsigned int        is_uplink_mute;
292 } device_ctrl_t;
293
294 typedef struct samplerate_ctrl {
295     unsigned int samplerate; /* change samplerate.*/
296 } set_samplerate_t;
297
298 audio_return_t _audio_volume_init(audio_hal_t *ah);
299 audio_return_t _audio_volume_deinit(audio_hal_t *ah);
300
301 audio_return_t _audio_device_init(audio_hal_t *ah);
302 audio_return_t _audio_device_deinit(audio_hal_t *ah);
303 audio_return_t _audio_ucm_init(audio_hal_t *ah);
304 audio_return_t _audio_ucm_deinit(audio_hal_t *ah);
305 void _audio_ucm_get_device_name(audio_hal_t *ah, const char *use_case, audio_direction_t direction, const char **value);
306 #define _audio_ucm_update_use_case _audio_ucm_set_use_case
307 audio_return_t _audio_ucm_set_use_case(audio_hal_t *ah, const char *verb, const char *devices[], const char *modifiers[]);
308 audio_return_t _audio_ucm_set_devices(audio_hal_t *ah, const char *verb, const char *devices[]);
309 audio_return_t _audio_ucm_set_modifiers(audio_hal_t *ah, const char *verb, const char *modifiers[]);
310 int _audio_ucm_fill_device_info_list(audio_hal_t *ah, audio_device_info_t *device_info_list, const char *verb);
311 int _voice_pcm_open(audio_hal_t *ah);
312 int _voice_pcm_close(audio_hal_t *ah, uint32_t direction);
313 audio_return_t _audio_ucm_get_verb(audio_hal_t *ah, const char **value);
314 audio_return_t _audio_ucm_reset_use_case(audio_hal_t *ah);
315 audio_return_t _audio_util_init (audio_hal_t *ah);
316 audio_return_t _audio_util_deinit (audio_hal_t *ah);
317 audio_return_t _audio_mixer_control_set_param(audio_hal_t *ah, const char* ctl_name, snd_ctl_elem_value_t* value, int size);
318 audio_return_t _audio_mixer_control_set_value(audio_hal_t *ah, const char *ctl_name, int val);
319 audio_return_t _audio_mixer_control_set_value_string(audio_hal_t *ah, const char* ctl_name, const char* value);
320 audio_return_t _audio_mixer_control_get_value(audio_hal_t *ah, const char *ctl_name, int *val);
321 audio_return_t _audio_mixer_control_get_element(audio_hal_t *ah, const char *ctl_name, snd_hctl_elem_t **elem);
322 audio_return_t _audio_pcm_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, uint8_t period_event);
323 audio_return_t _audio_pcm_set_hw_params(snd_pcm_t *pcm, audio_pcm_sample_spec_t *sample_spec, uint8_t *use_mmap, snd_pcm_uframes_t *period_size, snd_pcm_uframes_t *buffer_size);
324 uint32_t _convert_format(audio_sample_format_t format);
325 #endif