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); \
72 /* Devices : Normal */
73 enum audio_device_type {
74 AUDIO_DEVICE_NONE = 0,
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),
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),
100 typedef struct device_type {
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"
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"
120 #define streq !strcmp
121 #define strneq strcmp
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"
128 #define PLAYBACK_CARD_ID ALSA_DEFAULT_CARD
129 #define PLAYBACK_PCM_DEVICE_ID 0
131 #define CAPTURE_CARD_ID ALSA_DEFAULT_CARD
132 #define CAPTURE_PCM_DEVICE_ID 0
134 #define MAX_DEVICES 5
135 #define MAX_MODIFIERS 5
136 #define MAX_NAME_LEN 32
138 /* type definitions */
139 typedef signed char int8_t;
143 snd_pcm_format_t format;
146 } audio_pcm_sample_spec_t;
149 typedef enum audio_route_mode{
153 } audio_route_mode_t;
155 typedef struct audio_device_mgr {
160 pthread_mutex_t pcm_lock;
162 audio_route_mode_t mode;
163 } audio_device_mgr_t;
168 #define AUDIO_VOLUME_LEVEL_MAX 16
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;
177 AUDIO_VOLUME_DEVICE_DEFAULT,
178 AUDIO_VOLUME_DEVICE_MAX,
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;
186 typedef struct audio_ucm_mgr {
187 snd_use_case_mgr_t* uc_mgr;
190 typedef struct audio_mixer_mgr {
192 pthread_mutex_t mutex;
194 snd_ctl_elem_value_t *value;
195 snd_ctl_elem_id_t *id;
196 snd_ctl_elem_info_t *info;
202 typedef struct audio_mgr {
203 audio_device_mgr_t device;
204 audio_volume_mgr_t volume;
206 audio_mixer_mgr_t mixer;
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;
216 typedef struct samplerate_ctrl {
217 unsigned int samplerate; /* change samplerate.*/
220 audio_return_t _audio_volume_init (audio_mgr_t *am);
221 audio_return_t _audio_volume_deinit (audio_mgr_t *am);
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);