/*
 * Copyright (C) 2012-2013 Wolfson Microelectronics plc
 *
 * 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 AUDIO_CONFIG_H
#define AUDIO_CONFIG_H

#include <stddef.h>
#include <system/audio.h>

struct mixer_ctl;
struct config_mgr;
struct audio_config;

/** Stream type */
enum stream_type {
    e_stream_out_pcm,
    e_stream_in_pcm,
    e_stream_out_compress,
    e_stream_in_compress,
    e_stream_hardware           /* unspecified type routed in hardware */
};

/** Information about a stream */
struct hw_stream {
    enum stream_type    type : 8;
    uint8_t             card_number;
    uint8_t             device_number;
    unsigned int        rate;
    unsigned int        period_size;
    unsigned int        period_count;
};

/** Test whether a stream is an input */
static inline bool stream_is_input( const struct hw_stream *stream )
{
    return (stream->type == e_stream_in_pcm)
        || (stream->type == e_stream_in_compress);
}

/** Test whether a stream is PCM */
static inline bool stream_is_pcm( const struct hw_stream *stream )
{
    return (stream->type == e_stream_out_pcm)
        || (stream->type == e_stream_in_pcm);
}

/** Test whether a stream is compressed */
static inline bool stream_is_compressed( const struct hw_stream *stream )
{
    return (stream->type == e_stream_out_compress)
        || (stream->type == e_stream_in_compress);
}

/** Test whether stream is PCM output */
static inline bool stream_is_pcm_out( const struct hw_stream *stream )
{
return (stream->type == e_stream_out_pcm);
}

/** Test whether stream is PCM input */
static inline bool stream_is_pcm_in( const struct hw_stream *stream )
{
return (stream->type == e_stream_in_pcm);
}

/** Test whether stream is compressed output */
static inline bool stream_is_compressed_out( const struct hw_stream *stream )
{
return (stream->type == e_stream_out_compress);
}

/** Test whether stream is compressed input */
static inline bool stream_is_compressed_in( const struct hw_stream *stream )
{
return (stream->type == e_stream_in_compress);
}

/** Test whether stream is a hardware link */
static inline bool stream_is_hardware( const struct hw_stream *stream )
{
return (stream->type == e_stream_hardware);
}

/** Initialize audio config layer */
struct config_mgr *init_audio_config();

/** Delete audio config layer */
void free_audio_config( struct config_mgr *cm );

/** Get list of all supported devices */
uint32_t get_supported_devices( struct config_mgr *cm );

/** Find a suitable stream and return pointer to it */
const struct hw_stream *get_stream(  struct config_mgr *cm,
                                        const audio_devices_t devices,
                                        const audio_output_flags_t flags,
                                        const struct audio_config *config );

/** Find a named custom stream and return a pointer to it */
const struct hw_stream *get_named_stream(struct config_mgr *cm,
                                   const char *name);

/** Test whether a named custom stream is defined */
bool is_named_stream_defined(struct config_mgr *cm, const char *name);

/** Release stream */
void release_stream( const struct hw_stream *stream );

/** Get currently connected routes */
uint32_t get_current_routes( const struct hw_stream *stream );

/** Apply new device routing to a stream */
void apply_route( const struct hw_stream *stream, uint32_t devices );

/** Get bitmask of devices currently connected to this stream */
uint32_t get_routed_devices( const struct hw_stream *stream );

/** Adjust routing for all streams that alter with orentiation */
void rotate_routes( struct config_mgr *cm, int orientation );

/** Apply hardware volume */
int set_hw_volume( const struct hw_stream *stream, int left_pc, int right_pc);

/** Apply a custom use-case
 *
 * @return      0 on success
 * @return      -ENOSYS if the usecase not declared
 */
int apply_use_case( const struct hw_stream* stream,
                    const char *setting,
                    const char *case_name);
#endif  /* ifndef AUDIO_CONFIG_H */
