Home | History | Annotate | Download | only in audio_utils
      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