/*
 * Copyright 2015 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.
 */

/**
 * Implements an API to be used by A2DP to do streaming of music over a media
 * stream. This API provides mechanism to create and control playback of the
 * media stream depending on the data bits coming from the remote device. The
 * media stream is played over the default audio media stream type and hence
 * volume control is handled entirely by the Audio Manager (which is also the
 * original motivation for this solution.
 *
 * TODO: Once the AudioManager provides support for patching audio sources with
 * volume control we should deprecate this file.
 */

/**
 * Creates an audio track object and returns a void handle. Use this handle to
 * the
 * following functions.
 *
 * The ownership of the handle is maintained by the caller of this API and it
 * should eventually be
 * deleted using BtifAvrcpAudioTrackDelete (see below).
 */
void* BtifAvrcpAudioTrackCreate(int trackFreq, int bitsPerSample,
                                int channelCount);

/**
 * Starts the audio track.
 */
void BtifAvrcpAudioTrackStart(void* handle);

/**
 * Pauses the audio track.
 */
void BtifAvrcpAudioTrackPause(void* handle);

/**
 * Sets audio track gain.
 */
void BtifAvrcpSetAudioTrackGain(void* handle, float gain);

/**
 * Stop / Delete the audio track.
 * Delete should usually be called stop.
 */
void BtifAvrcpAudioTrackStop(void* handle);
void BtifAvrcpAudioTrackDelete(void* handle);

/**
 * Writes the audio track data to file.
 *
 * Used only for debugging.
 */
int BtifAvrcpAudioTrackWriteData(void* handle, void* audioBuffer,
                                 int bufferLength);
