123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #include <nx/nxfile.h>
- #include <libopenmpt/libopenmpt.h>
- #include <assert.h>
- static size_t openmpt_nxfile_read(void *stream, void *dst, size_t bytes)
- {
- nx_file_t f = (nx_file_t)stream;
- size_t bytes_read;
- ns_error_t err = NXFileRead(f, dst, bytes, &bytes_read);
- if (err != NErr_Success) {
- return 0;
- }
- return bytes_read;
- }
- static int openmpt_nxfile_seek(void *stream, int64_t offset, int whence)
- {
- nx_file_t f = (nx_file_t)stream;
- uint64_t position;
- if (whence == OPENMPT_STREAM_SEEK_SET) {
- position = offset;
- } else if (whence == OPENMPT_STREAM_SEEK_CUR) {
- ns_error_t err = NXFileTell(f, &position);
- if (err != NErr_Success) {
- return -1;
- }
- position += offset;
- } else if (whence == OPENMPT_STREAM_SEEK_END) {
- assert(0);
- } else {
- return -1;
- }
- ns_error_t err = NXFileSeek(f, position);
- if (err = NErr_Success) {
- return 0;
- } else {
- return -1;
- }
- }
- static int64_t openmpt_nxfile_tell(void *stream)
- {
- nx_file_t f = (nx_file_t)stream;
- uint64_t position;
- if (NXFileTell(f, &position) == NErr_Success) {
- return (int64_t)position;
- } else {
- return -1;
- }
- }
- openmpt_stream_callbacks openmpt_stream_get_nxfile_callbacks(void)
- {
- openmpt_stream_callbacks retval;
- memset( &retval, 0, sizeof( openmpt_stream_callbacks ) );
- retval.read = openmpt_nxfile_read;
- retval.seek = openmpt_nxfile_seek;
- retval.tell = openmpt_nxfile_tell;
- return retval;
- }
- openmpt_module *OpenMod(const wchar_t *filename)
- {
- openmpt_module * mod = 0;
- nx_string_t nx_filename=0;
- nx_uri_t nx_uri=0;
- NXStringCreateWithUTF16(&nx_filename, filename);
- NXURICreateWithNXString(&nx_uri, nx_filename);
- NXStringRelease(nx_filename);
- nx_file_t f=0;
- ns_error_t nserr;
- nserr = NXFileOpenZip(&f, nx_uri, NULL);
- if (nserr != NErr_Success) {
- nserr = NXFileOpenFile(&f, nx_uri, nx_file_FILE_read_binary);
- }
- NXURIRelease(nx_uri);
- if (nserr != NErr_Success) {
- return 0;
- }
- mod = openmpt_module_create(openmpt_stream_get_nxfile_callbacks(), f, NULL, NULL, NULL);
- NXFileRelease(f);
- return mod;
- }
|