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