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