Initialization audio HAL for SC7727 (target:TM1)
[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
72 /* Devices : Normal  */
73 enum audio_device_type {
74     AUDIO_DEVICE_NONE                 = 0,
75
76     /* output devices */
77     AUDIO_DEVICE_OUT_SPEAKER          = 0x00000001,
78     AUDIO_DEVICE_OUT_RECEIVER         = 0x00000002,
79     AUDIO_DEVICE_OUT_JACK             = 0x00000004,
80     AUDIO_DEVICE_OUT_BT_SCO           = 0x00000008,
81     AUDIO_DEVICE_OUT_AUX              = 0x00000010,
82     AUDIO_DEVICE_OUT_HDMI             = 0x00000020,
83     AUDIO_DEVICE_OUT_ALL              = (AUDIO_DEVICE_OUT_SPEAKER |
84                                          AUDIO_DEVICE_OUT_RECEIVER |
85                                          AUDIO_DEVICE_OUT_JACK |
86                                          AUDIO_DEVICE_OUT_BT_SCO |
87                                          AUDIO_DEVICE_OUT_AUX |
88                                          AUDIO_DEVICE_OUT_HDMI),
89     /* input devices */
90     AUDIO_DEVICE_IN_MAIN_MIC          = 0x80000001,
91     AUDIO_DEVICE_IN_SUB_MIC           = 0x80000002,
92     AUDIO_DEVICE_IN_JACK              = 0x80000004,
93     AUDIO_DEVICE_IN_BT_SCO            = 0x80000008,
94     AUDIO_DEVICE_IN_ALL               = (AUDIO_DEVICE_IN_MAIN_MIC |
95                                          AUDIO_DEVICE_IN_SUB_MIC |
96                                          AUDIO_DEVICE_IN_JACK |
97                                          AUDIO_DEVICE_IN_BT_SCO),
98 };
99
100 typedef struct device_type {
101     uint32_t type;
102     const char *name;
103 } device_type_t;
104
105 /* Verbs */
106 #define AUDIO_USE_CASE_VERB_INACTIVE                "Inactive"
107 #define AUDIO_USE_CASE_VERB_HIFI                    "HiFi"
108 #define AUDIO_USE_CASE_VERB_VOICECALL               "VoiceCall"
109 #define AUDIO_USE_CASE_VERB_LOOPBACK                "Loopback"
110 #define AUDIO_USE_CASE_VERB_FMRADIO                 "FM_Radio"
111
112 /* Modifiers */
113 #define AUDIO_USE_CASE_MODIFIER_VOICESEARCH              "VoiceSearch"
114 #define AUDIO_USE_CASE_MODIFIER_CAMCORDING               "Camcording"
115 #define AUDIO_USE_CASE_MODIFIER_RINGTONE                 "Ringtone"
116 #define AUDIO_USE_CASE_MODIFIER_DUAL_RINGTONE            "DualRingtone"
117 #define AUDIO_USE_CASE_MODIFIER_MEDIA                    "Media"
118 #define AUDIO_USE_CASE_MODIFIER_DUAL_MEDIA               "DualMedia"
119
120 #define streq !strcmp
121 #define strneq strcmp
122
123 #define ALSA_DEFAULT_CARD       "sprdphone"
124 #define VOICE_PCM_DEVICE        "hw:0,1"
125 #define PLAYBACK_PCM_DEVICE     "hw:sprdphone,0"
126 #define CAPTURE_PCM_DEVICE      "hw:sprdphone,0"
127
128 #define PLAYBACK_CARD_ID        ALSA_DEFAULT_CARD
129 #define PLAYBACK_PCM_DEVICE_ID  0
130
131 #define CAPTURE_CARD_ID         ALSA_DEFAULT_CARD
132 #define CAPTURE_PCM_DEVICE_ID   0
133
134 #define MAX_DEVICES             5
135 #define MAX_MODIFIERS           5
136 #define MAX_NAME_LEN           32
137
138 /* type definitions */
139 typedef signed char int8_t;
140
141 /* pcm */
142 typedef struct {
143     snd_pcm_format_t format;
144     uint32_t rate;
145     uint8_t channels;
146 } audio_pcm_sample_spec_t;
147
148 /* Device */
149 typedef enum audio_route_mode{
150     VERB_NORMAL,
151     VERB_CALL,
152     VERB_VOIP
153 } audio_route_mode_t;
154
155 typedef struct audio_device_mgr {
156     uint32_t active_in;
157     uint32_t active_out;
158     snd_pcm_t *pcm_in;
159     snd_pcm_t *pcm_out;
160     pthread_mutex_t pcm_lock;
161     uint32_t pcm_count;
162     audio_route_mode_t mode;
163 } audio_device_mgr_t;
164
165
166 /* Stream */
167
168 #define AUDIO_VOLUME_LEVEL_MAX 16
169
170 typedef struct audio_volume_value_table {
171     double volume[AUDIO_VOLUME_TYPE_MAX][AUDIO_VOLUME_LEVEL_MAX];
172     uint32_t volume_level_max[AUDIO_VOLUME_LEVEL_MAX];
173     double gain[AUDIO_GAIN_TYPE_MAX];
174 } audio_volume_value_table_t;
175
176 enum {
177     AUDIO_VOLUME_DEVICE_DEFAULT,
178     AUDIO_VOLUME_DEVICE_MAX,
179 };
180
181 typedef struct audio_volume_mgr {
182     uint32_t volume_level[AUDIO_VOLUME_TYPE_MAX];
183     audio_volume_value_table_t *volume_value_table;
184 } audio_volume_mgr_t;
185
186 typedef struct audio_ucm_mgr {
187     snd_use_case_mgr_t* uc_mgr;
188 } audio_ucm_mgr_t;
189
190 typedef struct audio_mixer_mgr {
191     snd_mixer_t *mixer;
192     pthread_mutex_t mutex;
193     struct {
194         snd_ctl_elem_value_t *value;
195         snd_ctl_elem_id_t *id;
196         snd_ctl_elem_info_t *info;
197     } control;
198 } audio_mixer_mgr_t;
199
200 /* Overall */
201
202 typedef struct audio_mgr {
203     audio_device_mgr_t device;
204     audio_volume_mgr_t volume;
205     audio_ucm_mgr_t ucm;
206     audio_mixer_mgr_t mixer;
207 } audio_mgr_t;
208
209 typedef struct {
210     unsigned short      is_open; /* if is_open is true, open device; else close device.*/
211     unsigned short      is_headphone;
212     unsigned int        is_downlink_mute;
213     unsigned int        is_uplink_mute;
214 } device_ctrl_t;
215
216 typedef struct samplerate_ctrl {
217     unsigned int samplerate; /* change samplerate.*/
218 } set_samplerate_t;
219
220 audio_return_t _audio_volume_init (audio_mgr_t *am);
221 audio_return_t _audio_volume_deinit (audio_mgr_t *am);
222
223 audio_return_t _audio_device_init (audio_mgr_t *am);
224 audio_return_t _audio_device_deinit (audio_mgr_t * am);
225 audio_return_t _audio_ucm_init (audio_mgr_t *am);
226 audio_return_t _audio_ucm_deinit (audio_mgr_t *am);
227 void _audio_ucm_get_device_name (audio_mgr_t *am, const char *use_case, audio_direction_t direction, const char **value);
228 #define _audio_ucm_update_use_case _audio_ucm_set_use_case
229 audio_return_t _audio_ucm_set_use_case (audio_mgr_t *am, const char *verb, const char *devices[], const char *modifiers[]);
230 audio_return_t _audio_ucm_set_devices (audio_mgr_t *am, const char *verb, const char *devices[]);
231 audio_return_t _audio_ucm_set_modifiers (audio_mgr_t *am, const char *verb, const char *modifiers[]);
232 int _audio_ucm_fill_device_info_list (audio_mgr_t *am, audio_device_info_t *device_info_list, const char *verb);
233 int _voice_pcm_open(audio_mgr_t *am);
234 int _voice_pcm_close(audio_mgr_t *am, uint32_t direction);
235 audio_return_t _audio_ucm_get_verb (audio_mgr_t *am, const char **value);
236 audio_return_t _audio_ucm_reset_use_case (audio_mgr_t *am);
237 audio_return_t _audio_util_init (audio_mgr_t *am);
238 audio_return_t _audio_util_deinit (audio_mgr_t *am);
239 audio_return_t _audio_mixer_control_set_param(audio_mgr_t *am, const char* ctl_name, snd_ctl_elem_value_t* value, int size);
240 audio_return_t _audio_mixer_control_set_value(audio_mgr_t *am, const char *ctl_name, int val);
241 audio_return_t _audio_mixer_control_set_value_string(audio_mgr_t *am, const char* ctl_name, const char* value);
242 audio_return_t _audio_mixer_control_get_value(audio_mgr_t *am, const char *ctl_name, int *val);
243 audio_return_t _audio_mixer_control_get_element(audio_mgr_t *am, const char *ctl_name, snd_hctl_elem_t **elem);
244 audio_return_t _audio_pcm_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, uint8_t period_event);
245 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);
246 uint32_t _convert_format(audio_sample_format_t format);
247 #endif