view Isolated/SoundDecoder.h @ 77:40078d025b73

Fixed stupid inverted logic bug with ALMIXER_DISABLE_PREDECODED_PRECOMPUTE_BUFFER_SIZE_OPTIMIZATION. I meant for this optimization to be on by default, but it was off. I noticed really slow loading for loadSound on a 5 min mp3 file on Android. (Nobody should be doing this.) The default was hitting the 1k buffer size. I decided to up the default to 4k, but now that the optimization is enabled, it generally won't be hit.
author Eric Wing <ewing@coronalabs.com>
date Mon, 13 Aug 2012 16:11:30 -0700
parents 398d1cb12448
children
line wrap: on
line source


/*
 * This is a wrapper interface that tries to provide a similar
 * front-end interface to SDL_sound.
 */

#ifndef SOUNDDECODER_H 
#define SOUNDDECODER_H

#ifdef __cplusplus
extern "C" {
#endif
	
	#if defined(_WIN32)
		#if defined(SOUND_DECODER_BUILD_LIBRARY)
			#define SOUND_DECODER_DECLSPEC __declspec(dllexport)
		#else
			#define SOUND_DECODER_DECLSPEC
		#endif
	#else
		#if defined(SOUND_DECODER_BUILD_LIBRARY)
			#if defined (__GNUC__) && __GNUC__ >= 4
				#define SOUND_DECODER_DECLSPEC __attribute__((visibility("default")))
			#else
				#define SOUND_DECODER_DECLSPEC
			#endif
		#else
			#define SOUND_DECODER_DECLSPEC
		#endif
	#endif

	#if defined(_WIN32)
		#define SOUND_DECODER_CALL __cdecl
	#else
		#define SOUND_DECODER_CALL
	#endif
	
#include <stdint.h>
#include <stddef.h>

#include "al.h" /* OpenAL */

/* Compatibility defines for SDL */
#define AUDIO_U8 0x0008
#define AUDIO_S8 0x8008
#define AUDIO_U16LSB 0x0010	
#define AUDIO_S16LSB 0x8010
#define AUDIO_U16MSB 0x1010
#define AUDIO_S16MSB 0x9010
#define AUDIO_U16 AUDIO_U16LSB
#define AUDIO_S16 AUDIO_S16LSB

/* Apple defines __BIG_ENDIAN__ and __LITTLE_ENDIAN__ appropriately.
 * Linux provides <endian.h>
 */
#if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
	#ifdef __linux__
		#include <endian.h>
		#if _BYTE_ORDER == _BIG_ENDIAN
			#define __BIG_ENDIAN__ 1
		#else
			#define __LITTLE_ENDIAN__ 1
		#endif
	#else /* __linux __ */
		#if defined(__hppa__) || \
			defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
			(defined(__MIPS__) && defined(__MISPEB__)) || \
			defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
			defined(__sparc__)
		
			#define __BIG_ENDIAN__ 1
		#else
			#define __LITTLE_ENDIAN__ 1
		#endif
	#endif /* __linux __ */
#endif /*  */


#if __BIG_ENDIAN__
	/* #warning "Using __BIG_ENDIAN__" */
	#define AUDIO_U16SYS AUDIO_U16MSB
	#define AUDIO_S16SYS AUDIO_S16MSB
#elif __LITTLE_ENDIAN__
	#define AUDIO_U16SYS	AUDIO_U16LSB
	#define AUDIO_S16SYS	AUDIO_S16LSB
#else
	#warning "Using __LITTLE_ENDIAN__ as fallback"
	#define AUDIO_U16SYS	AUDIO_U16LSB
	#define AUDIO_S16SYS	AUDIO_S16LSB
#endif

struct ALmixer_RWops;

typedef enum
{
	SOUND_SAMPLEFLAG_NONE = 0,
	SOUND_SAMPLEFLAG_CANSEEK = 1,
	SOUND_SAMPLEFLAG_EOF     = 1 << 29,
	SOUND_SAMPLEFLAG_ERROR   = 1 << 30,
	SOUND_SAMPLEFLAG_EAGAIN  = 1 << 31 
} SoundDecoder_SampleFlags;

#define Sound_SampleFlags SoundDecoder_SampleFlags;

typedef struct SoundDecoder_AudioInfo
{
    //uint16_t format;  /**< Equivalent of SDL_AudioSpec.format. */
    ALushort format;  /**< Equivalent of SDL_AudioSpec.format. */
    ALubyte channels;
    // uint8_t channels;
    //uint32_t rate; 
    ALuint rate; 
} SoundDecoder_AudioInfo;

//#define Sound_AudioInfo SoundDecoder_AudioInfo;
typedef struct SoundDecoder_AudioInfo Sound_AudioInfo;



typedef struct SoundDecoder_DecoderInfo
{
    const char** extensions;
    const char* description;
    const char* author;
    const char* url;
} SoundDecoder_DecoderInfo;

//#define Sound_DecoderInfo SoundDecoder_DecoderInfo;
typedef struct SoundDecoder_DecoderInfo Sound_DecoderInfo;



typedef struct SoundDecoder_Sample
{
    void* opaque;
    const SoundDecoder_DecoderInfo* decoder;
    SoundDecoder_AudioInfo desired;
    SoundDecoder_AudioInfo actual;
    void *buffer;
    size_t buffer_size;
    SoundDecoder_SampleFlags flags;
} SoundDecoder_Sample;

//#define Sound_Sample SoundDecoder_Sample;
typedef struct SoundDecoder_Sample Sound_Sample;


typedef struct SoundDecoder_Version
{
    int major;
    int minor;
    int patch;
} SoundDecoder_Version;

//#define Sound_Version SoundDecoder_Version;
typedef struct SoundDecoder_Version Sound_Version;


#define SOUNDDECODER_VER_MAJOR 0
#define SOUNDDECODER_VER_MINOR 0
#define SOUNDDECODER_VER_PATCH 1

#define SOUNDDECODER_VERSION(x) \
{ \
    (x)->major = SOUNDDECODER_VER_MAJOR; \
    (x)->minor = SOUNDDECODER_VER_MINOR; \
    (x)->patch = SOUNDDECODER_VER_PATCH; \
}

#define SOUND_VERSION SOUNDDECODER_VERSION

extern SOUND_DECODER_DECLSPEC void SOUND_DECODER_CALL SoundDecoder_GetLinkedVersion(SoundDecoder_Version *ver);
#define Sound_GetLinkedVersion SoundDecoder_GetLinkedVersion

extern SOUND_DECODER_DECLSPEC int SOUND_DECODER_CALL SoundDecoder_Init(void);
#define Sound_Init SoundDecoder_Init

extern SOUND_DECODER_DECLSPEC void SOUND_DECODER_CALL SoundDecoder_Quit(void);
#define Sound_Quit SoundDecoder_Quit


extern SOUND_DECODER_DECLSPEC const SOUND_DECODER_CALL SoundDecoder_DecoderInfo** SoundDecoder_AvailableDecoders(void);
#define Sound_AvailableDecoders SoundDecoder_AvailableDecoders


extern SOUND_DECODER_DECLSPEC const char* SOUND_DECODER_CALL SoundDecoder_GetError(void);
#define Sound_GetError SoundDecoder_GetError


extern SOUND_DECODER_DECLSPEC void SOUND_DECODER_CALL SoundDecoder_ClearError(void);
#define Sound_ClearError SoundDecoder_ClearError



extern SOUND_DECODER_DECLSPEC SoundDecoder_Sample* SOUND_DECODER_CALL SoundDecoder_NewSample(
	struct ALmixer_RWops* rw_ops,
	const char* ext,
	SoundDecoder_AudioInfo* desired,
	size_t buffer_size);
#define Sound_NewSample SoundDecoder_NewSample

extern SOUND_DECODER_DECLSPEC SoundDecoder_Sample* SOUND_DECODER_CALL SoundDecoder_NewSampleFromFile(const char* file_name,
	SoundDecoder_AudioInfo* desired,
	size_t bufferSize);
#define Sound_NewSampleFromFile SoundDecoder_NewSampleFromFile


extern SOUND_DECODER_DECLSPEC void SOUND_DECODER_CALL SoundDecoder_FreeSample(SoundDecoder_Sample* sound_sample);
#define Sound_FreeSample SoundDecoder_FreeSample


extern SOUND_DECODER_DECLSPEC ptrdiff_t SOUND_DECODER_CALL SoundDecoder_GetDuration(SoundDecoder_Sample* sound_sample);
#define Sound_GetDuration SoundDecoder_GetDuration

extern SOUND_DECODER_DECLSPEC int SOUND_DECODER_CALL SoundDecoder_SetBufferSize(SoundDecoder_Sample* sound_sample, size_t new_buffer_size);
#define Sound_SetBufferSize SoundDecoder_SetBufferSize

extern SOUND_DECODER_DECLSPEC size_t SOUND_DECODER_CALL SoundDecoder_Decode(SoundDecoder_Sample* sound_sample);
#define Sound_Decode SoundDecoder_Decode

extern SOUND_DECODER_DECLSPEC size_t SOUND_DECODER_CALL SoundDecoder_DecodeAll(SoundDecoder_Sample* sound_sample);
#define Sound_DecodeAll SoundDecoder_DecodeAll

extern SOUND_DECODER_DECLSPEC int SOUND_DECODER_CALL SoundDecoder_Rewind(SoundDecoder_Sample* sound_sample);
#define Sound_Rewind SoundDecoder_Rewind

extern SOUND_DECODER_DECLSPEC int SOUND_DECODER_CALL SoundDecoder_Seek(SoundDecoder_Sample* sound_sample, size_t ms);
#define Sound_Seek SoundDecoder_Seek


/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif

#endif