1 #ifndef footizenaudiointernalfoo
2 #define footizenaudiointernalfoo
7 * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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.
26 #include <sys/types.h>
27 #include <asoundlib.h>
28 #ifdef __USE_TINYALSA__
29 #include <tinyalsa/asoundlib.h>
33 #include "tizen-audio.h"
38 #define PROPERTY_VALUE_MAX 92
40 #define AUDIO_DUMP_STR_LEN 256
41 #define AUDIO_DEVICE_INFO_LIST_MAX 16
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__)
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__)
60 #define AUDIO_RETURN_IF_FAIL(expr) do { \
62 AUDIO_LOG_ERROR("%s failed", #expr); \
66 #define AUDIO_RETURN_VAL_IF_FAIL(expr, val) do { \
68 AUDIO_LOG_ERROR("%s failed", #expr); \
72 #define AUDIO_RETURN_NULL_IF_FAIL(expr) do { \
74 AUDIO_LOG_ERROR("%s failed", #expr); \
79 static device_type_t 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" },
89 static device_type_t 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" },
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,
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),
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),
144 typedef struct device_type {
150 #define AUDIO_USE_CASE_VERB_INACTIVE "Inactive"
151 #define AUDIO_USE_CASE_VERB_HIFI "HiFi"
152 #define AUDIO_USE_CASE_VERB_VOICECALL "Voice"
153 #define AUDIO_USE_CASE_VERB_VOIP "VoIP"
155 #define streq !strcmp
156 #define strneq strcmp
158 #define ALSA_DEFAULT_CARD "Exynos9110Sound"
161 #define VOICE_PCM_DEVICE "hw:0,1"
162 #define BT_PCM_DEVICE "hw:0,2"
164 #define MAX_DEVICES 5
165 #define MAX_NAME_LEN 32
167 /* type definitions */
168 typedef signed char int8_t;
172 snd_pcm_format_t format;
175 } audio_pcm_sample_spec_t;
178 typedef enum audio_route_mode {
182 } audio_route_mode_t;
187 } audio_pcm_devices_t;
189 typedef struct audio_hal_device {
192 audio_pcm_devices_t voice_pcm;
193 audio_pcm_devices_t bt_pcm;
194 audio_route_mode_t mode;
197 } audio_hal_device_t;
200 #define AUDIO_VOLUME_LEVEL_MAX 16
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 */
214 typedef enum audio_gain {
215 AUDIO_GAIN_TYPE_DEFAULT,
216 AUDIO_GAIN_TYPE_DIALER,
217 AUDIO_GAIN_TYPE_TOUCH,
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,
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_t;
235 AUDIO_DEVICE_DIRECTION_IN = 0x01,
236 AUDIO_DEVICE_DIRECTION_OUT = 0x02
240 AUDIO_VOLUME_DEVICE_DEFAULT,
241 AUDIO_VOLUME_DEVICE_MAX,
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_t *volume_value_table;
248 } audio_hal_volume_t;
251 typedef struct audio_hal_ucm {
252 snd_use_case_mgr_t* uc_mgr;
256 typedef struct audio_hal_mixer {
258 pthread_mutex_t mutex;
260 snd_ctl_elem_value_t *value;
261 snd_ctl_elem_id_t *id;
262 snd_ctl_elem_info_t *info;
267 typedef enum audio_sample_format {
273 AUDIO_SAMPLE_FLOAT32LE,
274 AUDIO_SAMPLE_FLOAT32BE,
279 AUDIO_SAMPLE_S24_32LE,
280 AUDIO_SAMPLE_S24_32BE,
282 AUDIO_SAMPLE_INVALID = -1
283 } audio_sample_format_t;
285 typedef struct audio_hal_comm {
291 #define MAX_DIRECTION 2
292 typedef struct audio_hal {
293 audio_hal_device_t device;
294 audio_hal_volume_t volume;
296 audio_hal_mixer_t mixer;
297 audio_hal_comm_t comm;
298 audio_route_info_s *saved_route_infos[MAX_DIRECTION];
302 audio_return_e _audio_ctrl_init(audio_hal_t *ah);
303 audio_return_e _audio_ctrl_deinit(audio_hal_t *ah);
304 audio_return_e _audio_volume_init(audio_hal_t *ah);
305 audio_return_e _audio_volume_deinit(audio_hal_t *ah);
306 audio_return_e _audio_routing_init(audio_hal_t *ah);
307 audio_return_e _audio_routing_deinit(audio_hal_t *ah);
308 audio_return_e _audio_stream_init(audio_hal_t *ah);
309 audio_return_e _audio_stream_deinit(audio_hal_t *ah);
310 audio_return_e _audio_pcm_init(audio_hal_t *ah);
311 audio_return_e _audio_pcm_deinit(audio_hal_t *ah);
312 audio_return_e _audio_comm_init(audio_hal_t *ah);
313 audio_return_e _audio_comm_deinit(audio_hal_t *ah);
314 audio_return_e _audio_comm_send_message(audio_hal_t *ah, const char *name, int value);
316 typedef struct _dump_data {
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);