BuildTools
Qt
Src
Agave
Components
Elevator
Mastering
Plugins
ReplayGainAnalysis
WAT
Wasabi
Wasabi2
Winamp
aacPlus
aacdec
aacdec-mft
adpcm
alac
albumart
apev2
auth
bmp
burnlib
codesign
config
devices
external_dependencies
cpr
giflib
intel_ipp_6.1.1.035
libdiscid-0.6.2
libmp4v2
microsoft_directx_sdk_2010
openmpt-trunk
.github
build
common
contrib
doc
examples
include
installer
libopenmpt
bindings
doc
dox
.clang-format
Doxyfile
in_openmpt.cpp
libopenmpt.h
libopenmpt.hpp
libopenmpt.pc.in
libopenmpt_c.cpp
libopenmpt_config.h
libopenmpt_cxx.cpp
libopenmpt_ext.h
libopenmpt_ext.hpp
libopenmpt_ext_impl.cpp
libopenmpt_ext_impl.hpp
libopenmpt_impl.cpp
libopenmpt_impl.hpp
libopenmpt_internal.h
libopenmpt_plugin_gui.cpp
libopenmpt_plugin_gui.hpp
libopenmpt_plugin_gui.rc
libopenmpt_plugin_settings.hpp
libopenmpt_stream_callbacks_buffer.h
libopenmpt_stream_callbacks_fd.h
libopenmpt_stream_callbacks_file.h
libopenmpt_test.cpp
libopenmpt_version.h
libopenmpt_version.mk
libopenmpt_version.rc
resource.h
xmp-openmpt.cpp
misc
mptrack
openmpt123
packageTemplate
pluginBridge
sounddsp
soundlib
src
test
tracklib
unarchiver
.appveyor.yml
.cirrus.yml
.clang-format
.gitattributes
.gitignore
LICENSE
Makefile
README.md
f263
filereader
freetypewac
gif
gracenote
h264
h264dec
id3v2
ie_plugin
installer
jpeg
libvp6
libvpShared
mp3-mpg123
mp4v
mpeg4dec
nde
nprt_plugin
ns-eel
ns-eel2
nsavi
nsmkv
nsutil
nsv
nsvdec_vp3
nsvdec_vp5
nsvdec_vp6
nswasabi
nu
omBrowser
pcm
pfc
playlist
plist
png
replicant
resources
tagz
tataki
theora
timer
vlb
vp32
vp6
vp8x
wbm
winampAll
winampa
xml
xspf
vcpkg-ports
.gitignore
LICENSE.md
README.md
automate-git.py
cef_x86.bat
install-packages.cmd
vcpkg_version_finder.py
winampAll_2019.sln
133 lines
2.9 KiB
C
133 lines
2.9 KiB
C
/*
|
|
* libopenmpt_stream_callbacks_file.h
|
|
* ----------------------------------
|
|
* Purpose: libopenmpt public c interface
|
|
* Notes : (currently none)
|
|
* Authors: OpenMPT Devs
|
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
|
*/
|
|
|
|
#ifndef LIBOPENMPT_STREAM_CALLBACKS_FILE_H
|
|
#define LIBOPENMPT_STREAM_CALLBACKS_FILE_H
|
|
|
|
#include "libopenmpt.h"
|
|
|
|
#include <limits.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#ifdef _MSC_VER
|
|
#include <wchar.h> /* off_t */
|
|
#endif
|
|
|
|
/*! \addtogroup libopenmpt_c
|
|
* @{
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* This stuff has to be in a header file because of possibly different MSVC CRTs which cause problems for FILE * crossing CRT boundaries. */
|
|
|
|
static size_t openmpt_stream_file_read_func( void * stream, void * dst, size_t bytes ) {
|
|
FILE * f = 0;
|
|
size_t retval = 0;
|
|
f = (FILE*)stream;
|
|
if ( !f ) {
|
|
return 0;
|
|
}
|
|
retval = fread( dst, 1, bytes, f );
|
|
if ( retval <= 0 ) {
|
|
return 0;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
static int openmpt_stream_file_seek_func( void * stream, int64_t offset, int whence ) {
|
|
FILE * f = 0;
|
|
int fwhence = 0;
|
|
f = (FILE*)stream;
|
|
if ( !f ) {
|
|
return -1;
|
|
}
|
|
switch ( whence ) {
|
|
#if defined(SEEK_SET)
|
|
case OPENMPT_STREAM_SEEK_SET:
|
|
fwhence = SEEK_SET;
|
|
break;
|
|
#endif
|
|
#if defined(SEEK_CUR)
|
|
case OPENMPT_STREAM_SEEK_CUR:
|
|
fwhence = SEEK_CUR;
|
|
break;
|
|
#endif
|
|
#if defined(SEEK_END)
|
|
case OPENMPT_STREAM_SEEK_END:
|
|
fwhence = SEEK_END;
|
|
break;
|
|
#endif
|
|
default:
|
|
return -1;
|
|
break;
|
|
}
|
|
#if defined(_MSC_VER)
|
|
return _fseeki64( f, offset, fwhence ) ? -1 : 0;
|
|
#elif defined(_POSIX_SOURCE) && (_POSIX_SOURCE == 1)
|
|
return fseeko( f, offset, fwhence ) ? -1 : 0;
|
|
#else
|
|
return fseek( f, offset, fwhence ) ? -1 : 0;
|
|
#endif
|
|
}
|
|
|
|
static int64_t openmpt_stream_file_tell_func( void * stream ) {
|
|
FILE * f = 0;
|
|
int64_t retval = 0;
|
|
f = (FILE*)stream;
|
|
if ( !f ) {
|
|
return -1;
|
|
}
|
|
#if defined(_MSC_VER)
|
|
retval = _ftelli64( f );
|
|
#elif defined(_POSIX_SOURCE) && (_POSIX_SOURCE == 1)
|
|
retval = ftello( f );
|
|
#else
|
|
retval = ftell( f );
|
|
#endif
|
|
if ( retval < 0 ) {
|
|
return -1;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
/*! \brief Provide openmpt_stream_callbacks for standard C FILE objects
|
|
*
|
|
* Fills openmpt_stream_callbacks suitable for passing a standard C FILE object as a stream parameter to functions doing file input/output.
|
|
*
|
|
* \remarks The stream argument must be passed as `(void*)(FILE*)file`.
|
|
* \sa \ref libopenmpt_c_fileio
|
|
* \sa openmpt_stream_callbacks
|
|
* \sa openmpt_could_open_probability2
|
|
* \sa openmpt_probe_file_header_from_stream
|
|
* \sa openmpt_module_create2
|
|
*/
|
|
static openmpt_stream_callbacks openmpt_stream_get_file_callbacks(void) {
|
|
openmpt_stream_callbacks retval;
|
|
memset( &retval, 0, sizeof( openmpt_stream_callbacks ) );
|
|
retval.read = openmpt_stream_file_read_func;
|
|
retval.seek = openmpt_stream_file_seek_func;
|
|
retval.tell = openmpt_stream_file_tell_func;
|
|
return retval;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/*!
|
|
* @}
|
|
*/
|
|
|
|
#endif /* LIBOPENMPT_STREAM_CALLBACKS_FILE_H */
|
|
|