1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_AUDIO_FAST_MIXER_H
18#define ANDROID_AUDIO_FAST_MIXER_H
19
20#include <atomic>
21#include "FastThread.h"
22#include "StateQueue.h"
23#include "FastMixerState.h"
24#include "FastMixerDumpState.h"
25
26namespace android {
27
28class AudioMixer;
29
30typedef StateQueue<FastMixerState> FastMixerStateQueue;
31
32class FastMixer : public FastThread {
33
34public:
35            FastMixer();
36    virtual ~FastMixer();
37
38            FastMixerStateQueue* sq();
39
40    virtual void setMasterMono(bool mono) { mMasterMono.store(mono); /* memory_order_seq_cst */ }
41    virtual void setBoottimeOffset(int64_t boottimeOffset) {
42        mBoottimeOffset.store(boottimeOffset); /* memory_order_seq_cst */
43    }
44private:
45            FastMixerStateQueue mSQ;
46
47    // callouts
48    virtual const FastThreadState *poll();
49    virtual void setLog(NBLog::Writer *logWriter);
50    virtual void onIdle();
51    virtual void onExit();
52    virtual bool isSubClassCommand(FastThreadState::Command command);
53    virtual void onStateChange();
54    virtual void onWork();
55
56    // FIXME these former local variables need comments
57    static const FastMixerState sInitial;
58
59    FastMixerState  mPreIdle;   // copy of state before we went into idle
60    int             mFastTrackNames[FastMixerState::kMaxFastTracks];
61                                // handles used by mixer to identify tracks
62    int             mGenerations[FastMixerState::kMaxFastTracks];
63                                // last observed mFastTracks[i].mGeneration
64    NBAIO_Sink*     mOutputSink;
65    int             mOutputSinkGen;
66    AudioMixer*     mMixer;
67
68    // mSinkBuffer audio format is stored in format.mFormat.
69    void*           mSinkBuffer;        // used for mixer output format translation
70                                        // if sink format is different than mixer output.
71    size_t          mSinkBufferSize;
72    uint32_t        mSinkChannelCount;
73    audio_channel_mask_t mSinkChannelMask;
74    void*           mMixerBuffer;       // mixer output buffer.
75    size_t          mMixerBufferSize;
76    audio_format_t  mMixerBufferFormat; // mixer output format: AUDIO_FORMAT_PCM_(16_BIT|FLOAT).
77
78    enum {UNDEFINED, MIXED, ZEROED} mMixerBufferState;
79    NBAIO_Format    mFormat;
80    unsigned        mSampleRate;
81    int             mFastTracksGen;
82    FastMixerDumpState mDummyFastMixerDumpState;
83    int64_t         mTotalNativeFramesWritten;  // copied to dumpState->mFramesWritten
84
85    // next 2 fields are valid only when timestampStatus == NO_ERROR
86    ExtendedTimestamp mTimestamp;
87    int64_t         mNativeFramesWrittenButNotPresented;
88
89    // accessed without lock between multiple threads.
90    std::atomic_bool mMasterMono;
91    std::atomic_int_fast64_t mBoottimeOffset;
92};  // class FastMixer
93
94}   // namespace android
95
96#endif  // ANDROID_AUDIO_FAST_MIXER_H
97