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_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),
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),
108 typedef struct device_type {
113 #define streq !strcmp
114 #define strneq strcmp
116 #define ALSA_DEFAULT_CARD "sdp_scard_audio"
117 #define ALSA_CARD0 "hw:0"
118 #define ALSA_CARD1 "hw:1"
119 #define PLAYBACK_PCM_DEVICE "hw:0,0"
120 #define CAPTURE_PCM_DEVICE "hw:0,0"
123 #define PLAYBACK_CARD_ID 0
124 #define PLAYBACK_PCM_DEVICE_ID 0
127 #define CAPTURE_CARD_ID 0
128 #define CAPTURE_PCM_DEVICE_ID 0
130 #define MAX_DEVICES 5
131 #define MAX_NAME_LEN 32
133 /* type definitions */
134 typedef signed char int8_t;
138 snd_pcm_format_t format;
141 } audio_pcm_sample_spec_t;
144 typedef enum audio_device_api {
145 AUDIO_DEVICE_API_UNKNOWN,
146 AUDIO_DEVICE_API_ALSA,
147 AUDIO_DEVICE_API_BLUEZ,
148 } audio_device_api_t;
150 typedef struct audio_device_alsa_info {
154 } audio_device_alsa_info_t;
156 typedef struct audio_device_bluz_info {
159 } audio_device_bluez_info_t;
161 typedef struct audio_device_info {
162 audio_device_api_t api;
163 audio_direction_t direction;
165 uint8_t is_default_device;
167 audio_device_alsa_info_t alsa;
168 audio_device_bluez_info_t bluez;
170 } audio_device_info_t;
172 typedef struct audio_hal_device {
177 pthread_mutex_t pcm_lock;
179 } audio_hal_device_t;
182 #define AUDIO_VOLUME_LEVEL_MAX 16
184 typedef enum audio_volume {
185 AUDIO_VOLUME_TYPE_SYSTEM, /**< System volume type */
186 AUDIO_VOLUME_TYPE_NOTIFICATION, /**< Notification volume type */
187 AUDIO_VOLUME_TYPE_ALARM, /**< Alarm volume type */
188 AUDIO_VOLUME_TYPE_RINGTONE, /**< Ringtone volume type */
189 AUDIO_VOLUME_TYPE_MEDIA, /**< Media volume type */
190 AUDIO_VOLUME_TYPE_CALL, /**< Call volume type */
191 AUDIO_VOLUME_TYPE_VOIP, /**< VOIP volume type */
192 AUDIO_VOLUME_TYPE_VOICE, /**< Voice volume type */
193 AUDIO_VOLUME_TYPE_MAX, /**< Volume type count */
196 typedef enum audio_gain {
197 AUDIO_GAIN_TYPE_DEFAULT,
198 AUDIO_GAIN_TYPE_DIALER,
199 AUDIO_GAIN_TYPE_TOUCH,
201 AUDIO_GAIN_TYPE_SHUTTER1,
202 AUDIO_GAIN_TYPE_SHUTTER2,
203 AUDIO_GAIN_TYPE_CAMCODING,
204 AUDIO_GAIN_TYPE_MIDI,
205 AUDIO_GAIN_TYPE_BOOTING,
206 AUDIO_GAIN_TYPE_VIDEO,
211 typedef struct audio_volume_value_table {
212 double volume[AUDIO_VOLUME_TYPE_MAX][AUDIO_VOLUME_LEVEL_MAX];
213 uint32_t volume_level_max[AUDIO_VOLUME_LEVEL_MAX];
214 double gain[AUDIO_GAIN_TYPE_MAX];
215 } audio_volume_value_table_t;
218 AUDIO_VOLUME_DEVICE_DEFAULT,
219 AUDIO_VOLUME_DEVICE_MAX,
222 typedef struct audio_hal_volume {
223 uint32_t volume_level[AUDIO_VOLUME_TYPE_MAX];
224 audio_volume_value_table_t *volume_value_table;
225 } audio_hal_volume_t;
227 typedef struct audio_hal_mixer {
229 pthread_mutex_t mutex;
231 snd_ctl_elem_value_t *value;
232 snd_ctl_elem_id_t *id;
233 snd_ctl_elem_info_t *info;
238 typedef enum audio_sample_format {
244 AUDIO_SAMPLE_FLOAT32LE,
245 AUDIO_SAMPLE_FLOAT32BE,
250 AUDIO_SAMPLE_S24_32LE,
251 AUDIO_SAMPLE_S24_32BE,
253 AUDIO_SAMPLE_INVALID = -1
254 } audio_sample_format_t;
256 typedef struct audio_hal_comm {
262 typedef struct audio_hal {
263 audio_hal_device_t device;
264 audio_hal_volume_t volume;
265 audio_hal_mixer_t mixer;
266 audio_hal_comm_t comm;
270 unsigned short is_open; /* if is_open is true, open device; else close device.*/
271 unsigned short is_headphone;
272 unsigned int is_downlink_mute;
273 unsigned int is_uplink_mute;
276 typedef struct samplerate_ctrl {
277 unsigned int samplerate; /* change samplerate.*/
280 audio_return_t _audio_volume_init(audio_hal_t *ah);
281 audio_return_t _audio_volume_deinit(audio_hal_t *ah);
282 audio_return_t _audio_device_init(audio_hal_t *ah);
283 audio_return_t _audio_device_deinit(audio_hal_t *ah);
284 audio_return_t _audio_comm_init(audio_hal_t *ah);
285 audio_return_t _audio_comm_deinit(audio_hal_t *ah);
286 audio_return_t _audio_util_init(audio_hal_t *ah);
287 audio_return_t _audio_util_deinit(audio_hal_t *ah);
288 audio_return_t _audio_comm_send_message(audio_hal_t *ah, const char *name, int value);
289 audio_return_t _audio_comm_set_message_callback(audio_hal_t *ah, message_cb callback, void *user_data);
290 audio_return_t _audio_comm_unset_message_callback(audio_hal_t *ah);
291 audio_return_t _audio_mixer_control_set_param(audio_hal_t *ah, const char* ctl_name, snd_ctl_elem_value_t* value, int size);
292 audio_return_t _audio_mixer_control_set_value(audio_hal_t *ah, const char *card, const char *ctl_name, int val);
293 audio_return_t _audio_mixer_control_set_value_string(audio_hal_t *ah, const char* ctl_name, const char* value);
294 audio_return_t _audio_mixer_control_get_value(audio_hal_t *ah, const char *card, const char *ctl_name, int *val);
295 audio_return_t _audio_mixer_control_get_element(audio_hal_t *ah, const char *ctl_name, snd_hctl_elem_t **elem);
296 audio_return_t _audio_pcm_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, uint8_t period_event);
297 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);
298 uint32_t _convert_format(audio_sample_format_t format);
300 typedef struct _dump_data {
306 dump_data_t* dump_new(int length);
307 void dump_add_str(dump_data_t *dump, const char *fmt, ...);
308 char* dump_get_str(dump_data_t *dump);
309 void dump_free(dump_data_t *dump);