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 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 9 /* this number need to be 1 more than the number of 31 * standard channel formats in std_channel_counts[] 32 * (in alsa_device_profile.c) */ 33 34 #define DEFAULT_SAMPLE_RATE 44100 35 #define DEFAULT_SAMPLE_FORMAT PCM_FORMAT_S16_LE 36 #define DEFAULT_CHANNEL_COUNT 2 37 38 typedef struct { 39 int card; 40 int device; 41 int direction; /* PCM_OUT or PCM_IN */ 42 43 enum pcm_format formats[MAX_PROFILE_FORMATS]; 44 45 /* note that this list is sorted highest rate to lowest */ 46 unsigned sample_rates[MAX_PROFILE_SAMPLE_RATES]; 47 48 unsigned channel_counts[MAX_PROFILE_CHANNEL_COUNTS]; 49 50 bool is_valid; 51 52 /* read from the hardware device */ 53 struct pcm_config default_config; 54 55 unsigned min_period_size; 56 unsigned max_period_size; 57 58 unsigned min_channel_count; 59 unsigned max_channel_count; 60 } alsa_device_profile; 61 62 void profile_init(alsa_device_profile* profile, int direction); 63 bool profile_is_initialized(const alsa_device_profile* profile); 64 bool profile_is_valid(const alsa_device_profile* profile); 65 bool profile_is_cached_for(const alsa_device_profile* profile, int card, int device); 66 void profile_decache(alsa_device_profile* profile); 67 68 bool profile_read_device_info(alsa_device_profile* profile); 69 70 /* Audio Config Strings Methods */ 71 char * profile_get_sample_rate_strs(const alsa_device_profile* profile); 72 char * profile_get_format_strs(const alsa_device_profile* profile); 73 char * profile_get_channel_count_strs(const alsa_device_profile* profile); 74 75 /* Sample Rate Methods */ 76 unsigned profile_get_default_sample_rate(const alsa_device_profile* profile); 77 unsigned profile_get_highest_sample_rate(const alsa_device_profile* profile); 78 bool profile_is_sample_rate_valid(const alsa_device_profile* profile, unsigned rate); 79 80 /* Format Methods */ 81 enum pcm_format profile_get_default_format(const alsa_device_profile* profile); 82 bool profile_is_format_valid(const alsa_device_profile* profile, enum pcm_format fmt); 83 84 /* Channel Methods */ 85 unsigned profile_get_default_channel_count(const alsa_device_profile* profile); 86 unsigned profile_get_closest_channel_count(const alsa_device_profile* profile, unsigned count); 87 bool profile_is_channel_count_valid(const alsa_device_profile* profile, unsigned count); 88 89 /* Utility */ 90 unsigned profile_calc_min_period_size(const alsa_device_profile* profile, unsigned sample_rate); 91 unsigned int profile_get_period_size(const alsa_device_profile* profile, unsigned sample_rate); 92 93 /* Debugging */ 94 void profile_dump(const alsa_device_profile* profile, int fd); 95 96 #endif /* ANDROID_SYSTEM_MEDIA_ALSA_UTILS_ALSA_DEVICE_PROFILE_H */ 97