/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_AUDIOMANAGER_H
#define ANDROID_AUDIOMANAGER_H

namespace android {

// must be kept in sync with definitions in AudioPlaybackConfiguration.java
#define PLAYER_PIID_INVALID -1

// TODO (b/309532236) remove manual IAudioManager impl in favor of AIDL.
typedef enum {
    PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11,
    PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12,
    PLAYER_TYPE_AAUDIO = 13,
    PLAYER_TYPE_HW_SOURCE = 14,
    PLAYER_TYPE_EXTERNAL_PROXY = 15,
} player_type_t;

typedef enum {
    PLAYER_STATE_UNKNOWN  = -1,
    PLAYER_STATE_RELEASED = 0,
    PLAYER_STATE_IDLE     = 1,
    PLAYER_STATE_STARTED  = 2,
    PLAYER_STATE_PAUSED   = 3,
    PLAYER_STATE_STOPPED  = 4,
    PLAYER_UPDATE_DEVICE_ID = 5,
    PLAYER_UPDATE_PORT_ID = 6,
    PLAYER_UPDATE_MUTED = 7,
    PLAYER_UPDATE_FORMAT = 8,
} player_state_t;

static constexpr char
    kExtraPlayerEventSpatializedKey[] = "android.media.extra.PLAYER_EVENT_SPATIALIZED";
static constexpr char
    kExtraPlayerEventSampleRateKey[] = "android.media.extra.PLAYER_EVENT_SAMPLE_RATE";
static constexpr char
    kExtraPlayerEventChannelMaskKey[] = "android.media.extra.PLAYER_EVENT_CHANNEL_MASK";

static constexpr char
    kExtraPlayerEventMuteKey[] = "android.media.extra.PLAYER_EVENT_MUTE";
enum {
    PLAYER_MUTE_MASTER = (1 << 0),
    PLAYER_MUTE_STREAM_VOLUME = (1 << 1),
    PLAYER_MUTE_STREAM_MUTED = (1 << 2),
    PLAYER_MUTE_PLAYBACK_RESTRICTED = (1 << 3),
    PLAYER_MUTE_CLIENT_VOLUME = (1 << 4),
    PLAYER_MUTE_VOLUME_SHAPER = (1 << 5),
    PLAYER_MUTE_PORT_VOLUME = (1 << 6),
    PLAYER_MUTE_OP_AUDIO_CONTROL = (1 << 7),
};

struct mute_state_t {
    /** Flag used when the master volume is causing the mute state. */
    bool muteFromMasterMute = false;
    /** Flag used when the stream volume is causing the mute state. */
    bool muteFromStreamVolume = false;
    /** Flag used when the stream muted is causing the mute state. */
    bool muteFromStreamMuted = false;
    /** Flag used when playback is restricted by AppOps manager with OP_PLAY_AUDIO. */
    bool muteFromPlaybackRestricted = false;
    /** Flag used when audio track was muted by client volume. */
    bool muteFromClientVolume = false;
    /** Flag used when volume is muted by volume shaper. */
    bool muteFromVolumeShaper = false;
    /** Flag used when volume is muted by port volume. */
    bool muteFromPortVolume = false;
    /** Flag used when volume is muted by audio control op. */
    bool muteFromOpAudioControl = false;

    explicit operator int() const
    {
        int result = muteFromMasterMute * PLAYER_MUTE_MASTER;
        result |= muteFromStreamVolume * PLAYER_MUTE_STREAM_VOLUME;
        result |= muteFromStreamMuted * PLAYER_MUTE_STREAM_MUTED;
        result |= muteFromPlaybackRestricted * PLAYER_MUTE_PLAYBACK_RESTRICTED;
        result |= muteFromClientVolume * PLAYER_MUTE_CLIENT_VOLUME;
        result |= muteFromVolumeShaper * PLAYER_MUTE_VOLUME_SHAPER;
        result |= muteFromPortVolume * PLAYER_MUTE_PORT_VOLUME;
        result |= muteFromOpAudioControl * PLAYER_MUTE_OP_AUDIO_CONTROL;
        return result;
    }

    bool operator==(const mute_state_t& other) const
    {
        return static_cast<int>(*this) == static_cast<int>(other);
    }
};

// must be kept in sync with definitions in AudioManager.java
#define RECORD_RIID_INVALID -1

typedef enum {
    RECORDER_STATE_UNKNOWN  = -1,
    RECORDER_STATE_STARTED  = 0,
    RECORDER_STATE_STOPPED  = 1,
} recorder_state_t;

}; // namespace android

#endif // ANDROID_AUDIOMANAGER_H
