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