FastMixer.h revision e4a7ce250cb94a00aa2f76e5edca1c4479dc5401
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 20f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kasten#include "FastThread.h" 2197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "StateQueue.h" 2297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "FastMixerState.h" 232234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#include "FastMixerDumpState.h" 2497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastennamespace android { 2697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 272234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kastenclass AudioMixer; 282234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 2997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastentypedef StateQueue<FastMixerState> FastMixerStateQueue; 3097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 31f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kastenclass FastMixer : public FastThread { 3297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenpublic: 342234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixer(); 352234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual ~FastMixer(); 3697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 372234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixerStateQueue* sq(); 3897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenprivate: 4097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerStateQueue mSQ; 4197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 422234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // callouts 432234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual const FastThreadState *poll(); 442234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void setLog(NBLog::Writer *logWriter); 452234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onIdle(); 462234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onExit(); 472234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual bool isSubClassCommand(FastThreadState::Command command); 482234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onStateChange(); 492234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onWork(); 502234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 51e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // FIXME these former local variables need comments 52e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten static const FastMixerState sInitial; 53e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 54e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten FastMixerState mPreIdle; // copy of state before we went into idle 55e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten long mSlopNs; // accumulated time we've woken up too early (> 0) or too late (< 0) 56e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mFastTrackNames[FastMixerState::kMaxFastTracks]; 57e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // handles used by mixer to identify tracks 58e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mGenerations[FastMixerState::kMaxFastTracks]; 59e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // last observed mFastTracks[i].mGeneration 60e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten NBAIO_Sink* mOutputSink; 61e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mOutputSinkGen; 62e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten AudioMixer* mMixer; 631258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung 641258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung // mSinkBuffer audio format is stored in format.mFormat. 65e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten void* mSinkBuffer; // used for mixer output format translation 661258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung // if sink format is different than mixer output. 67e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten size_t mSinkBufferSize; 68e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten uint32_t mSinkChannelCount; 699a59276fb465e492138e0576523b54079671e8f4Andy Hung audio_channel_mask_t mSinkChannelMask; 70e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten void* mMixerBuffer; // mixer output buffer. 71e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten size_t mMixerBufferSize; 72e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten audio_format_t mMixerBufferFormat; // mixer output format: AUDIO_FORMAT_PCM_(16_BIT|FLOAT). 731258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung 7445d68d366d07b10733c1e8af6a6984befbc08ce1Andy Hung enum {UNDEFINED, MIXED, ZEROED} mMixerBufferState; 75e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten NBAIO_Format mFormat; 76e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten unsigned mSampleRate; 77e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mFastTracksGen; 78e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten FastMixerDumpState mDummyFastMixerDumpState; 79e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten uint32_t mTotalNativeFramesWritten; // copied to dumpState->mFramesWritten 802234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 812234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // next 2 fields are valid only when timestampStatus == NO_ERROR 82e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten AudioTimestamp mTimestamp; 83e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten uint32_t mNativeFramesWrittenButNotPresented; 84288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten 852234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten}; // class FastMixer 8697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 8797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten} // namespace android 8897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 8997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif // ANDROID_AUDIO_FAST_MIXER_H 90