1/*
2 * Copyright 2016 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#ifndef UTILITY_AAUDIO_UTILITIES_H
18#define UTILITY_AAUDIO_UTILITIES_H
19
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <utils/Errors.h>
24#include <hardware/audio.h>
25
26#include "aaudio/AAudio.h"
27
28/**
29 * Convert an AAudio result into the closest matching Android status.
30 */
31android::status_t AAudioConvert_aaudioToAndroidStatus(aaudio_result_t result);
32
33/**
34 * Convert an Android status into the closest matching AAudio result.
35 */
36aaudio_result_t AAudioConvert_androidToAAudioResult(android::status_t status);
37
38/**
39 * Convert an array of floats to an array of int16_t.
40 *
41 * @param source
42 * @param destination
43 * @param numSamples number of values in the array
44 * @param amplitude level between 0.0 and 1.0
45 */
46void AAudioConvert_floatToPcm16(const float *source,
47                                int16_t *destination,
48                                int32_t numSamples,
49                                float amplitude);
50
51/**
52 * Convert floats to int16_t and scale by a linear ramp.
53 *
54 * The ramp stops just short of reaching amplitude2 so that the next
55 * ramp can start at amplitude2 without causing a discontinuity.
56 *
57 * @param source
58 * @param destination
59 * @param numFrames
60 * @param samplesPerFrame AKA number of channels
61 * @param amplitude1 level at start of ramp, between 0.0 and 1.0
62 * @param amplitude2 level past end of ramp, between 0.0 and 1.0
63 */
64void AAudioConvert_floatToPcm16(const float *source,
65                                int16_t *destination,
66                                int32_t numFrames,
67                                int32_t samplesPerFrame,
68                                float amplitude1,
69                                float amplitude2);
70
71/**
72 * Convert int16_t array to float array ranging from -1.0 to +1.0.
73 * @param source
74 * @param destination
75 * @param numSamples
76 */
77//void AAudioConvert_pcm16ToFloat(const int16_t *source, int32_t numSamples,
78//                                float *destination);
79
80/**
81 *
82 * Convert int16_t array to float array ranging from +/- amplitude.
83 * @param source
84 * @param destination
85 * @param numSamples
86 * @param amplitude
87 */
88void AAudioConvert_pcm16ToFloat(const int16_t *source,
89                                float *destination,
90                                int32_t numSamples,
91                                float amplitude);
92
93/**
94 * Convert floats to int16_t and scale by a linear ramp.
95 *
96 * The ramp stops just short of reaching amplitude2 so that the next
97 * ramp can start at amplitude2 without causing a discontinuity.
98 *
99 * @param source
100 * @param destination
101 * @param numFrames
102 * @param samplesPerFrame AKA number of channels
103 * @param amplitude1 level at start of ramp, between 0.0 and 1.0
104 * @param amplitude2 level at end of ramp, between 0.0 and 1.0
105 */
106void AAudioConvert_pcm16ToFloat(const int16_t *source,
107                                float *destination,
108                                int32_t numFrames,
109                                int32_t samplesPerFrame,
110                                float amplitude1,
111                                float amplitude2);
112
113/**
114 * Scale floats by a linear ramp.
115 *
116 * The ramp stops just short of reaching amplitude2 so that the next
117 * ramp can start at amplitude2 without causing a discontinuity.
118 *
119 * @param source
120 * @param destination
121 * @param numFrames
122 * @param samplesPerFrame
123 * @param amplitude1
124 * @param amplitude2
125 */
126void AAudio_linearRamp(const float *source,
127                       float *destination,
128                       int32_t numFrames,
129                       int32_t samplesPerFrame,
130                       float amplitude1,
131                       float amplitude2);
132
133/**
134 * Scale int16_t's by a linear ramp.
135 *
136 * The ramp stops just short of reaching amplitude2 so that the next
137 * ramp can start at amplitude2 without causing a discontinuity.
138 *
139 * @param source
140 * @param destination
141 * @param numFrames
142 * @param samplesPerFrame
143 * @param amplitude1
144 * @param amplitude2
145 */
146void AAudio_linearRamp(const int16_t *source,
147                       int16_t *destination,
148                       int32_t numFrames,
149                       int32_t samplesPerFrame,
150                       float amplitude1,
151                       float amplitude2);
152
153/**
154 * Calculate the number of bytes and prevent numeric overflow.
155 * @param numFrames frame count
156 * @param bytesPerFrame size of a frame in bytes
157 * @param sizeInBytes total size in bytes
158 * @return AAUDIO_OK or negative error, eg. AAUDIO_ERROR_OUT_OF_RANGE
159 */
160int32_t AAudioConvert_framesToBytes(int32_t numFrames,
161                                            int32_t bytesPerFrame,
162                                            int32_t *sizeInBytes);
163
164audio_format_t AAudioConvert_aaudioToAndroidDataFormat(aaudio_format_t aaudio_format);
165
166aaudio_format_t AAudioConvert_androidToAAudioDataFormat(audio_format_t format);
167
168/**
169 * @return the size of a sample of the given format in bytes or AAUDIO_ERROR_ILLEGAL_ARGUMENT
170 */
171int32_t AAudioConvert_formatToSizeInBytes(aaudio_format_t format);
172
173
174// Note that this code may be replaced by Settings or by some other system configuration tool.
175
176#define AAUDIO_PROP_MMAP_POLICY           "aaudio.mmap_policy"
177
178/**
179 * Read system property.
180 * @return AAUDIO_UNSPECIFIED, AAUDIO_POLICY_NEVER or AAUDIO_POLICY_AUTO or AAUDIO_POLICY_ALWAYS
181 */
182int32_t AAudioProperty_getMMapPolicy();
183
184#define AAUDIO_PROP_MMAP_EXCLUSIVE_POLICY "aaudio.mmap_exclusive_policy"
185
186/**
187 * Read system property.
188 * @return AAUDIO_UNSPECIFIED, AAUDIO_POLICY_NEVER or AAUDIO_POLICY_AUTO or AAUDIO_POLICY_ALWAYS
189 */
190int32_t AAudioProperty_getMMapExclusivePolicy();
191
192#define AAUDIO_PROP_MIXER_BURSTS           "aaudio.mixer_bursts"
193
194/**
195 * Read system property.
196 * @return number of bursts per mixer cycle
197 */
198int32_t AAudioProperty_getMixerBursts();
199
200#define AAUDIO_PROP_HW_BURST_MIN_USEC      "aaudio.hw_burst_min_usec"
201
202/**
203 * Read system property.
204 * This is handy in case the DMA is bursting too quickly for the CPU to keep up.
205 * For example, there may be a DMA burst every 100 usec but you only
206 * want to feed the MMAP buffer every 2000 usec.
207 *
208 * This will affect the framesPerBurst for an MMAP stream.
209 *
210 * @return minimum number of microseconds for a MMAP HW burst
211 */
212int32_t AAudioProperty_getHardwareBurstMinMicros();
213
214#endif //UTILITY_AAUDIO_UTILITIES_H
215