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 20ee499291404a192b059f2e04c5afc65aa6cdd74cElliott Hughes#include <linux/futex.h> 21ee499291404a192b059f2e04c5afc65aa6cdd74cElliott Hughes#include <sys/syscall.h> 2209474df67278c0cd621b57c4aef1deaec4d8447fGlenn Kasten#include <utils/Debug.h> 23f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kasten#include "FastThread.h" 2497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include <utils/Thread.h> 2597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "StateQueue.h" 2697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include "FastMixerState.h" 272234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#include "FastMixerDumpState.h" 2897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastennamespace android { 3097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 312234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kastenclass AudioMixer; 322234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 3397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastentypedef StateQueue<FastMixerState> FastMixerStateQueue; 3497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 35f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kastenclass FastMixer : public FastThread { 3697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenpublic: 382234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixer(); 392234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual ~FastMixer(); 4097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 412234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixerStateQueue* sq(); 4297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 4397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenprivate: 4497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten FastMixerStateQueue mSQ; 4597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 462234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // callouts 472234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual const FastThreadState *poll(); 482234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void setLog(NBLog::Writer *logWriter); 492234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onIdle(); 502234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onExit(); 512234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual bool isSubClassCommand(FastThreadState::Command command); 522234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onStateChange(); 532234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten virtual void onWork(); 542234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 552234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // FIXME these former local variables need comments and to be renamed to have "m" prefix 562234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten static const FastMixerState initial; 572234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixerState preIdle; // copy of state before we went into idle 582234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten long slopNs; // accumulated time we've woken up too early (> 0) or too late (< 0) 592234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten int fastTrackNames[FastMixerState::kMaxFastTracks]; // handles used by mixer to identify tracks 602234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten int generations[FastMixerState::kMaxFastTracks]; // last observed mFastTracks[i].mGeneration 612234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten NBAIO_Sink *outputSink; 622234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten int outputSinkGen; 632234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten AudioMixer* mixer; 641258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung 651258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung // mSinkBuffer audio format is stored in format.mFormat. 661258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung void* mSinkBuffer; // used for mixer output format translation 671258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung // if sink format is different than mixer output. 681258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung size_t mSinkBufferSize; 699a59276fb465e492138e0576523b54079671e8f4Andy Hung uint32_t mSinkChannelCount; 709a59276fb465e492138e0576523b54079671e8f4Andy Hung audio_channel_mask_t mSinkChannelMask; 711258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung void* mMixerBuffer; // mixer output buffer. 721258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung size_t mMixerBufferSize; 731258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung audio_format_t mMixerBufferFormat; // mixer output format: AUDIO_FORMAT_PCM_(16_BIT|FLOAT). 741258c1ab592a899fabb1e31eb5db2ef413b6f38aAndy Hung 7545d68d366d07b10733c1e8af6a6984befbc08ce1Andy Hung enum {UNDEFINED, MIXED, ZEROED} mMixerBufferState; 762234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten NBAIO_Format format; 772234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten unsigned sampleRate; 782234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten int fastTracksGen; 792234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten FastMixerDumpState dummyDumpState; 802234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten uint32_t totalNativeFramesWritten; // copied to dumpState->mFramesWritten 812234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten 822234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten // next 2 fields are valid only when timestampStatus == NO_ERROR 832234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten AudioTimestamp timestamp; 842234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten uint32_t nativeFramesWrittenButNotPresented; 85288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten 862234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten}; // class FastMixer 8797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 8897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten} // namespace android 8997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 9097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif // ANDROID_AUDIO_FAST_MIXER_H 91