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 202ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung#include <atomic> 21f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kasten#include "FastThread.h" 2297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "StateQueue.h" 2397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "FastMixerState.h" 242234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#include "FastMixerDumpState.h" 2597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastennamespace android { 2797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 282234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kastenclass AudioMixer; 292234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 3097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastentypedef StateQueue<FastMixerState> FastMixerStateQueue; 3197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 32f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kastenclass FastMixer : public FastThread { 3397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenpublic: 352234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixer(); 362234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual ~FastMixer(); 3797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 382234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixerStateQueue* sq(); 3997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 402ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual void setMasterMono(bool mono) { mMasterMono.store(mono); /* memory_order_seq_cst */ } 41818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung virtual void setBoottimeOffset(int64_t boottimeOffset) { 42818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung mBoottimeOffset.store(boottimeOffset); /* memory_order_seq_cst */ 43818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung } 4497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenprivate: 4597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerStateQueue mSQ; 4697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 472234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // callouts 482234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual const FastThreadState *poll(); 492234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void setLog(NBLog::Writer *logWriter); 502234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onIdle(); 512234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onExit(); 522234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual bool isSubClassCommand(FastThreadState::Command command); 532234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onStateChange(); 542234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onWork(); 552234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 56e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // FIXME these former local variables need comments 57e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten static const FastMixerState sInitial; 58e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 59e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten FastMixerState mPreIdle; // copy of state before we went into idle 60e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mFastTrackNames[FastMixerState::kMaxFastTracks]; 61e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // handles used by mixer to identify tracks 62e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mGenerations[FastMixerState::kMaxFastTracks]; 63e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // last observed mFastTracks[i].mGeneration 64e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten NBAIO_Sink* mOutputSink; 65e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mOutputSinkGen; 66e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten AudioMixer* mMixer; 671258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung 681258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung // mSinkBuffer audio format is stored in format.mFormat. 69e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten void* mSinkBuffer; // used for mixer output format translation 701258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung // if sink format is different than mixer output. 71e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten size_t mSinkBufferSize; 72e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten uint32_t mSinkChannelCount; 739a59276fb465e492138e0576523b54079671e8f4Andy Hung audio_channel_mask_t mSinkChannelMask; 74e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten void* mMixerBuffer; // mixer output buffer. 75e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten size_t mMixerBufferSize; 76e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten audio_format_t mMixerBufferFormat; // mixer output format: AUDIO_FORMAT_PCM_(16_BIT|FLOAT). 771258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung 7845d68d366d07b10733c1e8af6a6984befbc08ce1Andy Hung enum {UNDEFINED, MIXED, ZEROED} mMixerBufferState; 79e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten NBAIO_Format mFormat; 80e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten unsigned mSampleRate; 81e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int mFastTracksGen; 82e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten FastMixerDumpState mDummyFastMixerDumpState; 83818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung int64_t mTotalNativeFramesWritten; // copied to dumpState->mFramesWritten 842234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 852234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // next 2 fields are valid only when timestampStatus == NO_ERROR 86818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung ExtendedTimestamp mTimestamp; 87818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung int64_t mNativeFramesWrittenButNotPresented; 88288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten 892ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung // accessed without lock between multiple threads. 902ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung std::atomic_bool mMasterMono; 91818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung std::atomic_int_fast64_t mBoottimeOffset; 922234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten}; // class FastMixer 9397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 9497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten} // namespace android 9597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 9697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif // ANDROID_AUDIO_FAST_MIXER_H 97