/* * Copyright (C) 2014 The Android Open Source Project * * 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. */ /* This file contains shared utility functions to handle the tinyalsa * implementation for Android internal audio, generally in the hardware layer. * Some routines may log a fatal error on failure, as noted. */ #ifndef ANDROID_AUDIO_ALSAOPS_H #define ANDROID_AUDIO_ALSAOPS_H #include #include #include __BEGIN_DECLS /* Converts audio_format to pcm_format. * Parameters: * format the audio_format_t to convert * * Logs a fatal error if format is not a valid convertible audio_format_t. */ static inline enum pcm_format pcm_format_from_audio_format(audio_format_t format) { switch (format) { #if HAVE_BIG_ENDIAN case AUDIO_FORMAT_PCM_16_BIT: return PCM_FORMAT_S16_BE; case AUDIO_FORMAT_PCM_24_BIT_PACKED: return PCM_FORMAT_S24_3BE; case AUDIO_FORMAT_PCM_32_BIT: return PCM_FORMAT_S32_BE; case AUDIO_FORMAT_PCM_8_24_BIT: return PCM_FORMAT_S24_BE; #else case AUDIO_FORMAT_PCM_16_BIT: return PCM_FORMAT_S16_LE; case AUDIO_FORMAT_PCM_24_BIT_PACKED: return PCM_FORMAT_S24_3LE; case AUDIO_FORMAT_PCM_32_BIT: return PCM_FORMAT_S32_LE; case AUDIO_FORMAT_PCM_8_24_BIT: return PCM_FORMAT_S24_LE; #endif case AUDIO_FORMAT_PCM_FLOAT: /* there is no equivalent for float */ default: LOG_ALWAYS_FATAL("pcm_format_from_audio_format: invalid audio format %#x", format); return PCM_FORMAT_INVALID; /* doesn't get here, assert called above */ } } /* Converts pcm_format to audio_format. * Parameters: * format the pcm_format to convert * * Logs a fatal error if format is not a valid convertible pcm_format. */ static inline audio_format_t audio_format_from_pcm_format(enum pcm_format format) { switch (format) { #if HAVE_BIG_ENDIAN case PCM_FORMAT_S16_BE: return AUDIO_FORMAT_PCM_16_BIT; case PCM_FORMAT_S24_3BE: return AUDIO_FORMAT_PCM_24_BIT_PACKED; case PCM_FORMAT_S24_BE: return AUDIO_FORMAT_PCM_8_24_BIT; case PCM_FORMAT_S32_BE: return AUDIO_FORMAT_PCM_32_BIT; #else case PCM_FORMAT_S16_LE: return AUDIO_FORMAT_PCM_16_BIT; case PCM_FORMAT_S24_3LE: return AUDIO_FORMAT_PCM_24_BIT_PACKED; case PCM_FORMAT_S24_LE: return AUDIO_FORMAT_PCM_8_24_BIT; case PCM_FORMAT_S32_LE: return AUDIO_FORMAT_PCM_32_BIT; #endif default: LOG_ALWAYS_FATAL("audio_format_from_pcm_format: invalid pcm format %#x", format); return AUDIO_FORMAT_INVALID; /* doesn't get here, assert called above */ } } __END_DECLS #endif /* ANDROID_AUDIO_ALSAOPS_H */