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