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 /* #define LOG_NDEBUG 0 */ 18 #define LOG_TAG "audio_utils_format" 19 20 #include <cutils/log.h> 21 #include <audio_utils/primitives.h> 22 #include <audio_utils/format.h> 23 24 void memcpy_by_audio_format(void *dst, audio_format_t dst_format, 25 const void *src, audio_format_t src_format, size_t count) 26 { 27 /* default cases for error falls through to fatal log below. */ 28 if (dst_format == src_format) { 29 switch (dst_format) { 30 case AUDIO_FORMAT_PCM_16_BIT: 31 case AUDIO_FORMAT_PCM_FLOAT: 32 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 33 case AUDIO_FORMAT_PCM_32_BIT: 34 case AUDIO_FORMAT_PCM_8_24_BIT: 35 memcpy(dst, src, count * audio_bytes_per_sample(dst_format)); 36 return; 37 default: 38 break; 39 } 40 } 41 switch (dst_format) { 42 case AUDIO_FORMAT_PCM_16_BIT: 43 switch (src_format) { 44 case AUDIO_FORMAT_PCM_FLOAT: 45 memcpy_to_i16_from_float((int16_t*)dst, (float*)src, count); 46 return; 47 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 48 memcpy_to_i16_from_p24((int16_t*)dst, (uint8_t*)src, count); 49 return; 50 case AUDIO_FORMAT_PCM_32_BIT: 51 memcpy_to_i16_from_i32((int16_t*)dst, (int32_t*)src, count); 52 return; 53 case AUDIO_FORMAT_PCM_8_24_BIT: 54 memcpy_to_i16_from_q8_23((int16_t*)dst, (int32_t*)src, count); 55 return; 56 default: 57 break; 58 } 59 break; 60 case AUDIO_FORMAT_PCM_FLOAT: 61 switch (src_format) { 62 case AUDIO_FORMAT_PCM_16_BIT: 63 memcpy_to_float_from_i16((float*)dst, (int16_t*)src, count); 64 return; 65 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 66 memcpy_to_float_from_p24((float*)dst, (uint8_t*)src, count); 67 return; 68 case AUDIO_FORMAT_PCM_32_BIT: 69 memcpy_to_float_from_i32((float*)dst, (int32_t*)src, count); 70 return; 71 case AUDIO_FORMAT_PCM_8_24_BIT: 72 memcpy_to_float_from_q8_23((float*)dst, (int32_t*)src, count); 73 return; 74 default: 75 break; 76 } 77 break; 78 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 79 switch (src_format) { 80 case AUDIO_FORMAT_PCM_16_BIT: 81 memcpy_to_p24_from_i16((uint8_t*)dst, (int16_t*)src, count); 82 return; 83 case AUDIO_FORMAT_PCM_FLOAT: 84 memcpy_to_p24_from_float((uint8_t*)dst, (float*)src, count); 85 return; 86 default: 87 break; 88 } 89 break; 90 case AUDIO_FORMAT_PCM_32_BIT: 91 switch (src_format) { 92 case AUDIO_FORMAT_PCM_16_BIT: 93 memcpy_to_i32_from_i16((int32_t*)dst, (int16_t*)src, count); 94 return; 95 case AUDIO_FORMAT_PCM_FLOAT: 96 memcpy_to_i32_from_float((int32_t*)dst, (float*)src, count); 97 return; 98 default: 99 break; 100 } 101 break; 102 case AUDIO_FORMAT_PCM_8_24_BIT: 103 switch (src_format) { 104 case AUDIO_FORMAT_PCM_16_BIT: 105 memcpy_to_q8_23_from_i16((int32_t*)dst, (int16_t*)src, count); 106 return; 107 case AUDIO_FORMAT_PCM_FLOAT: 108 memcpy_to_q8_23_from_float_with_clamp((int32_t*)dst, (float*)src, count); 109 return; 110 default: 111 break; 112 } 113 break; 114 default: 115 break; 116 } 117 LOG_ALWAYS_FATAL("invalid src format %#x for dst format %#x", 118 src_format, dst_format); 119 } 120