FastMixer.h revision 288ed2103d96f3aabd7e6bea3c080ab6db164049
197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten/* 297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * Copyright (C) 2012 The Android Open Source Project 397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * 497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * you may not use this file except in compliance with the License. 697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * You may obtain a copy of the License at 797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * 897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * 1097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * Unless required by applicable law or agreed to in writing, software 1197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * See the License for the specific language governing permissions and 1497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * limitations under the License. 1597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten */ 1697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 1797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#ifndef ANDROID_AUDIO_FAST_MIXER_H 1897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#define ANDROID_AUDIO_FAST_MIXER_H 1997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include <utils/Thread.h> 2197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenextern "C" { 2297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "../private/bionic_futex.h" 2397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten} 2497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "StateQueue.h" 2597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "FastMixerState.h" 2697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastennamespace android { 2897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastentypedef StateQueue<FastMixerState> FastMixerStateQueue; 3097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenclass FastMixer : public Thread { 3297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenpublic: 3497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixer() : Thread(false /*canCallJava*/) { } 3597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten virtual ~FastMixer() { } 3697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerStateQueue* sq() { return &mSQ; } 3897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenprivate: 4097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten virtual bool threadLoop(); 4197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerStateQueue mSQ; 4297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 4397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten}; // class FastMixer 4497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 45288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten// Represents the dump state of a fast track 46288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kastenstruct FastTrackDump { 47288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten FastTrackDump() : mUnderruns(0) { } 48288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten /*virtual*/ ~FastTrackDump() { } 49288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten uint32_t mUnderruns; // Underrun status, represented as follows: 50288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten // bit 0 == 0 means not currently in underrun 51288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten // bit 0 == 1 means currently in underrun 52288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten // bits 1 to 31 == total number of underruns 53288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten // Not reset to zero for new tracks or if track generation changes. 54288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten // This representation is used to keep the information atomic. 55288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten}; 56288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten 5797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// The FastMixerDumpState keeps a cache of FastMixer statistics that can be logged by dumpsys. 58288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten// Each individual native word-sized field is accessed atomically. But the 59288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten// overall structure is non-atomic, that is there may be an inconsistency between fields. 60288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten// No barriers or locks are used for either writing or reading. 61288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten// Only POD types are permitted, and the contents shouldn't be trusted (i.e. do range checks). 6297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// It has a different lifetime than the FastMixer, and so it can't be a member of FastMixer. 6397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct FastMixerDumpState { 6497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerDumpState(); 6597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten /*virtual*/ ~FastMixerDumpState(); 6697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 6797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten void dump(int fd); 6897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 6997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerState::Command mCommand; // current command 7097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten uint32_t mWriteSequence; // incremented before and after each write() 7197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten uint32_t mFramesWritten; // total number of frames written successfully 7297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten uint32_t mNumTracks; // total number of active fast tracks 7397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten uint32_t mWriteErrors; // total number of write() errors 7497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten uint32_t mUnderruns; // total number of underruns 7597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten uint32_t mOverruns; // total number of overruns 7621e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten uint32_t mSampleRate; 7721e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten size_t mFrameCount; 78288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten struct timespec mMeasuredWarmupTs; // measured warmup time 79288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten uint32_t mWarmupCycles; // number of loop cycles required to warmup 80288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten FastTrackDump mTracks[FastMixerState::kMaxFastTracks]; 8197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#ifdef FAST_MIXER_STATISTICS 8297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten // cycle times in seconds 8397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten float mMean; 8497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten float mMinimum; 8597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten float mMaximum; 8697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten float mStddev; 8797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif 8897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten}; 8997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 9097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten} // namespace android 9197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 9297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif // ANDROID_AUDIO_FAST_MIXER_H 93