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