#ifndef footizenaudiointernalfoo #define footizenaudiointernalfoo /* * audio-hal * * Copyright (c) 2022 Samsung Electronics Co., Ltd. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include #ifdef __USE_TINYALSA__ #include #endif #include #include #include "tizen-audio.h" /* Debug */ //#define AUDIO_DEBUG #define PROPERTY_VALUE_MAX 92 #define BUF_SIZE 1024 #define AUDIO_DUMP_STR_LEN 256 #define AUDIO_DEVICE_INFO_LIST_MAX 16 #ifdef USE_DLOG #ifdef DLOG_TAG #undef DLOG_TAG #endif #define DLOG_TAG "AUDIO_HAL" #define AUDIO_LOG_ERROR(...) dlog_print(DLOG_ERROR, DLOG_TAG, __VA_ARGS__) #define AUDIO_LOG_WARN(...) dlog_print(DLOG_WARN, DLOG_TAG, __VA_ARGS__) #define AUDIO_LOG_INFO(...) dlog_print(DLOG_INFO, DLOG_TAG, __VA_ARGS__) #define AUDIO_LOG_DEBUG(...) dlog_print(DLOG_DEBUG, DLOG_TAG, __VA_ARGS__) #define AUDIO_LOG_VERBOSE(...) dlog_print(DLOG_DEBUG, DLOG_TAG, __VA_ARGS__) #else #define AUDIO_LOG_ERROR(...) fprintf(stderr, __VA_ARGS__) #define AUDIO_LOG_WARN(...) fprintf(stderr, __VA_ARGS__) #define AUDIO_LOG_INFO(...) fprintf(stdout, __VA_ARGS__) #define AUDIO_LOG_DEBUG(...) fprintf(stdout, __VA_ARGS__) #define AUDIO_LOG_VERBOSE(...) fprintf(stdout, __VA_ARGS__) #endif #define AUDIO_RETURN_IF_FAIL(expr) do { \ if (!(expr)) { \ AUDIO_LOG_ERROR("%s failed", #expr); \ return; \ } \ } while (0) #define AUDIO_RETURN_VAL_IF_FAIL(expr, val) do { \ if (!(expr)) { \ AUDIO_LOG_ERROR("%s failed", #expr); \ return val; \ } \ } while (0) #define AUDIO_RETURN_NULL_IF_FAIL(expr) do { \ if (!(expr)) { \ AUDIO_LOG_ERROR("%s failed", #expr); \ return NULL; \ } \ } while (0) /* Devices : Normal */ #define AUDIO_DEVICE_OUT 0x00000000 #define AUDIO_DEVICE_IN 0x80000000 enum audio_device_type { AUDIO_DEVICE_NONE = 0, /* output devices */ AUDIO_DEVICE_OUT_SPEAKER = AUDIO_DEVICE_OUT | 0x00000001, AUDIO_DEVICE_OUT_RECEIVER = AUDIO_DEVICE_OUT | 0x00000002, AUDIO_DEVICE_OUT_JACK = AUDIO_DEVICE_OUT | 0x00000004, AUDIO_DEVICE_OUT_BT_SCO = AUDIO_DEVICE_OUT | 0x00000008, AUDIO_DEVICE_OUT_AUX = AUDIO_DEVICE_OUT | 0x00000010, AUDIO_DEVICE_OUT_HDMI = AUDIO_DEVICE_OUT | 0x00000020, AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_RECEIVER | AUDIO_DEVICE_OUT_JACK | AUDIO_DEVICE_OUT_BT_SCO | AUDIO_DEVICE_OUT_AUX | AUDIO_DEVICE_OUT_HDMI), /* input devices */ AUDIO_DEVICE_IN_MAIN_MIC = AUDIO_DEVICE_IN | 0x00000001, AUDIO_DEVICE_IN_SUB_MIC = AUDIO_DEVICE_IN | 0x00000002, AUDIO_DEVICE_IN_JACK = AUDIO_DEVICE_IN | 0x00000004, AUDIO_DEVICE_IN_BT_SCO = AUDIO_DEVICE_IN | 0x00000008, AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_MAIN_MIC | AUDIO_DEVICE_IN_SUB_MIC | AUDIO_DEVICE_IN_JACK | AUDIO_DEVICE_IN_BT_SCO), }; #define streq !strcmp #define strneq strcmp #define MAX_DEVICES 5 #define MAX_NAME_LEN 32 /* type definitions */ typedef signed char int8_t; typedef struct device_type { uint32_t type; const char *name; } device_type_s; /* PCM */ typedef struct { snd_pcm_format_t format; uint32_t rate; uint8_t channels; } audio_pcm_sample_spec_s; typedef struct audio_hal_device { uint32_t active_in; uint32_t active_out; snd_pcm_t *pcm_in; snd_pcm_t *pcm_out; pthread_mutex_t pcm_lock; uint32_t pcm_count; } audio_hal_device_s; /* Volume */ #define AUDIO_VOLUME_LEVEL_MAX 16 typedef enum audio_volume { AUDIO_VOLUME_TYPE_SYSTEM, /**< System volume type */ AUDIO_VOLUME_TYPE_NOTIFICATION, /**< Notification volume type */ AUDIO_VOLUME_TYPE_ALARM, /**< Alarm volume type */ AUDIO_VOLUME_TYPE_RINGTONE, /**< Ringtone volume type */ AUDIO_VOLUME_TYPE_MEDIA, /**< Media volume type */ AUDIO_VOLUME_TYPE_CALL, /**< Call volume type */ AUDIO_VOLUME_TYPE_VOIP, /**< VOIP volume type */ AUDIO_VOLUME_TYPE_VOICE, /**< Voice volume type */ AUDIO_VOLUME_TYPE_MAX, /**< Volume type count */ } audio_volume_e; typedef enum audio_gain { AUDIO_GAIN_TYPE_DEFAULT, AUDIO_GAIN_TYPE_DIALER, AUDIO_GAIN_TYPE_TOUCH, AUDIO_GAIN_TYPE_AF, AUDIO_GAIN_TYPE_SHUTTER1, AUDIO_GAIN_TYPE_SHUTTER2, AUDIO_GAIN_TYPE_CAMCODING, AUDIO_GAIN_TYPE_MIDI, AUDIO_GAIN_TYPE_BOOTING, AUDIO_GAIN_TYPE_VIDEO, AUDIO_GAIN_TYPE_TTS, AUDIO_GAIN_TYPE_MAX, } audio_gain_e; typedef struct audio_volume_value_table { double volume[AUDIO_VOLUME_TYPE_MAX][AUDIO_VOLUME_LEVEL_MAX]; double gain[AUDIO_GAIN_TYPE_MAX]; } audio_volume_value_table_s; enum { AUDIO_VOLUME_DEVICE_DEFAULT, AUDIO_VOLUME_DEVICE_MAX, }; typedef struct audio_hal_volume { uint32_t volume_level_max[AUDIO_VOLUME_LEVEL_MAX]; uint32_t volume_level[AUDIO_VOLUME_TYPE_MAX]; audio_volume_value_table_s *volume_value_table; } audio_hal_volume_s; /* Mixer */ typedef struct audio_hal_mixer { snd_mixer_t *mixer; pthread_mutex_t mutex; struct { snd_ctl_elem_value_t *value; snd_ctl_elem_id_t *id; snd_ctl_elem_info_t *info; } control; } audio_hal_mixer_s; /* Audio format */ typedef enum audio_sample_format { AUDIO_SAMPLE_U8, AUDIO_SAMPLE_ALAW, AUDIO_SAMPLE_ULAW, AUDIO_SAMPLE_S16LE, AUDIO_SAMPLE_S16BE, AUDIO_SAMPLE_FLOAT32LE, AUDIO_SAMPLE_FLOAT32BE, AUDIO_SAMPLE_S32LE, AUDIO_SAMPLE_S32BE, AUDIO_SAMPLE_S24LE, AUDIO_SAMPLE_S24BE, AUDIO_SAMPLE_S24_32LE, AUDIO_SAMPLE_S24_32BE, AUDIO_SAMPLE_MAX, AUDIO_SAMPLE_INVALID = -1 } audio_sample_format_s; typedef struct audio_hal_comm { message_cb msg_cb; void *user_data; } audio_hal_comm_s; /* Overall */ typedef struct audio_hal { audio_hal_device_s device; audio_hal_volume_s volume; audio_hal_mixer_s mixer; audio_hal_comm_s comm; } audio_hal_s; audio_return_e _audio_ctrl_init(audio_hal_s *ah); audio_return_e _audio_ctrl_deinit(audio_hal_s *ah); audio_return_e _audio_volume_init(audio_hal_s *ah); audio_return_e _audio_volume_deinit(audio_hal_s *ah); audio_return_e _audio_routing_init(audio_hal_s *ah); audio_return_e _audio_routing_deinit(audio_hal_s *ah); audio_return_e _audio_stream_init(audio_hal_s *ah); audio_return_e _audio_stream_deinit(audio_hal_s *ah); audio_return_e _audio_pcm_init(audio_hal_s *ah); audio_return_e _audio_pcm_deinit(audio_hal_s *ah); audio_return_e _audio_comm_init(audio_hal_s *ah); audio_return_e _audio_comm_deinit(audio_hal_s *ah); audio_return_e _audio_comm_send_message(audio_hal_s *ah, const char *name, int value); void convert_hal_format_from_sample_spec(void *src, audio_pcm_sample_spec_s *dst); void convert_hal_format_to_sample_spec(audio_pcm_sample_spec_s *src, void *dst); typedef struct _dump_data { char *strbuf; int left; char *p; } dump_data_t; dump_data_t* _audio_dump_new(int length); void _audio_dump_add_str(dump_data_t *dump, const char *fmt, ...); char* _audio_dump_get_str(dump_data_t *dump); void _audio_dump_free(dump_data_t *dump); /* volume table parse API */ typedef struct _dictionary dictionary_t; dictionary_t *parser_load(const char *filename); const char *parser_getstring(const dictionary_t *dict, const char *key, const char *default_value); void parser_freedict(dictionary_t *dict); void dump_dictionary(const dictionary_t *dict); #endif