| | |
| | | /* |
| | | Simple DirectMedia Layer |
| | | Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> |
| | | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
| | | |
| | | This software is provided 'as-is', without any express or implied |
| | | warranty. In no event will the authors be held liable for any damages |
| | |
| | | * Access to the raw audio mixing buffer for the SDL library. |
| | | */ |
| | | |
| | | #ifndef _SDL_audio_h |
| | | #define _SDL_audio_h |
| | | #ifndef SDL_audio_h_ |
| | | #define SDL_audio_h_ |
| | | |
| | | #include "SDL_stdinc.h" |
| | | #include "SDL_error.h" |
| | |
| | | |
| | | /** |
| | | * The calculated values in this structure are calculated by SDL_OpenAudio(). |
| | | * |
| | | * For multi-channel audio, the default SDL channel mapping is: |
| | | * 2: FL FR (stereo) |
| | | * 3: FL FR LFE (2.1 surround) |
| | | * 4: FL FR BL BR (quad) |
| | | * 5: FL FR FC BL BR (quad + center) |
| | | * 6: FL FR FC LFE SL SR (5.1 surround - last two can also be BL BR) |
| | | * 7: FL FR FC LFE BC SL SR (6.1 surround) |
| | | * 8: FL FR FC LFE BL BR SL SR (7.1 surround) |
| | | */ |
| | | typedef struct SDL_AudioSpec |
| | | { |
| | |
| | | SDL_AudioFormat format; /**< Audio data format */ |
| | | Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ |
| | | Uint8 silence; /**< Audio buffer silence value (calculated) */ |
| | | Uint16 samples; /**< Audio buffer size in samples (power of 2) */ |
| | | Uint16 samples; /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */ |
| | | Uint16 padding; /**< Necessary for some compile environments */ |
| | | Uint32 size; /**< Audio buffer size in bytes (calculated) */ |
| | | SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */ |
| | |
| | | SDL_AudioFormat format); |
| | | |
| | | /** |
| | | * A structure to hold a set of audio conversion filters and buffers. |
| | | * \brief Upper limit of filters in SDL_AudioCVT |
| | | * |
| | | * The maximum number of SDL_AudioFilter functions in SDL_AudioCVT is |
| | | * currently limited to 9. The SDL_AudioCVT.filters array has 10 pointers, |
| | | * one of which is the terminating NULL pointer. |
| | | */ |
| | | #define SDL_AUDIOCVT_MAX_FILTERS 9 |
| | | |
| | | /** |
| | | * \struct SDL_AudioCVT |
| | | * \brief A structure to hold a set of audio conversion filters and buffers. |
| | | * |
| | | * Note that various parts of the conversion pipeline can take advantage |
| | | * of SIMD operations (like SSE2, for example). SDL_AudioCVT doesn't require |
| | | * you to pass it aligned data, but can possibly run much faster if you |
| | | * set both its (buf) field to a pointer that is aligned to 16 bytes, and its |
| | | * (len) field to something that's a multiple of 16, if possible. |
| | | */ |
| | | #ifdef __GNUC__ |
| | | /* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't |
| | |
| | | int len_cvt; /**< Length of converted audio buffer */ |
| | | int len_mult; /**< buffer must be len*len_mult big */ |
| | | double len_ratio; /**< Given len, final size is len*len_ratio */ |
| | | SDL_AudioFilter filters[10]; /**< Filter list */ |
| | | SDL_AudioFilter filters[SDL_AUDIOCVT_MAX_FILTERS + 1]; /**< NULL-terminated list of filter functions */ |
| | | int filter_index; /**< Current audio conversion function */ |
| | | } SDL_AUDIOCVT_PACKED SDL_AudioCVT; |
| | | |
| | |
| | | * This function takes a source format and rate and a destination format |
| | | * and rate, and initializes the \c cvt structure with information needed |
| | | * by SDL_ConvertAudio() to convert a buffer of audio data from one format |
| | | * to the other. |
| | | * to the other. An unsupported format causes an error and -1 will be returned. |
| | | * |
| | | * \return -1 if the format conversion is not supported, 0 if there's |
| | | * no conversion needed, or 1 if the audio filter is set up. |
| | | * \return 0 if no conversion is needed, 1 if the audio filter is set up, |
| | | * or -1 on error. |
| | | */ |
| | | extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, |
| | | SDL_AudioFormat src_format, |
| | |
| | | * The data conversion may expand the size of the audio data, so the buffer |
| | | * \c cvt->buf should be allocated after the \c cvt structure is initialized by |
| | | * SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long. |
| | | * |
| | | * \return 0 on success or -1 if \c cvt->buf is NULL. |
| | | */ |
| | | extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); |
| | | |
| | | /* SDL_AudioStream is a new audio conversion interface. |
| | | The benefits vs SDL_AudioCVT: |
| | | - it can handle resampling data in chunks without generating |
| | | artifacts, when it doesn't have the complete buffer available. |
| | | - it can handle incoming data in any variable size. |
| | | - You push data as you have it, and pull it when you need it |
| | | */ |
| | | /* this is opaque to the outside world. */ |
| | | struct _SDL_AudioStream; |
| | | typedef struct _SDL_AudioStream SDL_AudioStream; |
| | | |
| | | /** |
| | | * Create a new audio stream |
| | | * |
| | | * \param src_format The format of the source audio |
| | | * \param src_channels The number of channels of the source audio |
| | | * \param src_rate The sampling rate of the source audio |
| | | * \param dst_format The format of the desired audio output |
| | | * \param dst_channels The number of channels of the desired audio output |
| | | * \param dst_rate The sampling rate of the desired audio output |
| | | * \return 0 on success, or -1 on error. |
| | | * |
| | | * \sa SDL_AudioStreamPut |
| | | * \sa SDL_AudioStreamGet |
| | | * \sa SDL_AudioStreamAvailable |
| | | * \sa SDL_AudioStreamFlush |
| | | * \sa SDL_AudioStreamClear |
| | | * \sa SDL_FreeAudioStream |
| | | */ |
| | | extern DECLSPEC SDL_AudioStream * SDLCALL SDL_NewAudioStream(const SDL_AudioFormat src_format, |
| | | const Uint8 src_channels, |
| | | const int src_rate, |
| | | const SDL_AudioFormat dst_format, |
| | | const Uint8 dst_channels, |
| | | const int dst_rate); |
| | | |
| | | /** |
| | | * Add data to be converted/resampled to the stream |
| | | * |
| | | * \param stream The stream the audio data is being added to |
| | | * \param buf A pointer to the audio data to add |
| | | * \param len The number of bytes to write to the stream |
| | | * \return 0 on success, or -1 on error. |
| | | * |
| | | * \sa SDL_NewAudioStream |
| | | * \sa SDL_AudioStreamGet |
| | | * \sa SDL_AudioStreamAvailable |
| | | * \sa SDL_AudioStreamFlush |
| | | * \sa SDL_AudioStreamClear |
| | | * \sa SDL_FreeAudioStream |
| | | */ |
| | | extern DECLSPEC int SDLCALL SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len); |
| | | |
| | | /** |
| | | * Get converted/resampled data from the stream |
| | | * |
| | | * \param stream The stream the audio is being requested from |
| | | * \param buf A buffer to fill with audio data |
| | | * \param len The maximum number of bytes to fill |
| | | * \return The number of bytes read from the stream, or -1 on error |
| | | * |
| | | * \sa SDL_NewAudioStream |
| | | * \sa SDL_AudioStreamPut |
| | | * \sa SDL_AudioStreamAvailable |
| | | * \sa SDL_AudioStreamFlush |
| | | * \sa SDL_AudioStreamClear |
| | | * \sa SDL_FreeAudioStream |
| | | */ |
| | | extern DECLSPEC int SDLCALL SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len); |
| | | |
| | | /** |
| | | * Get the number of converted/resampled bytes available. The stream may be |
| | | * buffering data behind the scenes until it has enough to resample |
| | | * correctly, so this number might be lower than what you expect, or even |
| | | * be zero. Add more data or flush the stream if you need the data now. |
| | | * |
| | | * \sa SDL_NewAudioStream |
| | | * \sa SDL_AudioStreamPut |
| | | * \sa SDL_AudioStreamGet |
| | | * \sa SDL_AudioStreamFlush |
| | | * \sa SDL_AudioStreamClear |
| | | * \sa SDL_FreeAudioStream |
| | | */ |
| | | extern DECLSPEC int SDLCALL SDL_AudioStreamAvailable(SDL_AudioStream *stream); |
| | | |
| | | /** |
| | | * Tell the stream that you're done sending data, and anything being buffered |
| | | * should be converted/resampled and made available immediately. |
| | | * |
| | | * It is legal to add more data to a stream after flushing, but there will |
| | | * be audio gaps in the output. Generally this is intended to signal the |
| | | * end of input, so the complete output becomes available. |
| | | * |
| | | * \sa SDL_NewAudioStream |
| | | * \sa SDL_AudioStreamPut |
| | | * \sa SDL_AudioStreamGet |
| | | * \sa SDL_AudioStreamAvailable |
| | | * \sa SDL_AudioStreamClear |
| | | * \sa SDL_FreeAudioStream |
| | | */ |
| | | extern DECLSPEC int SDLCALL SDL_AudioStreamFlush(SDL_AudioStream *stream); |
| | | |
| | | /** |
| | | * Clear any pending data in the stream without converting it |
| | | * |
| | | * \sa SDL_NewAudioStream |
| | | * \sa SDL_AudioStreamPut |
| | | * \sa SDL_AudioStreamGet |
| | | * \sa SDL_AudioStreamAvailable |
| | | * \sa SDL_AudioStreamFlush |
| | | * \sa SDL_FreeAudioStream |
| | | */ |
| | | extern DECLSPEC void SDLCALL SDL_AudioStreamClear(SDL_AudioStream *stream); |
| | | |
| | | /** |
| | | * Free an audio stream |
| | | * |
| | | * \sa SDL_NewAudioStream |
| | | * \sa SDL_AudioStreamPut |
| | | * \sa SDL_AudioStreamGet |
| | | * \sa SDL_AudioStreamAvailable |
| | | * \sa SDL_AudioStreamFlush |
| | | * \sa SDL_AudioStreamClear |
| | | */ |
| | | extern DECLSPEC void SDLCALL SDL_FreeAudioStream(SDL_AudioStream *stream); |
| | | |
| | | #define SDL_MIX_MAXVOLUME 128 |
| | | /** |
| | |
| | | * \param dev The device ID to which we will queue audio. |
| | | * \param data The data to queue to the device for later playback. |
| | | * \param len The number of bytes (not samples!) to which (data) points. |
| | | * \return zero on success, -1 on error. |
| | | * \return 0 on success, or -1 on error. |
| | | * |
| | | * \sa SDL_GetQueuedAudioSize |
| | | * \sa SDL_ClearQueuedAudio |
| | |
| | | #endif |
| | | #include "close_code.h" |
| | | |
| | | #endif /* _SDL_audio_h */ |
| | | #endif /* SDL_audio_h_ */ |
| | | |
| | | /* vi: set ts=4 sw=4 expandtab: */ |