/*
   Copyright (C) 2003 Commonwealth Scientific and Industrial Research
   Organisation (CSIRO) Australia

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   - Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

   - Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

   - Neither the name of CSIRO Australia nor the names of its
   contributors may be used to endorse or promote products derived from
   this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef __FISH_SOUND_DECODE_H__
#define __FISH_SOUND_DECODE_H__

#ifdef __cplusplus
extern "C" {
#endif

/** \file
 * Decode functions and callback prototypes
 */

/**
 * Signature of a callback for libfishsound to call when it has decoded
 * PCM audio data, and you want this provided as non-interleaved floats.
 * \param fsound The FishSound* handle
 * \param pcm The decoded audio
 * \param frames The count of frames decoded
 * \param user_data Arbitrary user data
 * \retval FISH_SOUND_CONTINUE Continue decoding
 * \retval FISH_SOUND_STOP_OK Stop decoding immediately and
 * return control to the fish_sound_decode() caller
 * \retval FISH_SOUND_STOP_ERR Stop decoding immediately, purge buffered
 * data, and return control to the fish_sound_decode() caller
 */
typedef int (*FishSoundDecoded_Float) (FishSound * fsound, float * pcm[],
				       long frames, void * user_data);

/**
 * Signature of a callback for libfishsound to call when it has decoded
 * PCM audio data, and you want this provided as interleaved floats.
 * \param fsound The FishSound* handle
 * \param pcm The decoded audio
 * \param frames The count of frames decoded
 * \param user_data Arbitrary user data
 * \retval FISH_SOUND_CONTINUE Continue decoding
 * \retval FISH_SOUND_STOP_OK Stop decoding immediately and
 * return control to the fish_sound_decode() caller
 * \retval FISH_SOUND_STOP_ERR Stop decoding immediately, purge buffered
 * data, and return control to the fish_sound_decode() caller
 */
typedef int (*FishSoundDecoded_FloatIlv) (FishSound * fsound, float ** pcm,
					  long frames, void * user_data);

/**
 * Set the callback for libfishsound to call when it has a block of decoded
 * PCM audio ready, and you want this provided as non-interleaved floats.
 * \param fsound A FishSound* handle (created with mode FISH_SOUND_DECODE)
 * \param decoded The callback to call
 * \param user_data Arbitrary user data to pass to the callback
 * \returns 0 on success, -1 on failure
 */
int fish_sound_set_decoded_float (FishSound * fsound,
				  FishSoundDecoded_Float decoded,
				  void * user_data);

/**
 * Set the callback for libfishsound to call when it has a block of decoded
 * PCM audio ready, and you want this provided as interleaved floats.
 * \param fsound A FishSound* handle (created with mode FISH_SOUND_DECODE)
 * \param decoded The callback to call
 * \param user_data Arbitrary user data to pass to the callback
 * \returns 0 on success, -1 on failure
 */
int fish_sound_set_decoded_float_ilv (FishSound * fsound,
				      FishSoundDecoded_FloatIlv decoded,
				      void * user_data);

/**
 * Decode a block of compressed data.
 * No internal buffering is done, so a complete compressed audio packet
 * must be passed each time.
 * \param fsound A FishSound* handle (created with mode FISH_SOUND_DECODE)
 * \param buf A buffer containing a compressed audio packet
 * \param bytes A count of bytes to decode (i.e. the length of buf)
 * \returns The number of bytes consumed
 * \retval FISH_SOUND_ERR_STOP_OK Decoding was stopped by a FishSoundDecode*
 * callback returning FISH_SOUND_STOP_OK before any input bytes were consumed.
 * This will occur when PCM is decoded from previously buffered input, and
 * stopping is immediately requested.
 * \retval FISH_SOUND_ERR_STOP_ERR Decoding was stopped by a FishSoundDecode*
 * callback returning FISH_SOUND_STOP_ERR before any input bytes were consumed.
 * This will occur when PCM is decoded from previously buffered input, and
 * stopping is immediately requested.
 */
long fish_sound_decode (FishSound * fsound, unsigned char * buf, long bytes);

#ifdef __cplusplus
}
#endif

#endif /* __FISH_SOUND_DECODE_H__ */
