1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_SYSTEM_MEDIA_ALSA_UTILS_ALSA_DEVICE_PROFILE_H 18 #define ANDROID_SYSTEM_MEDIA_ALSA_UTILS_ALSA_DEVICE_PROFILE_H 19 20 #include <stdbool.h> 21 #include <system/audio.h> 22 #include <tinyalsa/asoundlib.h> 23 24 #define MAX_PROFILE_FORMATS 6 /* We long support the 5 standard formats defined 25 * in asound.h, so we just need this to be 1 more 26 * than that */ 27 #define MAX_PROFILE_SAMPLE_RATES 14 /* this number needs to be 1 more than the number of 28 * sample rates in std_sample_rates[] 29 * (in alsa_device_profile.c) */ 30 #define MAX_PROFILE_CHANNEL_COUNTS (FCC_LIMIT + 1) 31 /* this number need to be 1 more than the number of 32 * standard channel formats in std_channel_counts[] 33 * (in alsa_device_profile.c) */ 34 35 #define DEFAULT_SAMPLE_RATE 44100 36 #define DEFAULT_SAMPLE_FORMAT PCM_FORMAT_S16_LE 37 #define DEFAULT_CHANNEL_COUNT 2 38 39 typedef struct { 40 int card; 41 int device; 42 int direction; /* PCM_OUT or PCM_IN */ 43 44 enum pcm_format formats[MAX_PROFILE_FORMATS]; 45 46 /* note that this list is sorted highest rate to lowest */ 47 unsigned sample_rates[MAX_PROFILE_SAMPLE_RATES]; 48 49 unsigned channel_counts[MAX_PROFILE_CHANNEL_COUNTS]; 50 51 bool is_valid; 52 53 /* read from the hardware device */ 54 struct pcm_config default_config; 55 56 unsigned min_period_size; 57 unsigned max_period_size; 58 59 unsigned min_channel_count; 60 unsigned max_channel_count; 61 } alsa_device_profile; 62 63 void profile_init(alsa_device_profile* profile, int direction); 64 bool profile_is_initialized(const alsa_device_profile* profile); 65 bool profile_is_valid(const alsa_device_profile* profile); 66 bool profile_is_cached_for(const alsa_device_profile* profile, int card, int device); 67 void profile_decache(alsa_device_profile* profile); 68 69 bool profile_read_device_info(alsa_device_profile* profile); 70 71 /* Audio Config Strings Methods */ 72 char * profile_get_sample_rate_strs(const alsa_device_profile* profile); 73 char * profile_get_format_strs(const alsa_device_profile* profile); 74 char * profile_get_channel_count_strs(const alsa_device_profile* profile); 75 76 /* Sample Rate Methods */ 77 unsigned profile_get_default_sample_rate(const alsa_device_profile* profile); 78 unsigned profile_get_highest_sample_rate(const alsa_device_profile* profile); 79 bool profile_is_sample_rate_valid(const alsa_device_profile* profile, unsigned rate); 80 81 /* Format Methods */ 82 enum pcm_format profile_get_default_format(const alsa_device_profile* profile); 83 bool profile_is_format_valid(const alsa_device_profile* profile, enum pcm_format fmt); 84 85 /* Channel Methods */ 86 unsigned profile_get_default_channel_count(const alsa_device_profile* profile); 87 unsigned profile_get_closest_channel_count(const alsa_device_profile* profile, unsigned count); 88 bool profile_is_channel_count_valid(const alsa_device_profile* profile, unsigned count); 89 90 /* Utility */ 91 unsigned profile_calc_min_period_size(const alsa_device_profile* profile, unsigned sample_rate); 92 unsigned int profile_get_period_size(const alsa_device_profile* profile, unsigned sample_rate); 93 94 /* Debugging */ 95 void profile_dump(const alsa_device_profile* profile, int fd); 96 97 #endif /* ANDROID_SYSTEM_MEDIA_ALSA_UTILS_ALSA_DEVICE_PROFILE_H */ 98