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