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 <log/log.h> 21 22 #include <audio_utils/primitives.h> 23 #include <audio_utils/format.h> 24 25 void memcpy_by_audio_format(void *dst, audio_format_t dst_format, 26 const void *src, audio_format_t src_format, size_t count) 27 { 28 /* default cases for error falls through to fatal log below. */ 29 if (dst_format == src_format) { 30 switch (dst_format) { 31 case AUDIO_FORMAT_PCM_16_BIT: 32 case AUDIO_FORMAT_PCM_FLOAT: 33 case AUDIO_FORMAT_PCM_8_BIT: 34 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 35 case AUDIO_FORMAT_PCM_32_BIT: 36 case AUDIO_FORMAT_PCM_8_24_BIT: 37 memcpy(dst, src, count * audio_bytes_per_sample(dst_format)); 38 return; 39 default: 40 break; 41 } 42 } 43 switch (dst_format) { 44 case AUDIO_FORMAT_PCM_16_BIT: 45 switch (src_format) { 46 case AUDIO_FORMAT_PCM_FLOAT: 47 memcpy_to_i16_from_float((int16_t*)dst, (float*)src, count); 48 return; 49 case AUDIO_FORMAT_PCM_8_BIT: 50 memcpy_to_i16_from_u8((int16_t*)dst, (uint8_t*)src, count); 51 return; 52 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 53 memcpy_to_i16_from_p24((int16_t*)dst, (uint8_t*)src, count); 54 return; 55 case AUDIO_FORMAT_PCM_32_BIT: 56 memcpy_to_i16_from_i32((int16_t*)dst, (int32_t*)src, count); 57 return; 58 case AUDIO_FORMAT_PCM_8_24_BIT: 59 memcpy_to_i16_from_q8_23((int16_t*)dst, (int32_t*)src, count); 60 return; 61 default: 62 break; 63 } 64 break; 65 case AUDIO_FORMAT_PCM_FLOAT: 66 switch (src_format) { 67 case AUDIO_FORMAT_PCM_16_BIT: 68 memcpy_to_float_from_i16((float*)dst, (int16_t*)src, count); 69 return; 70 case AUDIO_FORMAT_PCM_8_BIT: 71 memcpy_to_float_from_u8((float*)dst, (uint8_t*)src, count); 72 return; 73 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 74 memcpy_to_float_from_p24((float*)dst, (uint8_t*)src, count); 75 return; 76 case AUDIO_FORMAT_PCM_32_BIT: 77 memcpy_to_float_from_i32((float*)dst, (int32_t*)src, count); 78 return; 79 case AUDIO_FORMAT_PCM_8_24_BIT: 80 memcpy_to_float_from_q8_23((float*)dst, (int32_t*)src, count); 81 return; 82 default: 83 break; 84 } 85 break; 86 case AUDIO_FORMAT_PCM_8_BIT: 87 switch (src_format) { 88 case AUDIO_FORMAT_PCM_16_BIT: 89 memcpy_to_u8_from_i16((uint8_t*)dst, (int16_t*)src, count); 90 return; 91 case AUDIO_FORMAT_PCM_FLOAT: 92 memcpy_to_u8_from_float((uint8_t*)dst, (float*)src, count); 93 return; 94 default: 95 break; 96 } 97 break; 98 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 99 switch (src_format) { 100 case AUDIO_FORMAT_PCM_16_BIT: 101 memcpy_to_p24_from_i16((uint8_t*)dst, (int16_t*)src, count); 102 return; 103 case AUDIO_FORMAT_PCM_FLOAT: 104 memcpy_to_p24_from_float((uint8_t*)dst, (float*)src, count); 105 return; 106 case AUDIO_FORMAT_PCM_32_BIT: 107 memcpy_to_p24_from_i32((uint8_t*)dst, (int32_t*)src, count); 108 return; 109 case AUDIO_FORMAT_PCM_8_24_BIT: 110 memcpy_to_p24_from_q8_23((uint8_t*)dst, (int32_t*)src, count); 111 return; 112 default: 113 break; 114 } 115 break; 116 case AUDIO_FORMAT_PCM_32_BIT: 117 switch (src_format) { 118 case AUDIO_FORMAT_PCM_16_BIT: 119 memcpy_to_i32_from_i16((int32_t*)dst, (int16_t*)src, count); 120 return; 121 case AUDIO_FORMAT_PCM_FLOAT: 122 memcpy_to_i32_from_float((int32_t*)dst, (float*)src, count); 123 return; 124 case AUDIO_FORMAT_PCM_24_BIT_PACKED: 125 memcpy_to_i32_from_p24((int32_t*)dst, (uint8_t *)src, count); 126 return; 127 default: 128 break; 129 } 130 break; 131 case AUDIO_FORMAT_PCM_8_24_BIT: 132 switch (src_format) { 133 case AUDIO_FORMAT_PCM_16_BIT: 134 memcpy_to_q8_23_from_i16((int32_t*)dst, (int16_t*)src, count); 135 return; 136 case AUDIO_FORMAT_PCM_FLOAT: 137 memcpy_to_q8_23_from_float_with_clamp((int32_t*)dst, (float*)src, count); 138 return; 139 case AUDIO_FORMAT_PCM_24_BIT_PACKED: { 140 memcpy_to_q8_23_from_p24((int32_t *)dst, (uint8_t *)src, count); 141 return; 142 } 143 default: 144 break; 145 } 146 break; 147 default: 148 break; 149 } 150 LOG_ALWAYS_FATAL("invalid src format %#x for dst format %#x", 151 src_format, dst_format); 152 } 153 154 size_t memcpy_by_index_array_initialization_from_channel_mask(int8_t *idxary, size_t arysize, 155 audio_channel_mask_t dst_channel_mask, audio_channel_mask_t src_channel_mask) 156 { 157 const audio_channel_representation_t src_representation = 158 audio_channel_mask_get_representation(src_channel_mask); 159 const audio_channel_representation_t dst_representation = 160 audio_channel_mask_get_representation(dst_channel_mask); 161 const uint32_t src_bits = audio_channel_mask_get_bits(src_channel_mask); 162 const uint32_t dst_bits = audio_channel_mask_get_bits(dst_channel_mask); 163 164 switch (src_representation) { 165 case AUDIO_CHANNEL_REPRESENTATION_POSITION: 166 switch (dst_representation) { 167 case AUDIO_CHANNEL_REPRESENTATION_POSITION: 168 return memcpy_by_index_array_initialization(idxary, arysize, 169 dst_bits, src_bits); 170 case AUDIO_CHANNEL_REPRESENTATION_INDEX: 171 return memcpy_by_index_array_initialization_dst_index(idxary, arysize, 172 dst_bits, src_bits); 173 default: 174 return 0; 175 } 176 break; 177 case AUDIO_CHANNEL_REPRESENTATION_INDEX: 178 switch (dst_representation) { 179 case AUDIO_CHANNEL_REPRESENTATION_POSITION: 180 return memcpy_by_index_array_initialization_src_index(idxary, arysize, 181 dst_bits, src_bits); 182 case AUDIO_CHANNEL_REPRESENTATION_INDEX: 183 return memcpy_by_index_array_initialization(idxary, arysize, 184 dst_bits, src_bits); 185 default: 186 return 0; 187 } 188 break; 189 default: 190 return 0; 191 } 192 } 193