diff --git a/research/ma_data_source.h b/research/ma_data_source.h new file mode 100644 index 00000000..a68c990f --- /dev/null +++ b/research/ma_data_source.h @@ -0,0 +1,60 @@ +#ifndef miniaudio_data_source_h +#define miniaudio_data_source_h + +#ifdef __cplusplus +extern "C" { +#endif + +/* +The raw data source. This is the dry mix. +*/ +typedef enum +{ + ma_data_source_type_callbacks, + ma_data_source_type_decoder, + ma_data_source_type_waveform, + ma_data_source_type_noise +} ma_data_source_type; + +typedef struct +{ + void* pUserData; + ma_uint64 (* onRead)(void* pUserData, void* pFramesOut, ma_uint64 frameCount); + ma_result (* onSeek)(void* pUserData, ma_uint64 targetFrame); +} ma_data_source_callbacks; + +typedef struct +{ + ma_data_source_type type; + ma_data_source_callbacks callbacks; + ma_decoder_config decoder; + ma_waveform_config waveform; + ma_noise_config noise; + ma_allocation_callbacks allocationCallbacks; +} ma_data_source_config; + +typedef struct +{ + ma_data_source_type type; + ma_data_source_callbacks callbacks; + union + { + ma_decoder decoder; + ma_waveform waveform; + ma_noise noise; + } source; +} ma_data_source; + +ma_result ma_data_source_init_callbacks(const ma_data_source_config* pConfig); +ma_result ma_data_source_init_decoder(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_data_source_config* pConfig, ma_data_source* pDataSource); +ma_result ma_data_source_init_decoder_file(const char* pFilePath, const ma_data_source_config* pConfig, ma_data_source* pDataSource); +ma_result ma_data_source_init_decoder_memory(const void* pData, size_t dataSize, const ma_data_source_config* pConfig, ma_data_source* pDataSource); +ma_result ma_data_source_init_waveform(const ma_data_source_config* pConfig, ma_data_source* pDataSource); +ma_result ma_data_source_init_noise(const ma_data_source_config* pConfig, ma_data_source* pDataSource); +ma_uint64 ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount); +ma_result ma_data_source_seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 targetPCMFrame); + +#ifdef __cplusplus +} +#endif +#endif /* miniaudio_data_source_h */