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