Import existing source tree; original VCS history is no longer available. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
262 lines
7.5 KiB
C
262 lines
7.5 KiB
C
/*(LGPL)
|
|
---------------------------------------------------------------------------
|
|
a_wave.h - Wava Data Manager
|
|
---------------------------------------------------------------------------
|
|
* Copyright (C) 2001-2003, 2007 David Olofson
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 of the License, or (at
|
|
* your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
/*
|
|
* Note on sample formats and clipping:
|
|
* * Operations on integer waveforms will saturate if the
|
|
* respective integer range is exceeded.
|
|
*
|
|
* * Operations on floating point waveforms will *not*
|
|
* saturate at all, under any circumstances.
|
|
*
|
|
* * Converting from floating point to integer formats,
|
|
* as well as mixing floating point waveforms into
|
|
* integer waveforms will saturate if the respective
|
|
* integer range is exceeded.
|
|
*/
|
|
|
|
#ifndef _A_WAVE_H_
|
|
#define _A_WAVE_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "a_types.h"
|
|
#include "a_midifile.h"
|
|
|
|
/*----------------------------------------------------------
|
|
Open/Close (Normally called by the audio engine.)
|
|
----------------------------------------------------------*/
|
|
void audio_wave_open(void);
|
|
void audio_wave_close(void);
|
|
|
|
|
|
typedef enum _audio_free_t
|
|
{
|
|
HTF_DONT = 0,
|
|
HTF_FREE
|
|
} _audio_free_t;
|
|
|
|
/*----------------------------------------------------------
|
|
Audio Wave (Raw wave data reference + info)
|
|
----------------------------------------------------------*/
|
|
typedef struct
|
|
{
|
|
/* Format info */
|
|
audio_formats_t format;
|
|
int rate; /* samples/second */
|
|
int looped; /* Must be here for preprocessing */
|
|
|
|
/* "Real" data */
|
|
union
|
|
{
|
|
Sint8 *si8;
|
|
Sint16 *si16;
|
|
float *f32;
|
|
midi_file_t *midi;
|
|
} data;
|
|
unsigned size; /* Data size in *bytes* */
|
|
unsigned xsize; /* End extension size in *bytes* */
|
|
|
|
/* Reference/allocation management */
|
|
_audio_free_t howtofree;
|
|
unsigned allocated;
|
|
|
|
/* Handy precalculated stuff */
|
|
unsigned speed; /* For original sample rate */
|
|
unsigned samples; /* Number of *frames*, actually */
|
|
unsigned play_samples; /* For the voice mixer... */
|
|
} audio_wave_t;
|
|
|
|
void _audio_wave_init(void);
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Basic Wave API
|
|
----------------------------------------------------------*/
|
|
|
|
/*
|
|
* Allocate a new wave for later use.
|
|
* If 'id' is -1, a wave id will be allocated automatically.
|
|
*
|
|
* Returns your wave id, or a negative value in the case of
|
|
* failure.
|
|
*/
|
|
int audio_wave_alloc(int wid);
|
|
|
|
/*
|
|
* Allocate a range of waves for later use, to prevent the from
|
|
* being stolen by the dynamic allocation system.
|
|
*
|
|
* Returns your first wave id, or a negative value in the case of
|
|
* failure.
|
|
*/
|
|
int audio_wave_alloc_range(int first_wid, int last_wid);
|
|
|
|
/*
|
|
* Get the low level struct for waveform 'wid'. (This is
|
|
* mostly meant for low level libraries, not applications.)
|
|
*
|
|
* Returns NULL if the waveform doesn't exist.
|
|
*/
|
|
audio_wave_t *audio_wave_get(int wid);
|
|
|
|
/*
|
|
* Set the path to data files.
|
|
*
|
|
* This must be a valid path, terminated by a
|
|
* '/', '\', ':' or whatever "directory separator"
|
|
* the current platform is using, and will be
|
|
* prepended to any external file names used in
|
|
* other calls.
|
|
*/
|
|
void audio_set_path(const char *path);
|
|
|
|
/* Returns the current path. */
|
|
const char *audio_path(void);
|
|
|
|
/*
|
|
* Loads a waveform from disk.
|
|
*
|
|
* If 'id' is -1, a new waveform will be allocated automatically.
|
|
*
|
|
* The file name can be the path to an audio file of any supported
|
|
* format.
|
|
*
|
|
* If the file format cannot be identified, the file is assumed to
|
|
* be raw data, and the audio format is assumed to be of the
|
|
* format specified for the waveform. You should set the proper
|
|
* format (using audio_wave_format()) *before* loading a raw audio
|
|
* file, to minimize the risk of extra work for the engine.
|
|
*
|
|
* Returns the id of the new wave, or a negative value in the
|
|
* case of failure.
|
|
*/
|
|
int audio_wave_load(int wid, const char *name, int looped);
|
|
|
|
/*
|
|
* Saves a waveform to disk.
|
|
*
|
|
FIXME: Temporary kludge:
|
|
FIXME: The file will be a raw data file with the first 3 bytes
|
|
FIXME: containing ASCII "RAW". The 4th byte contains the format code
|
|
FIXME: as defined by the audio_formats_t enum.
|
|
*/
|
|
int audio_wave_save(int wid, const char *name);
|
|
|
|
/*
|
|
* "Loads" a waveform from a raw data buffer in memory.
|
|
* The audio engine will *not* free the memory you pass here, but
|
|
* will copy it into a private buffer internally, so your buffer
|
|
* does not have to be static. (The internal copy is often needed
|
|
* anyway due to the need for preprocessing.)
|
|
*
|
|
* The data is assumed to be of the format specified with
|
|
* audio_wave_format().
|
|
*
|
|
* Returns the id of the new wave, or a negative value in the
|
|
* case of failure.
|
|
*/
|
|
int audio_wave_load_mem(int wid, void *data, unsigned size, int looped);
|
|
|
|
/*
|
|
* Removes a waveform from memory, and frees the wave id.
|
|
*/
|
|
void audio_wave_free(int wid); /* -1 to free all */
|
|
|
|
/*
|
|
* Specify the data format and sample rate of a waveform.
|
|
*
|
|
* If 'id' is -1, a new waveform will be allocated automatically.
|
|
*
|
|
* Note that this call *will not* convert any data! This call
|
|
* should normally not be used except when loading raw audio
|
|
* files.
|
|
*
|
|
* Returns the id of the new wave, or a negative value in the
|
|
* case of failure. (Yes, it *can* fail, as it may have to
|
|
* reallocate the wave data buffer!)
|
|
*/
|
|
int audio_wave_format(int wid, audio_formats_t fmt, int fs);
|
|
|
|
/*
|
|
* Creates a silent wave of the specified size in *samples*.
|
|
*
|
|
* The data will be of the format specified with
|
|
* audio_wave_format().
|
|
*
|
|
* Returns the id of the new wave, or a negative value in the
|
|
* case of failure.
|
|
*/
|
|
int audio_wave_blank(int wid, unsigned samples, int looped);
|
|
|
|
/*
|
|
* Convert a waveform from it's current format into the specified
|
|
* format. If there is no data, you just get a new empty wave of
|
|
* the specified format, or if new_vwid == wid, the format is
|
|
* changed into the one you specify.
|
|
*
|
|
* If new_wid is -1, a new wave will be allocated automatically.
|
|
* new_wid may equal wid, for "in-place" conversion.
|
|
*
|
|
* By setting either 'fmt' to -1 or 'fs' to 0, the respective
|
|
* parameter is copied from the original wave. Setting both to
|
|
* -1 respectively 0 is equivalent to calling audio_wave_clone().
|
|
*
|
|
* 'resamp' is the resampling method to use, if resampling is
|
|
* needed.
|
|
*
|
|
* Returns the new wave id, or a negative value in the case of
|
|
* failure.
|
|
*/
|
|
int audio_wave_convert(int wid, int new_wid, audio_formats_t fmt,
|
|
int fs, audio_resample_t resamp);
|
|
|
|
/*
|
|
* Copy a waveform.
|
|
*
|
|
* If new_wid is -1, a new wave will be allocated automatically.
|
|
*
|
|
* Returns the clone wave id, or a negative value in the case of
|
|
* failure.
|
|
*/
|
|
int audio_wave_clone(int wid, int new_wid);
|
|
|
|
/*
|
|
* Converts a waveform (if needed) and prepares it for playback
|
|
* by the real time synth engine. Passing -1 for 'wid' will
|
|
* prepare *all* waveforms that aren't ready for playback
|
|
* already.
|
|
*/
|
|
void audio_wave_prepare(int wid);
|
|
|
|
/*
|
|
* Dump waveform info to log.
|
|
*/
|
|
void audio_wave_info(int wid);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif /*_A_WAVE_H_*/
|