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_STATE_H
1897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#define ANDROID_AUDIO_FAST_MIXER_STATE_H
1997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
2021e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten#include <system/audio.h>
212dd4bdd715f586d4d30cf90cc6fc2bbfbce60fe0Glenn Kasten#include <media/ExtendedAudioBufferProvider.h>
222dd4bdd715f586d4d30cf90cc6fc2bbfbce60fe0Glenn Kasten#include <media/nbaio/NBAIO.h>
239e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten#include <media/nbaio/NBLog.h>
2497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
2597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastennamespace android {
2697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
2797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct FastMixerDumpState;
2897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
2997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenclass VolumeProvider {
3097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenpublic:
3197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    // Return the track volume in U4_12 format: left in lower half, right in upper half. The
3297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    // provider implementation is responsible for validating that the return value is in range.
3397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    virtual uint32_t getVolumeLR() = 0;
3497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenprotected:
3597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    VolumeProvider() { }
3697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    virtual ~VolumeProvider() { }
3797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten};
3897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
3997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// Represents the state of a fast track
4097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct FastTrack {
4197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    FastTrack();
4297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    /*virtual*/ ~FastTrack();
4397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
44288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten    ExtendedAudioBufferProvider* mBufferProvider; // must be NULL if inactive, or non-NULL if active
4597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    VolumeProvider*         mVolumeProvider; // optional; if NULL then full-scale
4621e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten    unsigned                mSampleRate;     // optional; if zero then use mixer sample rate
4721e8c50bd13ebe44f3088e26c9c6df0e163c469cGlenn Kasten    audio_channel_mask_t    mChannelMask;    // AUDIO_CHANNEL_OUT_MONO or AUDIO_CHANNEL_OUT_STEREO
4897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    int                     mGeneration;     // increment when any field is assigned
4997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten};
5097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
5197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten// Represents a single state of the fast mixer
5297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct FastMixerState {
5397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten                FastMixerState();
5497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    /*virtual*/ ~FastMixerState();
5597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
5697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    static const unsigned kMaxFastTracks = 8;   // must be between 2 and 32 inclusive
5797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
5897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    // all pointer fields use raw pointers; objects are owned and ref-counted by the normal mixer
5997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    FastTrack   mFastTracks[kMaxFastTracks];
6097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    int         mFastTracksGen; // increment when any mFastTracks[i].mGeneration is incremented
61288ed2103d96f3aabd7e6bea3c080ab6db164049Glenn Kasten    unsigned    mTrackMask;     // bit i is set if and only if mFastTracks[i] is active
6297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    NBAIO_Sink* mOutputSink;    // HAL output device, must already be negotiated
6397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    int         mOutputSinkGen; // increment when mOutputSink is assigned
6497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    size_t      mFrameCount;    // number of frames per fast mix buffer
6597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    enum Command {
6697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        INITIAL = 0,            // used only for the initial state
6797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        HOT_IDLE = 1,           // do nothing
6897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        COLD_IDLE = 2,          // wait for the futex
6997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        IDLE = 3,               // either HOT_IDLE or COLD_IDLE
7097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        EXIT = 4,               // exit from thread
7197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        // The following commands also process configuration changes, and can be "or"ed:
7297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        MIX = 0x8,              // mix tracks
7397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        WRITE = 0x10,           // write to output sink
7497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten        MIX_WRITE = 0x18,       // mix tracks and write to output sink
7597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    } mCommand;
7697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    int32_t*    mColdFutexAddr; // for COLD_IDLE only, pointer to the associated futex
7797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    unsigned    mColdGen;       // increment when COLD_IDLE is requested so it's only performed once
7897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    // This might be a one-time configuration rather than per-state
7997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten    FastMixerDumpState* mDumpState; // if non-NULL, then update dump state periodically
80fbae5dae5187aca9d974cbe15ec818e9c6f56705Glenn Kasten    NBAIO_Sink* mTeeSink;       // if non-NULL, then duplicate write()s to this non-blocking sink
819e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten    NBLog::Writer* mNBLogWriter; // non-blocking logger
8297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten};  // struct FastMixerState
8397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
8497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten}   // namespace android
8597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten
8697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#endif  // ANDROID_AUDIO_FAST_MIXER_STATE_H
87