blob: caa354a40f5089e89b2b9ba6e7f612af67169ad9 [file] [log] [blame]
Andy Hungfcad7e42014-03-06 17:36:40 -08001/*
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
Andy Hunge46f5532014-03-18 13:13:45 -070017/* #define LOG_NDEBUG 0 */
Andy Hungfcad7e42014-03-06 17:36:40 -080018#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
24void memcpy_by_audio_format(void *dst, audio_format_t dst_format,
Andy Hunge46f5532014-03-18 13:13:45 -070025 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 }
Andy Hungfcad7e42014-03-06 17:36:40 -080040 }
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;
Andy Hunge46f5532014-03-18 13:13:45 -070050 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;
Andy Hungfcad7e42014-03-06 17:36:40 -080056 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;
Andy Hunge46f5532014-03-18 13:13:45 -070068 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;
Andy Hungfcad7e42014-03-06 17:36:40 -080074 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;
Andy Hunge46f5532014-03-18 13:13:45 -070090 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;
Andy Hungfcad7e42014-03-06 17:36:40 -0800114 default:
115 break;
116 }
117 LOG_ALWAYS_FATAL("invalid src format %#x for dst format %#x",
118 src_format, dst_format);
119}