1 #ifndef footizenaudiointernalfoo
2 #define footizenaudiointernalfoo
7 * Copyright (c) 2000 - 2013 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.
25 #include <sys/types.h>
26 #include <asoundlib.h>
27 #ifdef __USE_TINYALSA__
28 #include <tinyalsa/asoundlib.h>
32 #include "tizen-audio.h"
37 #define PROPERTY_VALUE_MAX 92
39 #define AUDIO_DUMP_STR_LEN 256
40 #define AUDIO_DEVICE_INFO_LIST_MAX 16
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__)
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__)
59 #define AUDIO_RETURN_IF_FAIL(expr) do { \
61 AUDIO_LOG_ERROR("%s failed", #expr); \
65 #define AUDIO_RETURN_VAL_IF_FAIL(expr, val) do { \
67 AUDIO_LOG_ERROR("%s failed", #expr); \
71 #define AUDIO_RETURN_NULL_IF_FAIL(expr) do { \
73 AUDIO_LOG_ERROR("%s failed", #expr); \
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,
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),
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),
106 typedef struct device_type {
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"
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"
126 #define streq !strcmp
127 #define strneq strcmp
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"
134 #define PLAYBACK_CARD_ID ALSA_DEFAULT_CARD
135 #define PLAYBACK_PCM_DEVICE_ID 0
137 #define CAPTURE_CARD_ID ALSA_DEFAULT_CARD
138 #define CAPTURE_PCM_DEVICE_ID 0
140 #define MAX_DEVICES 5
141 #define MAX_MODIFIERS 5
142 #define MAX_NAME_LEN 32
144 /* type definitions */
145 typedef signed char int8_t;
149 snd_pcm_format_t format;
152 } audio_pcm_sample_spec_t;
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;
161 typedef struct audio_device_alsa_info {
165 } audio_device_alsa_info_t;
167 typedef struct audio_device_bluz_info {
170 } audio_device_bluez_info_t;
172 typedef struct audio_device_info {
173 audio_device_api_t api;
174 audio_direction_t direction;
176 uint8_t is_default_device;
178 audio_device_alsa_info_t alsa;
179 audio_device_bluez_info_t bluez;
181 } audio_device_info_t;
183 typedef enum audio_route_mode {
187 } audio_route_mode_t;
189 typedef struct audio_hal_device {
194 pthread_mutex_t pcm_lock;
196 audio_route_mode_t mode;
197 } audio_hal_device_t;
201 #define AUDIO_VOLUME_LEVEL_MAX 16
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 */
215 typedef enum audio_gain {
216 AUDIO_GAIN_TYPE_DEFAULT,
217 AUDIO_GAIN_TYPE_DIALER,
218 AUDIO_GAIN_TYPE_TOUCH,
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,
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;
237 AUDIO_VOLUME_DEVICE_DEFAULT,
238 AUDIO_VOLUME_DEVICE_MAX,
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;
246 typedef struct audio_hal_ucm {
247 snd_use_case_mgr_t* uc_mgr;
250 typedef struct audio_hal_mixer {
252 pthread_mutex_t mutex;
254 snd_ctl_elem_value_t *value;
255 snd_ctl_elem_id_t *id;
256 snd_ctl_elem_info_t *info;
261 typedef enum audio_sample_format {
267 AUDIO_SAMPLE_FLOAT32LE,
268 AUDIO_SAMPLE_FLOAT32BE,
273 AUDIO_SAMPLE_S24_32LE,
274 AUDIO_SAMPLE_S24_32BE,
276 AUDIO_SAMPLE_INVALID = -1
277 } audio_sample_format_t;
280 typedef struct audio_hal {
281 audio_hal_device_t device;
282 audio_hal_volume_t volume;
284 audio_hal_mixer_t mixer;
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;
294 typedef struct samplerate_ctrl {
295 unsigned int samplerate; /* change samplerate.*/
298 audio_return_t _audio_volume_init(audio_hal_t *ah);
299 audio_return_t _audio_volume_deinit(audio_hal_t *ah);
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);