FastMixer.h revision 21e8c50bd13ebe44f3088e26c9c6df0e163c469c
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
4597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// The FastMixerDumpState keeps a cache of FastMixer statistics that can be logged by dumpsys.
4697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// Since used non-atomically, only POD types are permitted, and the contents can't be trusted.
4797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// It has a different lifetime than the FastMixer, and so it can't be a member of FastMixer.
4897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct FastMixerDumpState {
4997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    FastMixerDumpState();
5097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    /*virtual*/ ~FastMixerDumpState();
5197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
5297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    void dump(int fd);
5397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
5497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    FastMixerState::Command mCommand;   // current command
5597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    uint32_t mWriteSequence;    // incremented before and after each write()
5697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    uint32_t mFramesWritten;    // total number of frames written successfully
5797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    uint32_t mNumTracks;        // total number of active fast tracks
5897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    uint32_t mWriteErrors;      // total number of write() errors
5997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    uint32_t mUnderruns;        // total number of underruns
6097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    uint32_t mOverruns;         // total number of overruns
6121e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten    uint32_t mSampleRate;
6221e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten    size_t   mFrameCount;
6397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#ifdef FAST_MIXER_STATISTICS
6497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    // cycle times in seconds
6597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    float    mMean;
6697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    float    mMinimum;
6797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    float    mMaximum;
6897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    float    mStddev;
6997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif
7097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten};
7197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
7297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten}   // namespace android
7397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
7497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif  // ANDROID_AUDIO_FAST_MIXER_H
75