| /* |
| * 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 |