You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.1 KiB
119 lines
4.1 KiB
/*
|
|
* Copyright (C) 2012 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_AUDIO_FAST_MIXER_H
|
|
#define ANDROID_AUDIO_FAST_MIXER_H
|
|
|
|
#include <atomic>
|
|
#include <audio_utils/Balance.h>
|
|
#include "FastThread.h"
|
|
#include "StateQueue.h"
|
|
#include "FastMixerState.h"
|
|
#include "FastMixerDumpState.h"
|
|
#include "NBAIO_Tee.h"
|
|
|
|
namespace android {
|
|
|
|
class AudioMixer;
|
|
|
|
typedef StateQueue<FastMixerState> FastMixerStateQueue;
|
|
|
|
class FastMixer : public FastThread {
|
|
|
|
public:
|
|
/** FastMixer constructor takes as param the parent MixerThread's io handle (id)
|
|
for purposes of identification. */
|
|
explicit FastMixer(audio_io_handle_t threadIoHandle);
|
|
virtual ~FastMixer();
|
|
|
|
FastMixerStateQueue* sq();
|
|
|
|
virtual void setMasterMono(bool mono) { mMasterMono.store(mono); /* memory_order_seq_cst */ }
|
|
virtual void setMasterBalance(float balance) { mMasterBalance.store(balance); }
|
|
virtual float getMasterBalance() const { return mMasterBalance.load(); }
|
|
virtual void setBoottimeOffset(int64_t boottimeOffset) {
|
|
mBoottimeOffset.store(boottimeOffset); /* memory_order_seq_cst */
|
|
}
|
|
private:
|
|
FastMixerStateQueue mSQ;
|
|
|
|
// callouts
|
|
virtual const FastThreadState *poll();
|
|
virtual void setNBLogWriter(NBLog::Writer *logWriter);
|
|
virtual void onIdle();
|
|
virtual void onExit();
|
|
virtual bool isSubClassCommand(FastThreadState::Command command);
|
|
virtual void onStateChange();
|
|
virtual void onWork();
|
|
|
|
enum Reason {
|
|
REASON_REMOVE,
|
|
REASON_ADD,
|
|
REASON_MODIFY,
|
|
};
|
|
// called when a fast track of index has been removed, added, or modified
|
|
void updateMixerTrack(int index, Reason reason);
|
|
|
|
// FIXME these former local variables need comments
|
|
static const FastMixerState sInitial;
|
|
|
|
FastMixerState mPreIdle; // copy of state before we went into idle
|
|
int mGenerations[FastMixerState::kMaxFastTracks];
|
|
// last observed mFastTracks[i].mGeneration
|
|
NBAIO_Sink* mOutputSink;
|
|
int mOutputSinkGen;
|
|
AudioMixer* mMixer;
|
|
|
|
// mSinkBuffer audio format is stored in format.mFormat.
|
|
void* mSinkBuffer; // used for mixer output format translation
|
|
// if sink format is different than mixer output.
|
|
size_t mSinkBufferSize;
|
|
uint32_t mSinkChannelCount;
|
|
audio_channel_mask_t mSinkChannelMask;
|
|
void* mMixerBuffer; // mixer output buffer.
|
|
size_t mMixerBufferSize;
|
|
static constexpr audio_format_t mMixerBufferFormat = AUDIO_FORMAT_PCM_FLOAT;
|
|
|
|
uint32_t mAudioChannelCount; // audio channel count, excludes haptic channels.
|
|
|
|
enum {UNDEFINED, MIXED, ZEROED} mMixerBufferState;
|
|
NBAIO_Format mFormat;
|
|
unsigned mSampleRate;
|
|
int mFastTracksGen;
|
|
FastMixerDumpState mDummyFastMixerDumpState;
|
|
int64_t mTotalNativeFramesWritten; // copied to dumpState->mFramesWritten
|
|
|
|
// next 2 fields are valid only when timestampStatus == NO_ERROR
|
|
ExtendedTimestamp mTimestamp;
|
|
int64_t mNativeFramesWrittenButNotPresented;
|
|
|
|
audio_utils::Balance mBalance;
|
|
|
|
// accessed without lock between multiple threads.
|
|
std::atomic_bool mMasterMono;
|
|
std::atomic<float> mMasterBalance{};
|
|
std::atomic_int_fast64_t mBoottimeOffset;
|
|
|
|
const audio_io_handle_t mThreadIoHandle; // parent thread id for debugging purposes
|
|
#ifdef TEE_SINK
|
|
NBAIO_Tee mTee;
|
|
#endif
|
|
}; // class FastMixer
|
|
|
|
} // namespace android
|
|
|
|
#endif // ANDROID_AUDIO_FAST_MIXER_H
|