1 /*
2 **
3 ** Copyright 2007, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 #define LOG_TAG "AudioMixer"
19 //#define LOG_NDEBUG 0
20 
21 #include <stdint.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #include <math.h>
25 #include <sys/types.h>
26 
27 #include <utils/Errors.h>
28 #include <utils/Log.h>
29 
30 #include <cutils/compiler.h>
31 #include <utils/Debug.h>
32 
33 #include <system/audio.h>
34 
35 #include <audio_utils/primitives.h>
36 #include <audio_utils/format.h>
37 #include <media/AudioMixer.h>
38 
39 #include "AudioMixerOps.h"
40 
41 // The FCC_2 macro refers to the Fixed Channel Count of 2 for the legacy integer mixer.
42 #ifndef FCC_2
43 #define FCC_2 2
44 #endif
45 
46 // Look for MONO_HACK for any Mono hack involving legacy mono channel to
47 // stereo channel conversion.
48 
49 /* VERY_VERY_VERBOSE_LOGGING will show exactly which process hook and track hook is
50  * being used. This is a considerable amount of log spam, so don't enable unless you
51  * are verifying the hook based code.
52  */
53 //#define VERY_VERY_VERBOSE_LOGGING
54 #ifdef VERY_VERY_VERBOSE_LOGGING
55 #define ALOGVV ALOGV
56 //define ALOGVV printf  // for test-mixer.cpp
57 #else
58 #define ALOGVV(a...) do { } while (0)
59 #endif
60 
61 #ifndef ARRAY_SIZE
62 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
63 #endif
64 
65 // Set kUseNewMixer to true to use the new mixer engine always. Otherwise the
66 // original code will be used for stereo sinks, the new mixer for multichannel.
67 static constexpr bool kUseNewMixer = true;
68 
69 // Set kUseFloat to true to allow floating input into the mixer engine.
70 // If kUseNewMixer is false, this is ignored or may be overridden internally
71 // because of downmix/upmix support.
72 static constexpr bool kUseFloat = true;
73 
74 #ifdef FLOAT_AUX
75 using TYPE_AUX = float;
76 static_assert(kUseNewMixer && kUseFloat,
77         "kUseNewMixer and kUseFloat must be true for FLOAT_AUX option");
78 #else
79 using TYPE_AUX = int32_t; // q4.27
80 #endif
81 
82 // Set to default copy buffer size in frames for input processing.
83 static const size_t kCopyBufferFrameCount = 256;
84 
85 namespace android {
86 
87 // ----------------------------------------------------------------------------
88 
selectMixerInFormat(audio_format_t inputFormat __unused)89 static inline audio_format_t selectMixerInFormat(audio_format_t inputFormat __unused) {
90     return kUseFloat && kUseNewMixer ? AUDIO_FORMAT_PCM_FLOAT : AUDIO_FORMAT_PCM_16_BIT;
91 }
92 
create(int name,audio_channel_mask_t channelMask,audio_format_t format,int sessionId)93 status_t AudioMixer::create(
94         int name, audio_channel_mask_t channelMask, audio_format_t format, int sessionId)
95 {
96     LOG_ALWAYS_FATAL_IF(exists(name), "name %d already exists", name);
97 
98     if (!isValidChannelMask(channelMask)) {
99         ALOGE("%s invalid channelMask: %#x", __func__, channelMask);
100         return BAD_VALUE;
101     }
102     if (!isValidFormat(format)) {
103         ALOGE("%s invalid format: %#x", __func__, format);
104         return BAD_VALUE;
105     }
106 
107     auto t = std::make_shared<Track>();
108     {
109         // TODO: move initialization to the Track constructor.
110         // assume default parameters for the track, except where noted below
111         t->needs = 0;
112 
113         // Integer volume.
114         // Currently integer volume is kept for the legacy integer mixer.
115         // Will be removed when the legacy mixer path is removed.
116         t->volume[0] = 0;
117         t->volume[1] = 0;
118         t->prevVolume[0] = 0 << 16;
119         t->prevVolume[1] = 0 << 16;
120         t->volumeInc[0] = 0;
121         t->volumeInc[1] = 0;
122         t->auxLevel = 0;
123         t->auxInc = 0;
124         t->prevAuxLevel = 0;
125 
126         // Floating point volume.
127         t->mVolume[0] = 0.f;
128         t->mVolume[1] = 0.f;
129         t->mPrevVolume[0] = 0.f;
130         t->mPrevVolume[1] = 0.f;
131         t->mVolumeInc[0] = 0.;
132         t->mVolumeInc[1] = 0.;
133         t->mAuxLevel = 0.;
134         t->mAuxInc = 0.;
135         t->mPrevAuxLevel = 0.;
136 
137         // no initialization needed
138         // t->frameCount
139         t->mHapticChannelMask = channelMask & AUDIO_CHANNEL_HAPTIC_ALL;
140         t->mHapticChannelCount = audio_channel_count_from_out_mask(t->mHapticChannelMask);
141         channelMask &= ~AUDIO_CHANNEL_HAPTIC_ALL;
142         t->channelCount = audio_channel_count_from_out_mask(channelMask);
143         t->enabled = false;
144         ALOGV_IF(audio_channel_mask_get_bits(channelMask) != AUDIO_CHANNEL_OUT_STEREO,
145                 "Non-stereo channel mask: %d\n", channelMask);
146         t->channelMask = channelMask;
147         t->sessionId = sessionId;
148         // setBufferProvider(name, AudioBufferProvider *) is required before enable(name)
149         t->bufferProvider = NULL;
150         t->buffer.raw = NULL;
151         // no initialization needed
152         // t->buffer.frameCount
153         t->hook = NULL;
154         t->mIn = NULL;
155         t->sampleRate = mSampleRate;
156         // setParameter(name, TRACK, MAIN_BUFFER, mixBuffer) is required before enable(name)
157         t->mainBuffer = NULL;
158         t->auxBuffer = NULL;
159         t->mInputBufferProvider = NULL;
160         t->mMixerFormat = AUDIO_FORMAT_PCM_16_BIT;
161         t->mFormat = format;
162         t->mMixerInFormat = selectMixerInFormat(format);
163         t->mDownmixRequiresFormat = AUDIO_FORMAT_INVALID; // no format required
164         t->mMixerChannelMask = audio_channel_mask_from_representation_and_bits(
165                 AUDIO_CHANNEL_REPRESENTATION_POSITION, AUDIO_CHANNEL_OUT_STEREO);
166         t->mMixerChannelCount = audio_channel_count_from_out_mask(t->mMixerChannelMask);
167         t->mPlaybackRate = AUDIO_PLAYBACK_RATE_DEFAULT;
168         // haptic
169         t->mHapticPlaybackEnabled = false;
170         t->mHapticIntensity = HAPTIC_SCALE_NONE;
171         t->mMixerHapticChannelMask = AUDIO_CHANNEL_NONE;
172         t->mMixerHapticChannelCount = 0;
173         t->mAdjustInChannelCount = t->channelCount + t->mHapticChannelCount;
174         t->mAdjustOutChannelCount = t->channelCount + t->mMixerHapticChannelCount;
175         t->mAdjustNonDestructiveInChannelCount = t->mAdjustOutChannelCount;
176         t->mAdjustNonDestructiveOutChannelCount = t->channelCount;
177         t->mKeepContractedChannels = false;
178         // Check the downmixing (or upmixing) requirements.
179         status_t status = t->prepareForDownmix();
180         if (status != OK) {
181             ALOGE("AudioMixer::getTrackName invalid channelMask (%#x)", channelMask);
182             return BAD_VALUE;
183         }
184         // prepareForDownmix() may change mDownmixRequiresFormat
185         ALOGVV("mMixerFormat:%#x  mMixerInFormat:%#x\n", t->mMixerFormat, t->mMixerInFormat);
186         t->prepareForReformat();
187         t->prepareForAdjustChannelsNonDestructive(mFrameCount);
188         t->prepareForAdjustChannels();
189 
190         mTracks[name] = t;
191         return OK;
192     }
193 }
194 
195 // Called when channel masks have changed for a track name
196 // TODO: Fix DownmixerBufferProvider not to (possibly) change mixer input format,
197 // which will simplify this logic.
setChannelMasks(int name,audio_channel_mask_t trackChannelMask,audio_channel_mask_t mixerChannelMask)198 bool AudioMixer::setChannelMasks(int name,
199         audio_channel_mask_t trackChannelMask, audio_channel_mask_t mixerChannelMask) {
200     LOG_ALWAYS_FATAL_IF(!exists(name), "invalid name: %d", name);
201     const std::shared_ptr<Track> &track = mTracks[name];
202 
203     if (trackChannelMask == (track->channelMask | track->mHapticChannelMask)
204             && mixerChannelMask == (track->mMixerChannelMask | track->mMixerHapticChannelMask)) {
205         return false;  // no need to change
206     }
207     const audio_channel_mask_t hapticChannelMask = trackChannelMask & AUDIO_CHANNEL_HAPTIC_ALL;
208     trackChannelMask &= ~AUDIO_CHANNEL_HAPTIC_ALL;
209     const audio_channel_mask_t mixerHapticChannelMask = mixerChannelMask & AUDIO_CHANNEL_HAPTIC_ALL;
210     mixerChannelMask &= ~AUDIO_CHANNEL_HAPTIC_ALL;
211     // always recompute for both channel masks even if only one has changed.
212     const uint32_t trackChannelCount = audio_channel_count_from_out_mask(trackChannelMask);
213     const uint32_t mixerChannelCount = audio_channel_count_from_out_mask(mixerChannelMask);
214     const uint32_t hapticChannelCount = audio_channel_count_from_out_mask(hapticChannelMask);
215     const uint32_t mixerHapticChannelCount =
216             audio_channel_count_from_out_mask(mixerHapticChannelMask);
217 
218     ALOG_ASSERT((trackChannelCount <= MAX_NUM_CHANNELS_TO_DOWNMIX)
219             && trackChannelCount
220             && mixerChannelCount);
221     track->channelMask = trackChannelMask;
222     track->channelCount = trackChannelCount;
223     track->mMixerChannelMask = mixerChannelMask;
224     track->mMixerChannelCount = mixerChannelCount;
225     track->mHapticChannelMask = hapticChannelMask;
226     track->mHapticChannelCount = hapticChannelCount;
227     track->mMixerHapticChannelMask = mixerHapticChannelMask;
228     track->mMixerHapticChannelCount = mixerHapticChannelCount;
229 
230     if (track->mHapticChannelCount > 0) {
231         track->mAdjustInChannelCount = track->channelCount + track->mHapticChannelCount;
232         track->mAdjustOutChannelCount = track->channelCount + track->mMixerHapticChannelCount;
233         track->mAdjustNonDestructiveInChannelCount = track->mAdjustOutChannelCount;
234         track->mAdjustNonDestructiveOutChannelCount = track->channelCount;
235         track->mKeepContractedChannels = track->mHapticPlaybackEnabled;
236     } else {
237         track->mAdjustInChannelCount = 0;
238         track->mAdjustOutChannelCount = 0;
239         track->mAdjustNonDestructiveInChannelCount = 0;
240         track->mAdjustNonDestructiveOutChannelCount = 0;
241         track->mKeepContractedChannels = false;
242     }
243 
244     // channel masks have changed, does this track need a downmixer?
245     // update to try using our desired format (if we aren't already using it)
246     const status_t status = track->prepareForDownmix();
247     ALOGE_IF(status != OK,
248             "prepareForDownmix error %d, track channel mask %#x, mixer channel mask %#x",
249             status, track->channelMask, track->mMixerChannelMask);
250 
251     // always do reformat since channel mask changed,
252     // do it after downmix since track format may change!
253     track->prepareForReformat();
254 
255     track->prepareForAdjustChannelsNonDestructive(mFrameCount);
256     track->prepareForAdjustChannels();
257 
258     if (track->mResampler.get() != nullptr) {
259         // resampler channels may have changed.
260         const uint32_t resetToSampleRate = track->sampleRate;
261         track->mResampler.reset(nullptr);
262         track->sampleRate = mSampleRate; // without resampler, track rate is device sample rate.
263         // recreate the resampler with updated format, channels, saved sampleRate.
264         track->setResampler(resetToSampleRate /*trackSampleRate*/, mSampleRate /*devSampleRate*/);
265     }
266     return true;
267 }
268 
unprepareForDownmix()269 void AudioMixer::Track::unprepareForDownmix() {
270     ALOGV("AudioMixer::unprepareForDownmix(%p)", this);
271 
272     if (mPostDownmixReformatBufferProvider.get() != nullptr) {
273         // release any buffers held by the mPostDownmixReformatBufferProvider
274         // before deallocating the mDownmixerBufferProvider.
275         mPostDownmixReformatBufferProvider->reset();
276     }
277 
278     mDownmixRequiresFormat = AUDIO_FORMAT_INVALID;
279     if (mDownmixerBufferProvider.get() != nullptr) {
280         // this track had previously been configured with a downmixer, delete it
281         mDownmixerBufferProvider.reset(nullptr);
282         reconfigureBufferProviders();
283     } else {
284         ALOGV(" nothing to do, no downmixer to delete");
285     }
286 }
287 
prepareForDownmix()288 status_t AudioMixer::Track::prepareForDownmix()
289 {
290     ALOGV("AudioMixer::prepareForDownmix(%p) with mask 0x%x",
291             this, channelMask);
292 
293     // discard the previous downmixer if there was one
294     unprepareForDownmix();
295     // MONO_HACK Only remix (upmix or downmix) if the track and mixer/device channel masks
296     // are not the same and not handled internally, as mono -> stereo currently is.
297     if (channelMask == mMixerChannelMask
298             || (channelMask == AUDIO_CHANNEL_OUT_MONO
299                     && mMixerChannelMask == AUDIO_CHANNEL_OUT_STEREO)) {
300         return NO_ERROR;
301     }
302     // DownmixerBufferProvider is only used for position masks.
303     if (audio_channel_mask_get_representation(channelMask)
304                 == AUDIO_CHANNEL_REPRESENTATION_POSITION
305             && DownmixerBufferProvider::isMultichannelCapable()) {
306 
307         // Check if we have a float or int16 downmixer, in that order.
308         for (const audio_format_t format : { AUDIO_FORMAT_PCM_FLOAT, AUDIO_FORMAT_PCM_16_BIT }) {
309             mDownmixerBufferProvider.reset(new DownmixerBufferProvider(
310                     channelMask, mMixerChannelMask,
311                     format,
312                     sampleRate, sessionId, kCopyBufferFrameCount));
313             if (static_cast<DownmixerBufferProvider *>(mDownmixerBufferProvider.get())
314                     ->isValid()) {
315                 mDownmixRequiresFormat = format;
316                 reconfigureBufferProviders();
317                 return NO_ERROR;
318             }
319         }
320         // mDownmixerBufferProvider reset below.
321     }
322 
323     // Effect downmixer does not accept the channel conversion.  Let's use our remixer.
324     mDownmixerBufferProvider.reset(new RemixBufferProvider(channelMask,
325             mMixerChannelMask, mMixerInFormat, kCopyBufferFrameCount));
326     // Remix always finds a conversion whereas Downmixer effect above may fail.
327     reconfigureBufferProviders();
328     return NO_ERROR;
329 }
330 
unprepareForReformat()331 void AudioMixer::Track::unprepareForReformat() {
332     ALOGV("AudioMixer::unprepareForReformat(%p)", this);
333     bool requiresReconfigure = false;
334     if (mReformatBufferProvider.get() != nullptr) {
335         mReformatBufferProvider.reset(nullptr);
336         requiresReconfigure = true;
337     }
338     if (mPostDownmixReformatBufferProvider.get() != nullptr) {
339         mPostDownmixReformatBufferProvider.reset(nullptr);
340         requiresReconfigure = true;
341     }
342     if (requiresReconfigure) {
343         reconfigureBufferProviders();
344     }
345 }
346 
prepareForReformat()347 status_t AudioMixer::Track::prepareForReformat()
348 {
349     ALOGV("AudioMixer::prepareForReformat(%p) with format %#x", this, mFormat);
350     // discard previous reformatters
351     unprepareForReformat();
352     // only configure reformatters as needed
353     const audio_format_t targetFormat = mDownmixRequiresFormat != AUDIO_FORMAT_INVALID
354             ? mDownmixRequiresFormat : mMixerInFormat;
355     bool requiresReconfigure = false;
356     if (mFormat != targetFormat) {
357         mReformatBufferProvider.reset(new ReformatBufferProvider(
358                 audio_channel_count_from_out_mask(channelMask),
359                 mFormat,
360                 targetFormat,
361                 kCopyBufferFrameCount));
362         requiresReconfigure = true;
363     } else if (mFormat == AUDIO_FORMAT_PCM_FLOAT) {
364         // Input and output are floats, make sure application did not provide > 3db samples
365         // that would break volume application (b/68099072)
366         // TODO: add a trusted source flag to avoid the overhead
367         mReformatBufferProvider.reset(new ClampFloatBufferProvider(
368                 audio_channel_count_from_out_mask(channelMask),
369                 kCopyBufferFrameCount));
370         requiresReconfigure = true;
371     }
372     if (targetFormat != mMixerInFormat) {
373         mPostDownmixReformatBufferProvider.reset(new ReformatBufferProvider(
374                 audio_channel_count_from_out_mask(mMixerChannelMask),
375                 targetFormat,
376                 mMixerInFormat,
377                 kCopyBufferFrameCount));
378         requiresReconfigure = true;
379     }
380     if (requiresReconfigure) {
381         reconfigureBufferProviders();
382     }
383     return NO_ERROR;
384 }
385 
unprepareForAdjustChannels()386 void AudioMixer::Track::unprepareForAdjustChannels()
387 {
388     ALOGV("AUDIOMIXER::unprepareForAdjustChannels");
389     if (mAdjustChannelsBufferProvider.get() != nullptr) {
390         mAdjustChannelsBufferProvider.reset(nullptr);
391         reconfigureBufferProviders();
392     }
393 }
394 
prepareForAdjustChannels()395 status_t AudioMixer::Track::prepareForAdjustChannels()
396 {
397     ALOGV("AudioMixer::prepareForAdjustChannels(%p) with inChannelCount: %u, outChannelCount: %u",
398             this, mAdjustInChannelCount, mAdjustOutChannelCount);
399     unprepareForAdjustChannels();
400     if (mAdjustInChannelCount != mAdjustOutChannelCount) {
401         mAdjustChannelsBufferProvider.reset(new AdjustChannelsBufferProvider(
402                 mFormat, mAdjustInChannelCount, mAdjustOutChannelCount, kCopyBufferFrameCount));
403         reconfigureBufferProviders();
404     }
405     return NO_ERROR;
406 }
407 
unprepareForAdjustChannelsNonDestructive()408 void AudioMixer::Track::unprepareForAdjustChannelsNonDestructive()
409 {
410     ALOGV("AUDIOMIXER::unprepareForAdjustChannelsNonDestructive");
411     if (mContractChannelsNonDestructiveBufferProvider.get() != nullptr) {
412         mContractChannelsNonDestructiveBufferProvider.reset(nullptr);
413         reconfigureBufferProviders();
414     }
415 }
416 
prepareForAdjustChannelsNonDestructive(size_t frames)417 status_t AudioMixer::Track::prepareForAdjustChannelsNonDestructive(size_t frames)
418 {
419     ALOGV("AudioMixer::prepareForAdjustChannelsNonDestructive(%p) with inChannelCount: %u, "
420           "outChannelCount: %u, keepContractedChannels: %d",
421             this, mAdjustNonDestructiveInChannelCount, mAdjustNonDestructiveOutChannelCount,
422             mKeepContractedChannels);
423     unprepareForAdjustChannelsNonDestructive();
424     if (mAdjustNonDestructiveInChannelCount != mAdjustNonDestructiveOutChannelCount) {
425         uint8_t* buffer = mKeepContractedChannels
426                 ? (uint8_t*)mainBuffer + frames * audio_bytes_per_frame(
427                         mMixerChannelCount, mMixerFormat)
428                 : NULL;
429         mContractChannelsNonDestructiveBufferProvider.reset(
430                 new AdjustChannelsBufferProvider(
431                         mFormat,
432                         mAdjustNonDestructiveInChannelCount,
433                         mAdjustNonDestructiveOutChannelCount,
434                         frames,
435                         mKeepContractedChannels ? mMixerFormat : AUDIO_FORMAT_INVALID,
436                         buffer));
437         reconfigureBufferProviders();
438     }
439     return NO_ERROR;
440 }
441 
clearContractedBuffer()442 void AudioMixer::Track::clearContractedBuffer()
443 {
444     if (mContractChannelsNonDestructiveBufferProvider.get() != nullptr) {
445         static_cast<AdjustChannelsBufferProvider*>(
446                 mContractChannelsNonDestructiveBufferProvider.get())->clearContractedFrames();
447     }
448 }
449 
reconfigureBufferProviders()450 void AudioMixer::Track::reconfigureBufferProviders()
451 {
452     // configure from upstream to downstream buffer providers.
453     bufferProvider = mInputBufferProvider;
454     if (mAdjustChannelsBufferProvider.get() != nullptr) {
455         mAdjustChannelsBufferProvider->setBufferProvider(bufferProvider);
456         bufferProvider = mAdjustChannelsBufferProvider.get();
457     }
458     if (mContractChannelsNonDestructiveBufferProvider.get() != nullptr) {
459         mContractChannelsNonDestructiveBufferProvider->setBufferProvider(bufferProvider);
460         bufferProvider = mContractChannelsNonDestructiveBufferProvider.get();
461     }
462     if (mReformatBufferProvider.get() != nullptr) {
463         mReformatBufferProvider->setBufferProvider(bufferProvider);
464         bufferProvider = mReformatBufferProvider.get();
465     }
466     if (mDownmixerBufferProvider.get() != nullptr) {
467         mDownmixerBufferProvider->setBufferProvider(bufferProvider);
468         bufferProvider = mDownmixerBufferProvider.get();
469     }
470     if (mPostDownmixReformatBufferProvider.get() != nullptr) {
471         mPostDownmixReformatBufferProvider->setBufferProvider(bufferProvider);
472         bufferProvider = mPostDownmixReformatBufferProvider.get();
473     }
474     if (mTimestretchBufferProvider.get() != nullptr) {
475         mTimestretchBufferProvider->setBufferProvider(bufferProvider);
476         bufferProvider = mTimestretchBufferProvider.get();
477     }
478 }
479 
destroy(int name)480 void AudioMixer::destroy(int name)
481 {
482     LOG_ALWAYS_FATAL_IF(!exists(name), "invalid name: %d", name);
483     ALOGV("deleteTrackName(%d)", name);
484 
485     if (mTracks[name]->enabled) {
486         invalidate();
487     }
488     mTracks.erase(name); // deallocate track
489 }
490 
enable(int name)491 void AudioMixer::enable(int name)
492 {
493     LOG_ALWAYS_FATAL_IF(!exists(name), "invalid name: %d", name);
494     const std::shared_ptr<Track> &track = mTracks[name];
495 
496     if (!track->enabled) {
497         track->enabled = true;
498         ALOGV("enable(%d)", name);
499         invalidate();
500     }
501 }
502 
disable(int name)503 void AudioMixer::disable(int name)
504 {
505     LOG_ALWAYS_FATAL_IF(!exists(name), "invalid name: %d", name);
506     const std::shared_ptr<Track> &track = mTracks[name];
507 
508     if (track->enabled) {
509         track->enabled = false;
510         ALOGV("disable(%d)", name);
511         invalidate();
512     }
513 }
514 
515 /* Sets the volume ramp variables for the AudioMixer.
516  *
517  * The volume ramp variables are used to transition from the previous
518  * volume to the set volume.  ramp controls the duration of the transition.
519  * Its value is typically one state framecount period, but may also be 0,
520  * meaning "immediate."
521  *
522  * FIXME: 1) Volume ramp is enabled only if there is a nonzero integer increment
523  * even if there is a nonzero floating point increment (in that case, the volume
524  * change is immediate).  This restriction should be changed when the legacy mixer
525  * is removed (see #2).
526  * FIXME: 2) Integer volume variables are used for Legacy mixing and should be removed
527  * when no longer needed.
528  *
529  * @param newVolume set volume target in floating point [0.0, 1.0].
530  * @param ramp number of frames to increment over. if ramp is 0, the volume
531  * should be set immediately.  Currently ramp should not exceed 65535 (frames).
532  * @param pIntSetVolume pointer to the U4.12 integer target volume, set on return.
533  * @param pIntPrevVolume pointer to the U4.28 integer previous volume, set on return.
534  * @param pIntVolumeInc pointer to the U4.28 increment per output audio frame, set on return.
535  * @param pSetVolume pointer to the float target volume, set on return.
536  * @param pPrevVolume pointer to the float previous volume, set on return.
537  * @param pVolumeInc pointer to the float increment per output audio frame, set on return.
538  * @return true if the volume has changed, false if volume is same.
539  */
setVolumeRampVariables(float newVolume,int32_t ramp,int16_t * pIntSetVolume,int32_t * pIntPrevVolume,int32_t * pIntVolumeInc,float * pSetVolume,float * pPrevVolume,float * pVolumeInc)540 static inline bool setVolumeRampVariables(float newVolume, int32_t ramp,
541         int16_t *pIntSetVolume, int32_t *pIntPrevVolume, int32_t *pIntVolumeInc,
542         float *pSetVolume, float *pPrevVolume, float *pVolumeInc) {
543     // check floating point volume to see if it is identical to the previously
544     // set volume.
545     // We do not use a tolerance here (and reject changes too small)
546     // as it may be confusing to use a different value than the one set.
547     // If the resulting volume is too small to ramp, it is a direct set of the volume.
548     if (newVolume == *pSetVolume) {
549         return false;
550     }
551     if (newVolume < 0) {
552         newVolume = 0; // should not have negative volumes
553     } else {
554         switch (fpclassify(newVolume)) {
555         case FP_SUBNORMAL:
556         case FP_NAN:
557             newVolume = 0;
558             break;
559         case FP_ZERO:
560             break; // zero volume is fine
561         case FP_INFINITE:
562             // Infinite volume could be handled consistently since
563             // floating point math saturates at infinities,
564             // but we limit volume to unity gain float.
565             // ramp = 0; break;
566             //
567             newVolume = AudioMixer::UNITY_GAIN_FLOAT;
568             break;
569         case FP_NORMAL:
570         default:
571             // Floating point does not have problems with overflow wrap
572             // that integer has.  However, we limit the volume to
573             // unity gain here.
574             // TODO: Revisit the volume limitation and perhaps parameterize.
575             if (newVolume > AudioMixer::UNITY_GAIN_FLOAT) {
576                 newVolume = AudioMixer::UNITY_GAIN_FLOAT;
577             }
578             break;
579         }
580     }
581 
582     // set floating point volume ramp
583     if (ramp != 0) {
584         // when the ramp completes, *pPrevVolume is set to *pSetVolume, so there
585         // is no computational mismatch; hence equality is checked here.
586         ALOGD_IF(*pPrevVolume != *pSetVolume, "previous float ramp hasn't finished,"
587                 " prev:%f  set_to:%f", *pPrevVolume, *pSetVolume);
588         const float inc = (newVolume - *pPrevVolume) / ramp; // could be inf, nan, subnormal
589         // could be inf, cannot be nan, subnormal
590         const float maxv = std::max(newVolume, *pPrevVolume);
591 
592         if (isnormal(inc) // inc must be a normal number (no subnormals, infinite, nan)
593                 && maxv + inc != maxv) { // inc must make forward progress
594             *pVolumeInc = inc;
595             // ramp is set now.
596             // Note: if newVolume is 0, then near the end of the ramp,
597             // it may be possible that the ramped volume may be subnormal or
598             // temporarily negative by a small amount or subnormal due to floating
599             // point inaccuracies.
600         } else {
601             ramp = 0; // ramp not allowed
602         }
603     }
604 
605     // compute and check integer volume, no need to check negative values
606     // The integer volume is limited to "unity_gain" to avoid wrapping and other
607     // audio artifacts, so it never reaches the range limit of U4.28.
608     // We safely use signed 16 and 32 bit integers here.
609     const float scaledVolume = newVolume * AudioMixer::UNITY_GAIN_INT; // not neg, subnormal, nan
610     const int32_t intVolume = (scaledVolume >= (float)AudioMixer::UNITY_GAIN_INT) ?
611             AudioMixer::UNITY_GAIN_INT : (int32_t)scaledVolume;
612 
613     // set integer volume ramp
614     if (ramp != 0) {
615         // integer volume is U4.12 (to use 16 bit multiplies), but ramping uses U4.28.
616         // when the ramp completes, *pIntPrevVolume is set to *pIntSetVolume << 16, so there
617         // is no computational mismatch; hence equality is checked here.
618         ALOGD_IF(*pIntPrevVolume != *pIntSetVolume << 16, "previous int ramp hasn't finished,"
619                 " prev:%d  set_to:%d", *pIntPrevVolume, *pIntSetVolume << 16);
620         const int32_t inc = ((intVolume << 16) - *pIntPrevVolume) / ramp;
621 
622         if (inc != 0) { // inc must make forward progress
623             *pIntVolumeInc = inc;
624         } else {
625             ramp = 0; // ramp not allowed
626         }
627     }
628 
629     // if no ramp, or ramp not allowed, then clear float and integer increments
630     if (ramp == 0) {
631         *pVolumeInc = 0;
632         *pPrevVolume = newVolume;
633         *pIntVolumeInc = 0;
634         *pIntPrevVolume = intVolume << 16;
635     }
636     *pSetVolume = newVolume;
637     *pIntSetVolume = intVolume;
638     return true;
639 }
640 
setParameter(int name,int target,int param,void * value)641 void AudioMixer::setParameter(int name, int target, int param, void *value)
642 {
643     LOG_ALWAYS_FATAL_IF(!exists(name), "invalid name: %d", name);
644     const std::shared_ptr<Track> &track = mTracks[name];
645 
646     int valueInt = static_cast<int>(reinterpret_cast<uintptr_t>(value));
647     int32_t *valueBuf = reinterpret_cast<int32_t*>(value);
648 
649     switch (target) {
650 
651     case TRACK:
652         switch (param) {
653         case CHANNEL_MASK: {
654             const audio_channel_mask_t trackChannelMask =
655                 static_cast<audio_channel_mask_t>(valueInt);
656             if (setChannelMasks(name, trackChannelMask,
657                     (track->mMixerChannelMask | track->mMixerHapticChannelMask))) {
658                 ALOGV("setParameter(TRACK, CHANNEL_MASK, %x)", trackChannelMask);
659                 invalidate();
660             }
661             } break;
662         case MAIN_BUFFER:
663             if (track->mainBuffer != valueBuf) {
664                 track->mainBuffer = valueBuf;
665                 ALOGV("setParameter(TRACK, MAIN_BUFFER, %p)", valueBuf);
666                 if (track->mKeepContractedChannels) {
667                     track->prepareForAdjustChannelsNonDestructive(mFrameCount);
668                 }
669                 invalidate();
670             }
671             break;
672         case AUX_BUFFER:
673             if (track->auxBuffer != valueBuf) {
674                 track->auxBuffer = valueBuf;
675                 ALOGV("setParameter(TRACK, AUX_BUFFER, %p)", valueBuf);
676                 invalidate();
677             }
678             break;
679         case FORMAT: {
680             audio_format_t format = static_cast<audio_format_t>(valueInt);
681             if (track->mFormat != format) {
682                 ALOG_ASSERT(audio_is_linear_pcm(format), "Invalid format %#x", format);
683                 track->mFormat = format;
684                 ALOGV("setParameter(TRACK, FORMAT, %#x)", format);
685                 track->prepareForReformat();
686                 invalidate();
687             }
688             } break;
689         // FIXME do we want to support setting the downmix type from AudioFlinger?
690         //         for a specific track? or per mixer?
691         /* case DOWNMIX_TYPE:
692             break          */
693         case MIXER_FORMAT: {
694             audio_format_t format = static_cast<audio_format_t>(valueInt);
695             if (track->mMixerFormat != format) {
696                 track->mMixerFormat = format;
697                 ALOGV("setParameter(TRACK, MIXER_FORMAT, %#x)", format);
698                 if (track->mKeepContractedChannels) {
699                     track->prepareForAdjustChannelsNonDestructive(mFrameCount);
700                 }
701             }
702             } break;
703         case MIXER_CHANNEL_MASK: {
704             const audio_channel_mask_t mixerChannelMask =
705                     static_cast<audio_channel_mask_t>(valueInt);
706             if (setChannelMasks(name, track->channelMask | track->mHapticChannelMask,
707                     mixerChannelMask)) {
708                 ALOGV("setParameter(TRACK, MIXER_CHANNEL_MASK, %#x)", mixerChannelMask);
709                 invalidate();
710             }
711             } break;
712         case HAPTIC_ENABLED: {
713             const bool hapticPlaybackEnabled = static_cast<bool>(valueInt);
714             if (track->mHapticPlaybackEnabled != hapticPlaybackEnabled) {
715                 track->mHapticPlaybackEnabled = hapticPlaybackEnabled;
716                 track->mKeepContractedChannels = hapticPlaybackEnabled;
717                 track->prepareForAdjustChannelsNonDestructive(mFrameCount);
718                 track->prepareForAdjustChannels();
719             }
720             } break;
721         case HAPTIC_INTENSITY: {
722             const haptic_intensity_t hapticIntensity = static_cast<haptic_intensity_t>(valueInt);
723             if (track->mHapticIntensity != hapticIntensity) {
724                 track->mHapticIntensity = hapticIntensity;
725             }
726             } break;
727         default:
728             LOG_ALWAYS_FATAL("setParameter track: bad param %d", param);
729         }
730         break;
731 
732     case RESAMPLE:
733         switch (param) {
734         case SAMPLE_RATE:
735             ALOG_ASSERT(valueInt > 0, "bad sample rate %d", valueInt);
736             if (track->setResampler(uint32_t(valueInt), mSampleRate)) {
737                 ALOGV("setParameter(RESAMPLE, SAMPLE_RATE, %u)",
738                         uint32_t(valueInt));
739                 invalidate();
740             }
741             break;
742         case RESET:
743             track->resetResampler();
744             invalidate();
745             break;
746         case REMOVE:
747             track->mResampler.reset(nullptr);
748             track->sampleRate = mSampleRate;
749             invalidate();
750             break;
751         default:
752             LOG_ALWAYS_FATAL("setParameter resample: bad param %d", param);
753         }
754         break;
755 
756     case RAMP_VOLUME:
757     case VOLUME:
758         switch (param) {
759         case AUXLEVEL:
760             if (setVolumeRampVariables(*reinterpret_cast<float*>(value),
761                     target == RAMP_VOLUME ? mFrameCount : 0,
762                     &track->auxLevel, &track->prevAuxLevel, &track->auxInc,
763                     &track->mAuxLevel, &track->mPrevAuxLevel, &track->mAuxInc)) {
764                 ALOGV("setParameter(%s, AUXLEVEL: %04x)",
765                         target == VOLUME ? "VOLUME" : "RAMP_VOLUME", track->auxLevel);
766                 invalidate();
767             }
768             break;
769         default:
770             if ((unsigned)param >= VOLUME0 && (unsigned)param < VOLUME0 + MAX_NUM_VOLUMES) {
771                 if (setVolumeRampVariables(*reinterpret_cast<float*>(value),
772                         target == RAMP_VOLUME ? mFrameCount : 0,
773                         &track->volume[param - VOLUME0],
774                         &track->prevVolume[param - VOLUME0],
775                         &track->volumeInc[param - VOLUME0],
776                         &track->mVolume[param - VOLUME0],
777                         &track->mPrevVolume[param - VOLUME0],
778                         &track->mVolumeInc[param - VOLUME0])) {
779                     ALOGV("setParameter(%s, VOLUME%d: %04x)",
780                             target == VOLUME ? "VOLUME" : "RAMP_VOLUME", param - VOLUME0,
781                                     track->volume[param - VOLUME0]);
782                     invalidate();
783                 }
784             } else {
785                 LOG_ALWAYS_FATAL("setParameter volume: bad param %d", param);
786             }
787         }
788         break;
789         case TIMESTRETCH:
790             switch (param) {
791             case PLAYBACK_RATE: {
792                 const AudioPlaybackRate *playbackRate =
793                         reinterpret_cast<AudioPlaybackRate*>(value);
794                 ALOGW_IF(!isAudioPlaybackRateValid(*playbackRate),
795                         "bad parameters speed %f, pitch %f",
796                         playbackRate->mSpeed, playbackRate->mPitch);
797                 if (track->setPlaybackRate(*playbackRate)) {
798                     ALOGV("setParameter(TIMESTRETCH, PLAYBACK_RATE, STRETCH_MODE, FALLBACK_MODE "
799                             "%f %f %d %d",
800                             playbackRate->mSpeed,
801                             playbackRate->mPitch,
802                             playbackRate->mStretchMode,
803                             playbackRate->mFallbackMode);
804                     // invalidate();  (should not require reconfigure)
805                 }
806             } break;
807             default:
808                 LOG_ALWAYS_FATAL("setParameter timestretch: bad param %d", param);
809             }
810             break;
811 
812     default:
813         LOG_ALWAYS_FATAL("setParameter: bad target %d", target);
814     }
815 }
816 
setResampler(uint32_t trackSampleRate,uint32_t devSampleRate)817 bool AudioMixer::Track::setResampler(uint32_t trackSampleRate, uint32_t devSampleRate)
818 {
819     if (trackSampleRate != devSampleRate || mResampler.get() != nullptr) {
820         if (sampleRate != trackSampleRate) {
821             sampleRate = trackSampleRate;
822             if (mResampler.get() == nullptr) {
823                 ALOGV("Creating resampler from track %d Hz to device %d Hz",
824                         trackSampleRate, devSampleRate);
825                 AudioResampler::src_quality quality;
826                 // force lowest quality level resampler if use case isn't music or video
827                 // FIXME this is flawed for dynamic sample rates, as we choose the resampler
828                 // quality level based on the initial ratio, but that could change later.
829                 // Should have a way to distinguish tracks with static ratios vs. dynamic ratios.
830                 if (isMusicRate(trackSampleRate)) {
831                     quality = AudioResampler::DEFAULT_QUALITY;
832                 } else {
833                     quality = AudioResampler::DYN_LOW_QUALITY;
834                 }
835 
836                 // TODO: Remove MONO_HACK. Resampler sees #channels after the downmixer
837                 // but if none exists, it is the channel count (1 for mono).
838                 const int resamplerChannelCount = mDownmixerBufferProvider.get() != nullptr
839                         ? mMixerChannelCount : channelCount;
840                 ALOGVV("Creating resampler:"
841                         " format(%#x) channels(%d) devSampleRate(%u) quality(%d)\n",
842                         mMixerInFormat, resamplerChannelCount, devSampleRate, quality);
843                 mResampler.reset(AudioResampler::create(
844                         mMixerInFormat,
845                         resamplerChannelCount,
846                         devSampleRate, quality));
847             }
848             return true;
849         }
850     }
851     return false;
852 }
853 
setPlaybackRate(const AudioPlaybackRate & playbackRate)854 bool AudioMixer::Track::setPlaybackRate(const AudioPlaybackRate &playbackRate)
855 {
856     if ((mTimestretchBufferProvider.get() == nullptr &&
857             fabs(playbackRate.mSpeed - mPlaybackRate.mSpeed) < AUDIO_TIMESTRETCH_SPEED_MIN_DELTA &&
858             fabs(playbackRate.mPitch - mPlaybackRate.mPitch) < AUDIO_TIMESTRETCH_PITCH_MIN_DELTA) ||
859             isAudioPlaybackRateEqual(playbackRate, mPlaybackRate)) {
860         return false;
861     }
862     mPlaybackRate = playbackRate;
863     if (mTimestretchBufferProvider.get() == nullptr) {
864         // TODO: Remove MONO_HACK. Resampler sees #channels after the downmixer
865         // but if none exists, it is the channel count (1 for mono).
866         const int timestretchChannelCount = mDownmixerBufferProvider.get() != nullptr
867                 ? mMixerChannelCount : channelCount;
868         mTimestretchBufferProvider.reset(new TimestretchBufferProvider(timestretchChannelCount,
869                 mMixerInFormat, sampleRate, playbackRate));
870         reconfigureBufferProviders();
871     } else {
872         static_cast<TimestretchBufferProvider*>(mTimestretchBufferProvider.get())
873                 ->setPlaybackRate(playbackRate);
874     }
875     return true;
876 }
877 
878 /* Checks to see if the volume ramp has completed and clears the increment
879  * variables appropriately.
880  *
881  * FIXME: There is code to handle int/float ramp variable switchover should it not
882  * complete within a mixer buffer processing call, but it is preferred to avoid switchover
883  * due to precision issues.  The switchover code is included for legacy code purposes
884  * and can be removed once the integer volume is removed.
885  *
886  * It is not sufficient to clear only the volumeInc integer variable because
887  * if one channel requires ramping, all channels are ramped.
888  *
889  * There is a bit of duplicated code here, but it keeps backward compatibility.
890  */
adjustVolumeRamp(bool aux,bool useFloat)891 inline void AudioMixer::Track::adjustVolumeRamp(bool aux, bool useFloat)
892 {
893     if (useFloat) {
894         for (uint32_t i = 0; i < MAX_NUM_VOLUMES; i++) {
895             if ((mVolumeInc[i] > 0 && mPrevVolume[i] + mVolumeInc[i] >= mVolume[i]) ||
896                      (mVolumeInc[i] < 0 && mPrevVolume[i] + mVolumeInc[i] <= mVolume[i])) {
897                 volumeInc[i] = 0;
898                 prevVolume[i] = volume[i] << 16;
899                 mVolumeInc[i] = 0.;
900                 mPrevVolume[i] = mVolume[i];
901             } else {
902                 //ALOGV("ramp: %f %f %f", mVolume[i], mPrevVolume[i], mVolumeInc[i]);
903                 prevVolume[i] = u4_28_from_float(mPrevVolume[i]);
904             }
905         }
906     } else {
907         for (uint32_t i = 0; i < MAX_NUM_VOLUMES; i++) {
908             if (((volumeInc[i]>0) && (((prevVolume[i]+volumeInc[i])>>16) >= volume[i])) ||
909                     ((volumeInc[i]<0) && (((prevVolume[i]+volumeInc[i])>>16) <= volume[i]))) {
910                 volumeInc[i] = 0;
911                 prevVolume[i] = volume[i] << 16;
912                 mVolumeInc[i] = 0.;
913                 mPrevVolume[i] = mVolume[i];
914             } else {
915                 //ALOGV("ramp: %d %d %d", volume[i] << 16, prevVolume[i], volumeInc[i]);
916                 mPrevVolume[i]  = float_from_u4_28(prevVolume[i]);
917             }
918         }
919     }
920 
921     if (aux) {
922 #ifdef FLOAT_AUX
923         if (useFloat) {
924             if ((mAuxInc > 0.f && mPrevAuxLevel + mAuxInc >= mAuxLevel) ||
925                     (mAuxInc < 0.f && mPrevAuxLevel + mAuxInc <= mAuxLevel)) {
926                 auxInc = 0;
927                 prevAuxLevel = auxLevel << 16;
928                 mAuxInc = 0.f;
929                 mPrevAuxLevel = mAuxLevel;
930             }
931         } else
932 #endif
933         if ((auxInc > 0 && ((prevAuxLevel + auxInc) >> 16) >= auxLevel) ||
934                 (auxInc < 0 && ((prevAuxLevel + auxInc) >> 16) <= auxLevel)) {
935             auxInc = 0;
936             prevAuxLevel = auxLevel << 16;
937             mAuxInc = 0.f;
938             mPrevAuxLevel = mAuxLevel;
939         }
940     }
941 }
942 
getUnreleasedFrames(int name) const943 size_t AudioMixer::getUnreleasedFrames(int name) const
944 {
945     const auto it = mTracks.find(name);
946     if (it != mTracks.end()) {
947         return it->second->getUnreleasedFrames();
948     }
949     return 0;
950 }
951 
setBufferProvider(int name,AudioBufferProvider * bufferProvider)952 void AudioMixer::setBufferProvider(int name, AudioBufferProvider* bufferProvider)
953 {
954     LOG_ALWAYS_FATAL_IF(!exists(name), "invalid name: %d", name);
955     const std::shared_ptr<Track> &track = mTracks[name];
956 
957     if (track->mInputBufferProvider == bufferProvider) {
958         return; // don't reset any buffer providers if identical.
959     }
960     // reset order from downstream to upstream buffer providers.
961     if (track->mTimestretchBufferProvider.get() != nullptr) {
962         track->mTimestretchBufferProvider->reset();
963     } else if (track->mPostDownmixReformatBufferProvider.get() != nullptr) {
964         track->mPostDownmixReformatBufferProvider->reset();
965     } else if (track->mDownmixerBufferProvider != nullptr) {
966         track->mDownmixerBufferProvider->reset();
967     } else if (track->mReformatBufferProvider.get() != nullptr) {
968         track->mReformatBufferProvider->reset();
969     } else if (track->mContractChannelsNonDestructiveBufferProvider.get() != nullptr) {
970         track->mContractChannelsNonDestructiveBufferProvider->reset();
971     } else if (track->mAdjustChannelsBufferProvider.get() != nullptr) {
972         track->mAdjustChannelsBufferProvider->reset();
973     }
974 
975     track->mInputBufferProvider = bufferProvider;
976     track->reconfigureBufferProviders();
977 }
978 
process__validate()979 void AudioMixer::process__validate()
980 {
981     // TODO: fix all16BitsStereNoResample logic to
982     // either properly handle muted tracks (it should ignore them)
983     // or remove altogether as an obsolete optimization.
984     bool all16BitsStereoNoResample = true;
985     bool resampling = false;
986     bool volumeRamp = false;
987 
988     mEnabled.clear();
989     mGroups.clear();
990     for (const auto &pair : mTracks) {
991         const int name = pair.first;
992         const std::shared_ptr<Track> &t = pair.second;
993         if (!t->enabled) continue;
994 
995         mEnabled.emplace_back(name);  // we add to mEnabled in order of name.
996         mGroups[t->mainBuffer].emplace_back(name); // mGroups also in order of name.
997 
998         uint32_t n = 0;
999         // FIXME can overflow (mask is only 3 bits)
1000         n |= NEEDS_CHANNEL_1 + t->channelCount - 1;
1001         if (t->doesResample()) {
1002             n |= NEEDS_RESAMPLE;
1003         }
1004         if (t->auxLevel != 0 && t->auxBuffer != NULL) {
1005             n |= NEEDS_AUX;
1006         }
1007 
1008         if (t->volumeInc[0]|t->volumeInc[1]) {
1009             volumeRamp = true;
1010         } else if (!t->doesResample() && t->volumeRL == 0) {
1011             n |= NEEDS_MUTE;
1012         }
1013         t->needs = n;
1014 
1015         if (n & NEEDS_MUTE) {
1016             t->hook = &Track::track__nop;
1017         } else {
1018             if (n & NEEDS_AUX) {
1019                 all16BitsStereoNoResample = false;
1020             }
1021             if (n & NEEDS_RESAMPLE) {
1022                 all16BitsStereoNoResample = false;
1023                 resampling = true;
1024                 t->hook = Track::getTrackHook(TRACKTYPE_RESAMPLE, t->mMixerChannelCount,
1025                         t->mMixerInFormat, t->mMixerFormat);
1026                 ALOGV_IF((n & NEEDS_CHANNEL_COUNT__MASK) > NEEDS_CHANNEL_2,
1027                         "Track %d needs downmix + resample", name);
1028             } else {
1029                 if ((n & NEEDS_CHANNEL_COUNT__MASK) == NEEDS_CHANNEL_1){
1030                     t->hook = Track::getTrackHook(
1031                             (t->mMixerChannelMask == AUDIO_CHANNEL_OUT_STEREO  // TODO: MONO_HACK
1032                                     && t->channelMask == AUDIO_CHANNEL_OUT_MONO)
1033                                 ? TRACKTYPE_NORESAMPLEMONO : TRACKTYPE_NORESAMPLE,
1034                             t->mMixerChannelCount,
1035                             t->mMixerInFormat, t->mMixerFormat);
1036                     all16BitsStereoNoResample = false;
1037                 }
1038                 if ((n & NEEDS_CHANNEL_COUNT__MASK) >= NEEDS_CHANNEL_2){
1039                     t->hook = Track::getTrackHook(TRACKTYPE_NORESAMPLE, t->mMixerChannelCount,
1040                             t->mMixerInFormat, t->mMixerFormat);
1041                     ALOGV_IF((n & NEEDS_CHANNEL_COUNT__MASK) > NEEDS_CHANNEL_2,
1042                             "Track %d needs downmix", name);
1043                 }
1044             }
1045         }
1046     }
1047 
1048     // select the processing hooks
1049     mHook = &AudioMixer::process__nop;
1050     if (mEnabled.size() > 0) {
1051         if (resampling) {
1052             if (mOutputTemp.get() == nullptr) {
1053                 mOutputTemp.reset(new int32_t[MAX_NUM_CHANNELS * mFrameCount]);
1054             }
1055             if (mResampleTemp.get() == nullptr) {
1056                 mResampleTemp.reset(new int32_t[MAX_NUM_CHANNELS * mFrameCount]);
1057             }
1058             mHook = &AudioMixer::process__genericResampling;
1059         } else {
1060             // we keep temp arrays around.
1061             mHook = &AudioMixer::process__genericNoResampling;
1062             if (all16BitsStereoNoResample && !volumeRamp) {
1063                 if (mEnabled.size() == 1) {
1064                     const std::shared_ptr<Track> &t = mTracks[mEnabled[0]];
1065                     if ((t->needs & NEEDS_MUTE) == 0) {
1066                         // The check prevents a muted track from acquiring a process hook.
1067                         //
1068                         // This is dangerous if the track is MONO as that requires
1069                         // special case handling due to implicit channel duplication.
1070                         // Stereo or Multichannel should actually be fine here.
1071                         mHook = getProcessHook(PROCESSTYPE_NORESAMPLEONETRACK,
1072                                 t->mMixerChannelCount, t->mMixerInFormat, t->mMixerFormat);
1073                     }
1074                 }
1075             }
1076         }
1077     }
1078 
1079     ALOGV("mixer configuration change: %zu "
1080         "all16BitsStereoNoResample=%d, resampling=%d, volumeRamp=%d",
1081         mEnabled.size(), all16BitsStereoNoResample, resampling, volumeRamp);
1082 
1083    process();
1084 
1085     // Now that the volume ramp has been done, set optimal state and
1086     // track hooks for subsequent mixer process
1087     if (mEnabled.size() > 0) {
1088         bool allMuted = true;
1089 
1090         for (const int name : mEnabled) {
1091             const std::shared_ptr<Track> &t = mTracks[name];
1092             if (!t->doesResample() && t->volumeRL == 0) {
1093                 t->needs |= NEEDS_MUTE;
1094                 t->hook = &Track::track__nop;
1095             } else {
1096                 allMuted = false;
1097             }
1098         }
1099         if (allMuted) {
1100             mHook = &AudioMixer::process__nop;
1101         } else if (all16BitsStereoNoResample) {
1102             if (mEnabled.size() == 1) {
1103                 //const int i = 31 - __builtin_clz(enabledTracks);
1104                 const std::shared_ptr<Track> &t = mTracks[mEnabled[0]];
1105                 // Muted single tracks handled by allMuted above.
1106                 mHook = getProcessHook(PROCESSTYPE_NORESAMPLEONETRACK,
1107                         t->mMixerChannelCount, t->mMixerInFormat, t->mMixerFormat);
1108             }
1109         }
1110     }
1111 }
1112 
track__genericResample(int32_t * out,size_t outFrameCount,int32_t * temp,int32_t * aux)1113 void AudioMixer::Track::track__genericResample(
1114         int32_t* out, size_t outFrameCount, int32_t* temp, int32_t* aux)
1115 {
1116     ALOGVV("track__genericResample\n");
1117     mResampler->setSampleRate(sampleRate);
1118 
1119     // ramp gain - resample to temp buffer and scale/mix in 2nd step
1120     if (aux != NULL) {
1121         // always resample with unity gain when sending to auxiliary buffer to be able
1122         // to apply send level after resampling
1123         mResampler->setVolume(UNITY_GAIN_FLOAT, UNITY_GAIN_FLOAT);
1124         memset(temp, 0, outFrameCount * mMixerChannelCount * sizeof(int32_t));
1125         mResampler->resample(temp, outFrameCount, bufferProvider);
1126         if (CC_UNLIKELY(volumeInc[0]|volumeInc[1]|auxInc)) {
1127             volumeRampStereo(out, outFrameCount, temp, aux);
1128         } else {
1129             volumeStereo(out, outFrameCount, temp, aux);
1130         }
1131     } else {
1132         if (CC_UNLIKELY(volumeInc[0]|volumeInc[1])) {
1133             mResampler->setVolume(UNITY_GAIN_FLOAT, UNITY_GAIN_FLOAT);
1134             memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t));
1135             mResampler->resample(temp, outFrameCount, bufferProvider);
1136             volumeRampStereo(out, outFrameCount, temp, aux);
1137         }
1138 
1139         // constant gain
1140         else {
1141             mResampler->setVolume(mVolume[0], mVolume[1]);
1142             mResampler->resample(out, outFrameCount, bufferProvider);
1143         }
1144     }
1145 }
1146 
track__nop(int32_t * out __unused,size_t outFrameCount __unused,int32_t * temp __unused,int32_t * aux __unused)1147 void AudioMixer::Track::track__nop(int32_t* out __unused,
1148         size_t outFrameCount __unused, int32_t* temp __unused, int32_t* aux __unused)
1149 {
1150 }
1151 
volumeRampStereo(int32_t * out,size_t frameCount,int32_t * temp,int32_t * aux)1152 void AudioMixer::Track::volumeRampStereo(
1153         int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux)
1154 {
1155     int32_t vl = prevVolume[0];
1156     int32_t vr = prevVolume[1];
1157     const int32_t vlInc = volumeInc[0];
1158     const int32_t vrInc = volumeInc[1];
1159 
1160     //ALOGD("[0] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1161     //        t, vlInc/65536.0f, vl/65536.0f, volume[0],
1162     //       (vl + vlInc*frameCount)/65536.0f, frameCount);
1163 
1164     // ramp volume
1165     if (CC_UNLIKELY(aux != NULL)) {
1166         int32_t va = prevAuxLevel;
1167         const int32_t vaInc = auxInc;
1168         int32_t l;
1169         int32_t r;
1170 
1171         do {
1172             l = (*temp++ >> 12);
1173             r = (*temp++ >> 12);
1174             *out++ += (vl >> 16) * l;
1175             *out++ += (vr >> 16) * r;
1176             *aux++ += (va >> 17) * (l + r);
1177             vl += vlInc;
1178             vr += vrInc;
1179             va += vaInc;
1180         } while (--frameCount);
1181         prevAuxLevel = va;
1182     } else {
1183         do {
1184             *out++ += (vl >> 16) * (*temp++ >> 12);
1185             *out++ += (vr >> 16) * (*temp++ >> 12);
1186             vl += vlInc;
1187             vr += vrInc;
1188         } while (--frameCount);
1189     }
1190     prevVolume[0] = vl;
1191     prevVolume[1] = vr;
1192     adjustVolumeRamp(aux != NULL);
1193 }
1194 
volumeStereo(int32_t * out,size_t frameCount,int32_t * temp,int32_t * aux)1195 void AudioMixer::Track::volumeStereo(
1196         int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux)
1197 {
1198     const int16_t vl = volume[0];
1199     const int16_t vr = volume[1];
1200 
1201     if (CC_UNLIKELY(aux != NULL)) {
1202         const int16_t va = auxLevel;
1203         do {
1204             int16_t l = (int16_t)(*temp++ >> 12);
1205             int16_t r = (int16_t)(*temp++ >> 12);
1206             out[0] = mulAdd(l, vl, out[0]);
1207             int16_t a = (int16_t)(((int32_t)l + r) >> 1);
1208             out[1] = mulAdd(r, vr, out[1]);
1209             out += 2;
1210             aux[0] = mulAdd(a, va, aux[0]);
1211             aux++;
1212         } while (--frameCount);
1213     } else {
1214         do {
1215             int16_t l = (int16_t)(*temp++ >> 12);
1216             int16_t r = (int16_t)(*temp++ >> 12);
1217             out[0] = mulAdd(l, vl, out[0]);
1218             out[1] = mulAdd(r, vr, out[1]);
1219             out += 2;
1220         } while (--frameCount);
1221     }
1222 }
1223 
track__16BitsStereo(int32_t * out,size_t frameCount,int32_t * temp __unused,int32_t * aux)1224 void AudioMixer::Track::track__16BitsStereo(
1225         int32_t* out, size_t frameCount, int32_t* temp __unused, int32_t* aux)
1226 {
1227     ALOGVV("track__16BitsStereo\n");
1228     const int16_t *in = static_cast<const int16_t *>(mIn);
1229 
1230     if (CC_UNLIKELY(aux != NULL)) {
1231         int32_t l;
1232         int32_t r;
1233         // ramp gain
1234         if (CC_UNLIKELY(volumeInc[0]|volumeInc[1]|auxInc)) {
1235             int32_t vl = prevVolume[0];
1236             int32_t vr = prevVolume[1];
1237             int32_t va = prevAuxLevel;
1238             const int32_t vlInc = volumeInc[0];
1239             const int32_t vrInc = volumeInc[1];
1240             const int32_t vaInc = auxInc;
1241             // ALOGD("[1] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1242             //        t, vlInc/65536.0f, vl/65536.0f, volume[0],
1243             //        (vl + vlInc*frameCount)/65536.0f, frameCount);
1244 
1245             do {
1246                 l = (int32_t)*in++;
1247                 r = (int32_t)*in++;
1248                 *out++ += (vl >> 16) * l;
1249                 *out++ += (vr >> 16) * r;
1250                 *aux++ += (va >> 17) * (l + r);
1251                 vl += vlInc;
1252                 vr += vrInc;
1253                 va += vaInc;
1254             } while (--frameCount);
1255 
1256             prevVolume[0] = vl;
1257             prevVolume[1] = vr;
1258             prevAuxLevel = va;
1259             adjustVolumeRamp(true);
1260         }
1261 
1262         // constant gain
1263         else {
1264             const uint32_t vrl = volumeRL;
1265             const int16_t va = (int16_t)auxLevel;
1266             do {
1267                 uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1268                 int16_t a = (int16_t)(((int32_t)in[0] + in[1]) >> 1);
1269                 in += 2;
1270                 out[0] = mulAddRL(1, rl, vrl, out[0]);
1271                 out[1] = mulAddRL(0, rl, vrl, out[1]);
1272                 out += 2;
1273                 aux[0] = mulAdd(a, va, aux[0]);
1274                 aux++;
1275             } while (--frameCount);
1276         }
1277     } else {
1278         // ramp gain
1279         if (CC_UNLIKELY(volumeInc[0]|volumeInc[1])) {
1280             int32_t vl = prevVolume[0];
1281             int32_t vr = prevVolume[1];
1282             const int32_t vlInc = volumeInc[0];
1283             const int32_t vrInc = volumeInc[1];
1284 
1285             // ALOGD("[1] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1286             //        t, vlInc/65536.0f, vl/65536.0f, volume[0],
1287             //        (vl + vlInc*frameCount)/65536.0f, frameCount);
1288 
1289             do {
1290                 *out++ += (vl >> 16) * (int32_t) *in++;
1291                 *out++ += (vr >> 16) * (int32_t) *in++;
1292                 vl += vlInc;
1293                 vr += vrInc;
1294             } while (--frameCount);
1295 
1296             prevVolume[0] = vl;
1297             prevVolume[1] = vr;
1298             adjustVolumeRamp(false);
1299         }
1300 
1301         // constant gain
1302         else {
1303             const uint32_t vrl = volumeRL;
1304             do {
1305                 uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1306                 in += 2;
1307                 out[0] = mulAddRL(1, rl, vrl, out[0]);
1308                 out[1] = mulAddRL(0, rl, vrl, out[1]);
1309                 out += 2;
1310             } while (--frameCount);
1311         }
1312     }
1313     mIn = in;
1314 }
1315 
track__16BitsMono(int32_t * out,size_t frameCount,int32_t * temp __unused,int32_t * aux)1316 void AudioMixer::Track::track__16BitsMono(
1317         int32_t* out, size_t frameCount, int32_t* temp __unused, int32_t* aux)
1318 {
1319     ALOGVV("track__16BitsMono\n");
1320     const int16_t *in = static_cast<int16_t const *>(mIn);
1321 
1322     if (CC_UNLIKELY(aux != NULL)) {
1323         // ramp gain
1324         if (CC_UNLIKELY(volumeInc[0]|volumeInc[1]|auxInc)) {
1325             int32_t vl = prevVolume[0];
1326             int32_t vr = prevVolume[1];
1327             int32_t va = prevAuxLevel;
1328             const int32_t vlInc = volumeInc[0];
1329             const int32_t vrInc = volumeInc[1];
1330             const int32_t vaInc = auxInc;
1331 
1332             // ALOGD("[2] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1333             //         t, vlInc/65536.0f, vl/65536.0f, volume[0],
1334             //         (vl + vlInc*frameCount)/65536.0f, frameCount);
1335 
1336             do {
1337                 int32_t l = *in++;
1338                 *out++ += (vl >> 16) * l;
1339                 *out++ += (vr >> 16) * l;
1340                 *aux++ += (va >> 16) * l;
1341                 vl += vlInc;
1342                 vr += vrInc;
1343                 va += vaInc;
1344             } while (--frameCount);
1345 
1346             prevVolume[0] = vl;
1347             prevVolume[1] = vr;
1348             prevAuxLevel = va;
1349             adjustVolumeRamp(true);
1350         }
1351         // constant gain
1352         else {
1353             const int16_t vl = volume[0];
1354             const int16_t vr = volume[1];
1355             const int16_t va = (int16_t)auxLevel;
1356             do {
1357                 int16_t l = *in++;
1358                 out[0] = mulAdd(l, vl, out[0]);
1359                 out[1] = mulAdd(l, vr, out[1]);
1360                 out += 2;
1361                 aux[0] = mulAdd(l, va, aux[0]);
1362                 aux++;
1363             } while (--frameCount);
1364         }
1365     } else {
1366         // ramp gain
1367         if (CC_UNLIKELY(volumeInc[0]|volumeInc[1])) {
1368             int32_t vl = prevVolume[0];
1369             int32_t vr = prevVolume[1];
1370             const int32_t vlInc = volumeInc[0];
1371             const int32_t vrInc = volumeInc[1];
1372 
1373             // ALOGD("[2] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1374             //         t, vlInc/65536.0f, vl/65536.0f, volume[0],
1375             //         (vl + vlInc*frameCount)/65536.0f, frameCount);
1376 
1377             do {
1378                 int32_t l = *in++;
1379                 *out++ += (vl >> 16) * l;
1380                 *out++ += (vr >> 16) * l;
1381                 vl += vlInc;
1382                 vr += vrInc;
1383             } while (--frameCount);
1384 
1385             prevVolume[0] = vl;
1386             prevVolume[1] = vr;
1387             adjustVolumeRamp(false);
1388         }
1389         // constant gain
1390         else {
1391             const int16_t vl = volume[0];
1392             const int16_t vr = volume[1];
1393             do {
1394                 int16_t l = *in++;
1395                 out[0] = mulAdd(l, vl, out[0]);
1396                 out[1] = mulAdd(l, vr, out[1]);
1397                 out += 2;
1398             } while (--frameCount);
1399         }
1400     }
1401     mIn = in;
1402 }
1403 
1404 // no-op case
process__nop()1405 void AudioMixer::process__nop()
1406 {
1407     ALOGVV("process__nop\n");
1408 
1409     for (const auto &pair : mGroups) {
1410         // process by group of tracks with same output buffer to
1411         // avoid multiple memset() on same buffer
1412         const auto &group = pair.second;
1413 
1414         const std::shared_ptr<Track> &t = mTracks[group[0]];
1415         memset(t->mainBuffer, 0,
1416                 mFrameCount * audio_bytes_per_frame(
1417                         t->mMixerChannelCount + t->mMixerHapticChannelCount, t->mMixerFormat));
1418 
1419         // now consume data
1420         for (const int name : group) {
1421             const std::shared_ptr<Track> &t = mTracks[name];
1422             size_t outFrames = mFrameCount;
1423             while (outFrames) {
1424                 t->buffer.frameCount = outFrames;
1425                 t->bufferProvider->getNextBuffer(&t->buffer);
1426                 if (t->buffer.raw == NULL) break;
1427                 outFrames -= t->buffer.frameCount;
1428                 t->bufferProvider->releaseBuffer(&t->buffer);
1429             }
1430         }
1431     }
1432 }
1433 
1434 // generic code without resampling
process__genericNoResampling()1435 void AudioMixer::process__genericNoResampling()
1436 {
1437     ALOGVV("process__genericNoResampling\n");
1438     int32_t outTemp[BLOCKSIZE * MAX_NUM_CHANNELS] __attribute__((aligned(32)));
1439 
1440     for (const auto &pair : mGroups) {
1441         // process by group of tracks with same output main buffer to
1442         // avoid multiple memset() on same buffer
1443         const auto &group = pair.second;
1444 
1445         // acquire buffer
1446         for (const int name : group) {
1447             const std::shared_ptr<Track> &t = mTracks[name];
1448             t->buffer.frameCount = mFrameCount;
1449             t->bufferProvider->getNextBuffer(&t->buffer);
1450             t->frameCount = t->buffer.frameCount;
1451             t->mIn = t->buffer.raw;
1452         }
1453 
1454         int32_t *out = (int *)pair.first;
1455         size_t numFrames = 0;
1456         do {
1457             const size_t frameCount = std::min((size_t)BLOCKSIZE, mFrameCount - numFrames);
1458             memset(outTemp, 0, sizeof(outTemp));
1459             for (const int name : group) {
1460                 const std::shared_ptr<Track> &t = mTracks[name];
1461                 int32_t *aux = NULL;
1462                 if (CC_UNLIKELY(t->needs & NEEDS_AUX)) {
1463                     aux = t->auxBuffer + numFrames;
1464                 }
1465                 for (int outFrames = frameCount; outFrames > 0; ) {
1466                     // t->in == nullptr can happen if the track was flushed just after having
1467                     // been enabled for mixing.
1468                     if (t->mIn == nullptr) {
1469                         break;
1470                     }
1471                     size_t inFrames = (t->frameCount > outFrames)?outFrames:t->frameCount;
1472                     if (inFrames > 0) {
1473                         (t.get()->*t->hook)(
1474                                 outTemp + (frameCount - outFrames) * t->mMixerChannelCount,
1475                                 inFrames, mResampleTemp.get() /* naked ptr */, aux);
1476                         t->frameCount -= inFrames;
1477                         outFrames -= inFrames;
1478                         if (CC_UNLIKELY(aux != NULL)) {
1479                             aux += inFrames;
1480                         }
1481                     }
1482                     if (t->frameCount == 0 && outFrames) {
1483                         t->bufferProvider->releaseBuffer(&t->buffer);
1484                         t->buffer.frameCount = (mFrameCount - numFrames) -
1485                                 (frameCount - outFrames);
1486                         t->bufferProvider->getNextBuffer(&t->buffer);
1487                         t->mIn = t->buffer.raw;
1488                         if (t->mIn == nullptr) {
1489                             break;
1490                         }
1491                         t->frameCount = t->buffer.frameCount;
1492                     }
1493                 }
1494             }
1495 
1496             const std::shared_ptr<Track> &t1 = mTracks[group[0]];
1497             convertMixerFormat(out, t1->mMixerFormat, outTemp, t1->mMixerInFormat,
1498                     frameCount * t1->mMixerChannelCount);
1499             // TODO: fix ugly casting due to choice of out pointer type
1500             out = reinterpret_cast<int32_t*>((uint8_t*)out
1501                     + frameCount * t1->mMixerChannelCount
1502                     * audio_bytes_per_sample(t1->mMixerFormat));
1503             numFrames += frameCount;
1504         } while (numFrames < mFrameCount);
1505 
1506         // release each track's buffer
1507         for (const int name : group) {
1508             const std::shared_ptr<Track> &t = mTracks[name];
1509             t->bufferProvider->releaseBuffer(&t->buffer);
1510         }
1511     }
1512 }
1513 
1514 // generic code with resampling
process__genericResampling()1515 void AudioMixer::process__genericResampling()
1516 {
1517     ALOGVV("process__genericResampling\n");
1518     int32_t * const outTemp = mOutputTemp.get(); // naked ptr
1519     size_t numFrames = mFrameCount;
1520 
1521     for (const auto &pair : mGroups) {
1522         const auto &group = pair.second;
1523         const std::shared_ptr<Track> &t1 = mTracks[group[0]];
1524 
1525         // clear temp buffer
1526         memset(outTemp, 0, sizeof(*outTemp) * t1->mMixerChannelCount * mFrameCount);
1527         for (const int name : group) {
1528             const std::shared_ptr<Track> &t = mTracks[name];
1529             int32_t *aux = NULL;
1530             if (CC_UNLIKELY(t->needs & NEEDS_AUX)) {
1531                 aux = t->auxBuffer;
1532             }
1533 
1534             // this is a little goofy, on the resampling case we don't
1535             // acquire/release the buffers because it's done by
1536             // the resampler.
1537             if (t->needs & NEEDS_RESAMPLE) {
1538                 (t.get()->*t->hook)(outTemp, numFrames, mResampleTemp.get() /* naked ptr */, aux);
1539             } else {
1540 
1541                 size_t outFrames = 0;
1542 
1543                 while (outFrames < numFrames) {
1544                     t->buffer.frameCount = numFrames - outFrames;
1545                     t->bufferProvider->getNextBuffer(&t->buffer);
1546                     t->mIn = t->buffer.raw;
1547                     // t->mIn == nullptr can happen if the track was flushed just after having
1548                     // been enabled for mixing.
1549                     if (t->mIn == nullptr) break;
1550 
1551                     (t.get()->*t->hook)(
1552                             outTemp + outFrames * t->mMixerChannelCount, t->buffer.frameCount,
1553                             mResampleTemp.get() /* naked ptr */,
1554                             aux != nullptr ? aux + outFrames : nullptr);
1555                     outFrames += t->buffer.frameCount;
1556 
1557                     t->bufferProvider->releaseBuffer(&t->buffer);
1558                 }
1559             }
1560         }
1561         convertMixerFormat(t1->mainBuffer, t1->mMixerFormat,
1562                 outTemp, t1->mMixerInFormat, numFrames * t1->mMixerChannelCount);
1563     }
1564 }
1565 
1566 // one track, 16 bits stereo without resampling is the most common case
process__oneTrack16BitsStereoNoResampling()1567 void AudioMixer::process__oneTrack16BitsStereoNoResampling()
1568 {
1569     ALOGVV("process__oneTrack16BitsStereoNoResampling\n");
1570     LOG_ALWAYS_FATAL_IF(mEnabled.size() != 0,
1571             "%zu != 1 tracks enabled", mEnabled.size());
1572     const int name = mEnabled[0];
1573     const std::shared_ptr<Track> &t = mTracks[name];
1574 
1575     AudioBufferProvider::Buffer& b(t->buffer);
1576 
1577     int32_t* out = t->mainBuffer;
1578     float *fout = reinterpret_cast<float*>(out);
1579     size_t numFrames = mFrameCount;
1580 
1581     const int16_t vl = t->volume[0];
1582     const int16_t vr = t->volume[1];
1583     const uint32_t vrl = t->volumeRL;
1584     while (numFrames) {
1585         b.frameCount = numFrames;
1586         t->bufferProvider->getNextBuffer(&b);
1587         const int16_t *in = b.i16;
1588 
1589         // in == NULL can happen if the track was flushed just after having
1590         // been enabled for mixing.
1591         if (in == NULL || (((uintptr_t)in) & 3)) {
1592             if ( AUDIO_FORMAT_PCM_FLOAT == t->mMixerFormat ) {
1593                  memset((char*)fout, 0, numFrames
1594                          * t->mMixerChannelCount * audio_bytes_per_sample(t->mMixerFormat));
1595             } else {
1596                  memset((char*)out, 0, numFrames
1597                          * t->mMixerChannelCount * audio_bytes_per_sample(t->mMixerFormat));
1598             }
1599             ALOGE_IF((((uintptr_t)in) & 3),
1600                     "process__oneTrack16BitsStereoNoResampling: misaligned buffer"
1601                     " %p track %d, channels %d, needs %08x, volume %08x vfl %f vfr %f",
1602                     in, name, t->channelCount, t->needs, vrl, t->mVolume[0], t->mVolume[1]);
1603             return;
1604         }
1605         size_t outFrames = b.frameCount;
1606 
1607         switch (t->mMixerFormat) {
1608         case AUDIO_FORMAT_PCM_FLOAT:
1609             do {
1610                 uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1611                 in += 2;
1612                 int32_t l = mulRL(1, rl, vrl);
1613                 int32_t r = mulRL(0, rl, vrl);
1614                 *fout++ = float_from_q4_27(l);
1615                 *fout++ = float_from_q4_27(r);
1616                 // Note: In case of later int16_t sink output,
1617                 // conversion and clamping is done by memcpy_to_i16_from_float().
1618             } while (--outFrames);
1619             break;
1620         case AUDIO_FORMAT_PCM_16_BIT:
1621             if (CC_UNLIKELY(uint32_t(vl) > UNITY_GAIN_INT || uint32_t(vr) > UNITY_GAIN_INT)) {
1622                 // volume is boosted, so we might need to clamp even though
1623                 // we process only one track.
1624                 do {
1625                     uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1626                     in += 2;
1627                     int32_t l = mulRL(1, rl, vrl) >> 12;
1628                     int32_t r = mulRL(0, rl, vrl) >> 12;
1629                     // clamping...
1630                     l = clamp16(l);
1631                     r = clamp16(r);
1632                     *out++ = (r<<16) | (l & 0xFFFF);
1633                 } while (--outFrames);
1634             } else {
1635                 do {
1636                     uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1637                     in += 2;
1638                     int32_t l = mulRL(1, rl, vrl) >> 12;
1639                     int32_t r = mulRL(0, rl, vrl) >> 12;
1640                     *out++ = (r<<16) | (l & 0xFFFF);
1641                 } while (--outFrames);
1642             }
1643             break;
1644         default:
1645             LOG_ALWAYS_FATAL("bad mixer format: %d", t->mMixerFormat);
1646         }
1647         numFrames -= b.frameCount;
1648         t->bufferProvider->releaseBuffer(&b);
1649     }
1650 }
1651 
1652 /*static*/ pthread_once_t AudioMixer::sOnceControl = PTHREAD_ONCE_INIT;
1653 
sInitRoutine()1654 /*static*/ void AudioMixer::sInitRoutine()
1655 {
1656     DownmixerBufferProvider::init(); // for the downmixer
1657 }
1658 
1659 /* TODO: consider whether this level of optimization is necessary.
1660  * Perhaps just stick with a single for loop.
1661  */
1662 
1663 // Needs to derive a compile time constant (constexpr).  Could be targeted to go
1664 // to a MONOVOL mixtype based on MAX_NUM_VOLUMES, but that's an unnecessary complication.
1665 #define MIXTYPE_MONOVOL(mixtype) ((mixtype) == MIXTYPE_MULTI ? MIXTYPE_MULTI_MONOVOL : \
1666         (mixtype) == MIXTYPE_MULTI_SAVEONLY ? MIXTYPE_MULTI_SAVEONLY_MONOVOL : (mixtype))
1667 
1668 /* MIXTYPE     (see AudioMixerOps.h MIXTYPE_* enumeration)
1669  * TO: int32_t (Q4.27) or float
1670  * TI: int32_t (Q4.27) or int16_t (Q0.15) or float
1671  * TA: int32_t (Q4.27) or float
1672  */
1673 template <int MIXTYPE,
1674         typename TO, typename TI, typename TV, typename TA, typename TAV>
volumeRampMulti(uint32_t channels,TO * out,size_t frameCount,const TI * in,TA * aux,TV * vol,const TV * volinc,TAV * vola,TAV volainc)1675 static void volumeRampMulti(uint32_t channels, TO* out, size_t frameCount,
1676         const TI* in, TA* aux, TV *vol, const TV *volinc, TAV *vola, TAV volainc)
1677 {
1678     switch (channels) {
1679     case 1:
1680         volumeRampMulti<MIXTYPE, 1>(out, frameCount, in, aux, vol, volinc, vola, volainc);
1681         break;
1682     case 2:
1683         volumeRampMulti<MIXTYPE, 2>(out, frameCount, in, aux, vol, volinc, vola, volainc);
1684         break;
1685     case 3:
1686         volumeRampMulti<MIXTYPE_MONOVOL(MIXTYPE), 3>(out,
1687                 frameCount, in, aux, vol, volinc, vola, volainc);
1688         break;
1689     case 4:
1690         volumeRampMulti<MIXTYPE_MONOVOL(MIXTYPE), 4>(out,
1691                 frameCount, in, aux, vol, volinc, vola, volainc);
1692         break;
1693     case 5:
1694         volumeRampMulti<MIXTYPE_MONOVOL(MIXTYPE), 5>(out,
1695                 frameCount, in, aux, vol, volinc, vola, volainc);
1696         break;
1697     case 6:
1698         volumeRampMulti<MIXTYPE_MONOVOL(MIXTYPE), 6>(out,
1699                 frameCount, in, aux, vol, volinc, vola, volainc);
1700         break;
1701     case 7:
1702         volumeRampMulti<MIXTYPE_MONOVOL(MIXTYPE), 7>(out,
1703                 frameCount, in, aux, vol, volinc, vola, volainc);
1704         break;
1705     case 8:
1706         volumeRampMulti<MIXTYPE_MONOVOL(MIXTYPE), 8>(out,
1707                 frameCount, in, aux, vol, volinc, vola, volainc);
1708         break;
1709     }
1710 }
1711 
1712 /* MIXTYPE     (see AudioMixerOps.h MIXTYPE_* enumeration)
1713  * TO: int32_t (Q4.27) or float
1714  * TI: int32_t (Q4.27) or int16_t (Q0.15) or float
1715  * TA: int32_t (Q4.27) or float
1716  */
1717 template <int MIXTYPE,
1718         typename TO, typename TI, typename TV, typename TA, typename TAV>
volumeMulti(uint32_t channels,TO * out,size_t frameCount,const TI * in,TA * aux,const TV * vol,TAV vola)1719 static void volumeMulti(uint32_t channels, TO* out, size_t frameCount,
1720         const TI* in, TA* aux, const TV *vol, TAV vola)
1721 {
1722     switch (channels) {
1723     case 1:
1724         volumeMulti<MIXTYPE, 1>(out, frameCount, in, aux, vol, vola);
1725         break;
1726     case 2:
1727         volumeMulti<MIXTYPE, 2>(out, frameCount, in, aux, vol, vola);
1728         break;
1729     case 3:
1730         volumeMulti<MIXTYPE_MONOVOL(MIXTYPE), 3>(out, frameCount, in, aux, vol, vola);
1731         break;
1732     case 4:
1733         volumeMulti<MIXTYPE_MONOVOL(MIXTYPE), 4>(out, frameCount, in, aux, vol, vola);
1734         break;
1735     case 5:
1736         volumeMulti<MIXTYPE_MONOVOL(MIXTYPE), 5>(out, frameCount, in, aux, vol, vola);
1737         break;
1738     case 6:
1739         volumeMulti<MIXTYPE_MONOVOL(MIXTYPE), 6>(out, frameCount, in, aux, vol, vola);
1740         break;
1741     case 7:
1742         volumeMulti<MIXTYPE_MONOVOL(MIXTYPE), 7>(out, frameCount, in, aux, vol, vola);
1743         break;
1744     case 8:
1745         volumeMulti<MIXTYPE_MONOVOL(MIXTYPE), 8>(out, frameCount, in, aux, vol, vola);
1746         break;
1747     }
1748 }
1749 
1750 /* MIXTYPE     (see AudioMixerOps.h MIXTYPE_* enumeration)
1751  * USEFLOATVOL (set to true if float volume is used)
1752  * ADJUSTVOL   (set to true if volume ramp parameters needs adjustment afterwards)
1753  * TO: int32_t (Q4.27) or float
1754  * TI: int32_t (Q4.27) or int16_t (Q0.15) or float
1755  * TA: int32_t (Q4.27) or float
1756  */
1757 template <int MIXTYPE, bool USEFLOATVOL, bool ADJUSTVOL,
1758     typename TO, typename TI, typename TA>
volumeMix(TO * out,size_t outFrames,const TI * in,TA * aux,bool ramp)1759 void AudioMixer::Track::volumeMix(TO *out, size_t outFrames,
1760         const TI *in, TA *aux, bool ramp)
1761 {
1762     if (USEFLOATVOL) {
1763         if (ramp) {
1764             volumeRampMulti<MIXTYPE>(mMixerChannelCount, out, outFrames, in, aux,
1765                     mPrevVolume, mVolumeInc,
1766 #ifdef FLOAT_AUX
1767                     &mPrevAuxLevel, mAuxInc
1768 #else
1769                     &prevAuxLevel, auxInc
1770 #endif
1771                 );
1772             if (ADJUSTVOL) {
1773                 adjustVolumeRamp(aux != NULL, true);
1774             }
1775         } else {
1776             volumeMulti<MIXTYPE>(mMixerChannelCount, out, outFrames, in, aux,
1777                     mVolume,
1778 #ifdef FLOAT_AUX
1779                     mAuxLevel
1780 #else
1781                     auxLevel
1782 #endif
1783             );
1784         }
1785     } else {
1786         if (ramp) {
1787             volumeRampMulti<MIXTYPE>(mMixerChannelCount, out, outFrames, in, aux,
1788                     prevVolume, volumeInc, &prevAuxLevel, auxInc);
1789             if (ADJUSTVOL) {
1790                 adjustVolumeRamp(aux != NULL);
1791             }
1792         } else {
1793             volumeMulti<MIXTYPE>(mMixerChannelCount, out, outFrames, in, aux,
1794                     volume, auxLevel);
1795         }
1796     }
1797 }
1798 
1799 /* This process hook is called when there is a single track without
1800  * aux buffer, volume ramp, or resampling.
1801  * TODO: Update the hook selection: this can properly handle aux and ramp.
1802  *
1803  * MIXTYPE     (see AudioMixerOps.h MIXTYPE_* enumeration)
1804  * TO: int32_t (Q4.27) or float
1805  * TI: int32_t (Q4.27) or int16_t (Q0.15) or float
1806  * TA: int32_t (Q4.27)
1807  */
1808 template <int MIXTYPE, typename TO, typename TI, typename TA>
process__noResampleOneTrack()1809 void AudioMixer::process__noResampleOneTrack()
1810 {
1811     ALOGVV("process__noResampleOneTrack\n");
1812     LOG_ALWAYS_FATAL_IF(mEnabled.size() != 1,
1813             "%zu != 1 tracks enabled", mEnabled.size());
1814     const std::shared_ptr<Track> &t = mTracks[mEnabled[0]];
1815     const uint32_t channels = t->mMixerChannelCount;
1816     TO* out = reinterpret_cast<TO*>(t->mainBuffer);
1817     TA* aux = reinterpret_cast<TA*>(t->auxBuffer);
1818     const bool ramp = t->needsRamp();
1819 
1820     for (size_t numFrames = mFrameCount; numFrames > 0; ) {
1821         AudioBufferProvider::Buffer& b(t->buffer);
1822         // get input buffer
1823         b.frameCount = numFrames;
1824         t->bufferProvider->getNextBuffer(&b);
1825         const TI *in = reinterpret_cast<TI*>(b.raw);
1826 
1827         // in == NULL can happen if the track was flushed just after having
1828         // been enabled for mixing.
1829         if (in == NULL || (((uintptr_t)in) & 3)) {
1830             memset(out, 0, numFrames
1831                     * channels * audio_bytes_per_sample(t->mMixerFormat));
1832             ALOGE_IF((((uintptr_t)in) & 3), "process__noResampleOneTrack: bus error: "
1833                     "buffer %p track %p, channels %d, needs %#x",
1834                     in, &t, t->channelCount, t->needs);
1835             return;
1836         }
1837 
1838         const size_t outFrames = b.frameCount;
1839         t->volumeMix<MIXTYPE, is_same<TI, float>::value /* USEFLOATVOL */, false /* ADJUSTVOL */> (
1840                 out, outFrames, in, aux, ramp);
1841 
1842         out += outFrames * channels;
1843         if (aux != NULL) {
1844             aux += outFrames;
1845         }
1846         numFrames -= b.frameCount;
1847 
1848         // release buffer
1849         t->bufferProvider->releaseBuffer(&b);
1850     }
1851     if (ramp) {
1852         t->adjustVolumeRamp(aux != NULL, is_same<TI, float>::value);
1853     }
1854 }
1855 
processHapticData()1856 void AudioMixer::processHapticData()
1857 {
1858     // Need to keep consistent with VibrationEffect.scale(int, float, int)
1859     for (const auto &pair : mGroups) {
1860         // process by group of tracks with same output main buffer.
1861         const auto &group = pair.second;
1862         for (const int name : group) {
1863             const std::shared_ptr<Track> &t = mTracks[name];
1864             if (t->mHapticPlaybackEnabled) {
1865                 size_t sampleCount = mFrameCount * t->mMixerHapticChannelCount;
1866                 float gamma = t->getHapticScaleGamma();
1867                 float maxAmplitudeRatio = t->getHapticMaxAmplitudeRatio();
1868                 uint8_t* buffer = (uint8_t*)pair.first + mFrameCount * audio_bytes_per_frame(
1869                         t->mMixerChannelCount, t->mMixerFormat);
1870                 switch (t->mMixerFormat) {
1871                 // Mixer format should be AUDIO_FORMAT_PCM_FLOAT.
1872                 case AUDIO_FORMAT_PCM_FLOAT: {
1873                     float* fout = (float*) buffer;
1874                     for (size_t i = 0; i < sampleCount; i++) {
1875                         float mul = fout[i] >= 0 ? 1.0 : -1.0;
1876                         fout[i] = powf(fabsf(fout[i] / HAPTIC_MAX_AMPLITUDE_FLOAT), gamma)
1877                                 * maxAmplitudeRatio * HAPTIC_MAX_AMPLITUDE_FLOAT * mul;
1878                     }
1879                 } break;
1880                 default:
1881                     LOG_ALWAYS_FATAL("bad mMixerFormat: %#x", t->mMixerFormat);
1882                     break;
1883                 }
1884                 break;
1885             }
1886         }
1887     }
1888 }
1889 
1890 /* This track hook is called to do resampling then mixing,
1891  * pulling from the track's upstream AudioBufferProvider.
1892  *
1893  * MIXTYPE     (see AudioMixerOps.h MIXTYPE_* enumeration)
1894  * TO: int32_t (Q4.27) or float
1895  * TI: int32_t (Q4.27) or int16_t (Q0.15) or float
1896  * TA: int32_t (Q4.27) or float
1897  */
1898 template <int MIXTYPE, typename TO, typename TI, typename TA>
track__Resample(TO * out,size_t outFrameCount,TO * temp,TA * aux)1899 void AudioMixer::Track::track__Resample(TO* out, size_t outFrameCount, TO* temp, TA* aux)
1900 {
1901     ALOGVV("track__Resample\n");
1902     mResampler->setSampleRate(sampleRate);
1903     const bool ramp = needsRamp();
1904     if (ramp || aux != NULL) {
1905         // if ramp:        resample with unity gain to temp buffer and scale/mix in 2nd step.
1906         // if aux != NULL: resample with unity gain to temp buffer then apply send level.
1907 
1908         mResampler->setVolume(UNITY_GAIN_FLOAT, UNITY_GAIN_FLOAT);
1909         memset(temp, 0, outFrameCount * mMixerChannelCount * sizeof(TO));
1910         mResampler->resample((int32_t*)temp, outFrameCount, bufferProvider);
1911 
1912         volumeMix<MIXTYPE, is_same<TI, float>::value /* USEFLOATVOL */, true /* ADJUSTVOL */>(
1913                 out, outFrameCount, temp, aux, ramp);
1914 
1915     } else { // constant volume gain
1916         mResampler->setVolume(mVolume[0], mVolume[1]);
1917         mResampler->resample((int32_t*)out, outFrameCount, bufferProvider);
1918     }
1919 }
1920 
1921 /* This track hook is called to mix a track, when no resampling is required.
1922  * The input buffer should be present in in.
1923  *
1924  * MIXTYPE     (see AudioMixerOps.h MIXTYPE_* enumeration)
1925  * TO: int32_t (Q4.27) or float
1926  * TI: int32_t (Q4.27) or int16_t (Q0.15) or float
1927  * TA: int32_t (Q4.27) or float
1928  */
1929 template <int MIXTYPE, typename TO, typename TI, typename TA>
track__NoResample(TO * out,size_t frameCount,TO * temp __unused,TA * aux)1930 void AudioMixer::Track::track__NoResample(TO* out, size_t frameCount, TO* temp __unused, TA* aux)
1931 {
1932     ALOGVV("track__NoResample\n");
1933     const TI *in = static_cast<const TI *>(mIn);
1934 
1935     volumeMix<MIXTYPE, is_same<TI, float>::value /* USEFLOATVOL */, true /* ADJUSTVOL */>(
1936             out, frameCount, in, aux, needsRamp());
1937 
1938     // MIXTYPE_MONOEXPAND reads a single input channel and expands to NCHAN output channels.
1939     // MIXTYPE_MULTI reads NCHAN input channels and places to NCHAN output channels.
1940     in += (MIXTYPE == MIXTYPE_MONOEXPAND) ? frameCount : frameCount * mMixerChannelCount;
1941     mIn = in;
1942 }
1943 
1944 /* The Mixer engine generates either int32_t (Q4_27) or float data.
1945  * We use this function to convert the engine buffers
1946  * to the desired mixer output format, either int16_t (Q.15) or float.
1947  */
1948 /* static */
convertMixerFormat(void * out,audio_format_t mixerOutFormat,void * in,audio_format_t mixerInFormat,size_t sampleCount)1949 void AudioMixer::convertMixerFormat(void *out, audio_format_t mixerOutFormat,
1950         void *in, audio_format_t mixerInFormat, size_t sampleCount)
1951 {
1952     switch (mixerInFormat) {
1953     case AUDIO_FORMAT_PCM_FLOAT:
1954         switch (mixerOutFormat) {
1955         case AUDIO_FORMAT_PCM_FLOAT:
1956             memcpy(out, in, sampleCount * sizeof(float)); // MEMCPY. TODO optimize out
1957             break;
1958         case AUDIO_FORMAT_PCM_16_BIT:
1959             memcpy_to_i16_from_float((int16_t*)out, (float*)in, sampleCount);
1960             break;
1961         default:
1962             LOG_ALWAYS_FATAL("bad mixerOutFormat: %#x", mixerOutFormat);
1963             break;
1964         }
1965         break;
1966     case AUDIO_FORMAT_PCM_16_BIT:
1967         switch (mixerOutFormat) {
1968         case AUDIO_FORMAT_PCM_FLOAT:
1969             memcpy_to_float_from_q4_27((float*)out, (const int32_t*)in, sampleCount);
1970             break;
1971         case AUDIO_FORMAT_PCM_16_BIT:
1972             memcpy_to_i16_from_q4_27((int16_t*)out, (const int32_t*)in, sampleCount);
1973             break;
1974         default:
1975             LOG_ALWAYS_FATAL("bad mixerOutFormat: %#x", mixerOutFormat);
1976             break;
1977         }
1978         break;
1979     default:
1980         LOG_ALWAYS_FATAL("bad mixerInFormat: %#x", mixerInFormat);
1981         break;
1982     }
1983 }
1984 
1985 /* Returns the proper track hook to use for mixing the track into the output buffer.
1986  */
1987 /* static */
getTrackHook(int trackType,uint32_t channelCount,audio_format_t mixerInFormat,audio_format_t mixerOutFormat __unused)1988 AudioMixer::hook_t AudioMixer::Track::getTrackHook(int trackType, uint32_t channelCount,
1989         audio_format_t mixerInFormat, audio_format_t mixerOutFormat __unused)
1990 {
1991     if (!kUseNewMixer && channelCount == FCC_2 && mixerInFormat == AUDIO_FORMAT_PCM_16_BIT) {
1992         switch (trackType) {
1993         case TRACKTYPE_NOP:
1994             return &Track::track__nop;
1995         case TRACKTYPE_RESAMPLE:
1996             return &Track::track__genericResample;
1997         case TRACKTYPE_NORESAMPLEMONO:
1998             return &Track::track__16BitsMono;
1999         case TRACKTYPE_NORESAMPLE:
2000             return &Track::track__16BitsStereo;
2001         default:
2002             LOG_ALWAYS_FATAL("bad trackType: %d", trackType);
2003             break;
2004         }
2005     }
2006     LOG_ALWAYS_FATAL_IF(channelCount > MAX_NUM_CHANNELS);
2007     switch (trackType) {
2008     case TRACKTYPE_NOP:
2009         return &Track::track__nop;
2010     case TRACKTYPE_RESAMPLE:
2011         switch (mixerInFormat) {
2012         case AUDIO_FORMAT_PCM_FLOAT:
2013             return (AudioMixer::hook_t) &Track::track__Resample<
2014                     MIXTYPE_MULTI, float /*TO*/, float /*TI*/, TYPE_AUX>;
2015         case AUDIO_FORMAT_PCM_16_BIT:
2016             return (AudioMixer::hook_t) &Track::track__Resample<
2017                     MIXTYPE_MULTI, int32_t /*TO*/, int16_t /*TI*/, TYPE_AUX>;
2018         default:
2019             LOG_ALWAYS_FATAL("bad mixerInFormat: %#x", mixerInFormat);
2020             break;
2021         }
2022         break;
2023     case TRACKTYPE_NORESAMPLEMONO:
2024         switch (mixerInFormat) {
2025         case AUDIO_FORMAT_PCM_FLOAT:
2026             return (AudioMixer::hook_t) &Track::track__NoResample<
2027                             MIXTYPE_MONOEXPAND, float /*TO*/, float /*TI*/, TYPE_AUX>;
2028         case AUDIO_FORMAT_PCM_16_BIT:
2029             return (AudioMixer::hook_t) &Track::track__NoResample<
2030                             MIXTYPE_MONOEXPAND, int32_t /*TO*/, int16_t /*TI*/, TYPE_AUX>;
2031         default:
2032             LOG_ALWAYS_FATAL("bad mixerInFormat: %#x", mixerInFormat);
2033             break;
2034         }
2035         break;
2036     case TRACKTYPE_NORESAMPLE:
2037         switch (mixerInFormat) {
2038         case AUDIO_FORMAT_PCM_FLOAT:
2039             return (AudioMixer::hook_t) &Track::track__NoResample<
2040                     MIXTYPE_MULTI, float /*TO*/, float /*TI*/, TYPE_AUX>;
2041         case AUDIO_FORMAT_PCM_16_BIT:
2042             return (AudioMixer::hook_t) &Track::track__NoResample<
2043                     MIXTYPE_MULTI, int32_t /*TO*/, int16_t /*TI*/, TYPE_AUX>;
2044         default:
2045             LOG_ALWAYS_FATAL("bad mixerInFormat: %#x", mixerInFormat);
2046             break;
2047         }
2048         break;
2049     default:
2050         LOG_ALWAYS_FATAL("bad trackType: %d", trackType);
2051         break;
2052     }
2053     return NULL;
2054 }
2055 
2056 /* Returns the proper process hook for mixing tracks. Currently works only for
2057  * PROCESSTYPE_NORESAMPLEONETRACK, a mix involving one track, no resampling.
2058  *
2059  * TODO: Due to the special mixing considerations of duplicating to
2060  * a stereo output track, the input track cannot be MONO.  This should be
2061  * prevented by the caller.
2062  */
2063 /* static */
getProcessHook(int processType,uint32_t channelCount,audio_format_t mixerInFormat,audio_format_t mixerOutFormat)2064 AudioMixer::process_hook_t AudioMixer::getProcessHook(
2065         int processType, uint32_t channelCount,
2066         audio_format_t mixerInFormat, audio_format_t mixerOutFormat)
2067 {
2068     if (processType != PROCESSTYPE_NORESAMPLEONETRACK) { // Only NORESAMPLEONETRACK
2069         LOG_ALWAYS_FATAL("bad processType: %d", processType);
2070         return NULL;
2071     }
2072     if (!kUseNewMixer && channelCount == FCC_2 && mixerInFormat == AUDIO_FORMAT_PCM_16_BIT) {
2073         return &AudioMixer::process__oneTrack16BitsStereoNoResampling;
2074     }
2075     LOG_ALWAYS_FATAL_IF(channelCount > MAX_NUM_CHANNELS);
2076     switch (mixerInFormat) {
2077     case AUDIO_FORMAT_PCM_FLOAT:
2078         switch (mixerOutFormat) {
2079         case AUDIO_FORMAT_PCM_FLOAT:
2080             return &AudioMixer::process__noResampleOneTrack<
2081                     MIXTYPE_MULTI_SAVEONLY, float /*TO*/, float /*TI*/, TYPE_AUX>;
2082         case AUDIO_FORMAT_PCM_16_BIT:
2083             return &AudioMixer::process__noResampleOneTrack<
2084                     MIXTYPE_MULTI_SAVEONLY, int16_t /*TO*/, float /*TI*/, TYPE_AUX>;
2085         default:
2086             LOG_ALWAYS_FATAL("bad mixerOutFormat: %#x", mixerOutFormat);
2087             break;
2088         }
2089         break;
2090     case AUDIO_FORMAT_PCM_16_BIT:
2091         switch (mixerOutFormat) {
2092         case AUDIO_FORMAT_PCM_FLOAT:
2093             return &AudioMixer::process__noResampleOneTrack<
2094                     MIXTYPE_MULTI_SAVEONLY, float /*TO*/, int16_t /*TI*/, TYPE_AUX>;
2095         case AUDIO_FORMAT_PCM_16_BIT:
2096             return &AudioMixer::process__noResampleOneTrack<
2097                     MIXTYPE_MULTI_SAVEONLY, int16_t /*TO*/, int16_t /*TI*/, TYPE_AUX>;
2098         default:
2099             LOG_ALWAYS_FATAL("bad mixerOutFormat: %#x", mixerOutFormat);
2100             break;
2101         }
2102         break;
2103     default:
2104         LOG_ALWAYS_FATAL("bad mixerInFormat: %#x", mixerInFormat);
2105         break;
2106     }
2107     return NULL;
2108 }
2109 
2110 // ----------------------------------------------------------------------------
2111 } // namespace android
2112