mirror of
https://github.com/libretro/beetle-psx-libretro.git
synced 2024-11-23 08:49:47 +00:00
Cleanups of file structures
This commit is contained in:
parent
c5c37867fa
commit
94e685d516
@ -53,18 +53,6 @@ uint64 FileStream::attributes(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8 *FileStream::map(void)
|
||||
{
|
||||
//return fw.map();
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
void FileStream::unmap(void)
|
||||
{
|
||||
//fw.unmap();
|
||||
}
|
||||
|
||||
|
||||
uint64 FileStream::read(void *data, uint64 count, bool error_on_eos)
|
||||
{
|
||||
return fw.read(data, count, error_on_eos);
|
||||
|
@ -39,9 +39,6 @@ class FileStream : public Stream
|
||||
|
||||
virtual uint64 attributes(void);
|
||||
|
||||
virtual uint8 *map(void);
|
||||
virtual void unmap(void);
|
||||
|
||||
virtual uint64 read(void *data, uint64 count, bool error_on_eos = true);
|
||||
virtual void write(const void *data, uint64 count);
|
||||
virtual void seek(int64 offset, int whence);
|
||||
|
@ -62,39 +62,6 @@
|
||||
|
||||
// For special uses, IE in classes that take a path or a FileWrapper & in the constructor, and the FileWrapper non-pointer member
|
||||
// is in the initialization list for the path constructor but not the constructor with FileWrapper&
|
||||
#if 0
|
||||
FileWrapper::FileWrapper()
|
||||
{
|
||||
fp = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
FileWrapper::FileWrapper(FileWrapper &original) : OpenedMode(original.OpenedMode)
|
||||
{
|
||||
int fd;
|
||||
int duped_fd;
|
||||
|
||||
path_save = original.path_save;
|
||||
|
||||
original.flush();
|
||||
|
||||
fd = fileno(original.fp);
|
||||
if(-1 == (duped_fd = dup(fd)))
|
||||
{
|
||||
ErrnoHolder ene(errno);
|
||||
|
||||
throw(MDFN_Error(ene.Errno(), _("Error duping file descriptor: %s"), ene.StrError()));
|
||||
}
|
||||
|
||||
if(!(fp = fdopen(duped_fd, (OpenedMode == MODE_READ) ? "rb" : "wb")))
|
||||
{
|
||||
ErrnoHolder ene(errno);
|
||||
|
||||
throw(MDFN_Error(ene.Errno(), _("Error during fdopen(): %s"), ene.StrError()));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
FileWrapper::FileWrapper(const char *path, const int mode, const char *purpose) : OpenedMode(mode)
|
||||
{
|
||||
|
@ -70,31 +70,6 @@ MemoryStream::MemoryStream(const MemoryStream &zs)
|
||||
position = zs.position;
|
||||
}
|
||||
|
||||
#if 0
|
||||
MemoryStream & MemoryStream::operator=(const MemoryStream &zs)
|
||||
{
|
||||
if(this != &zs)
|
||||
{
|
||||
if(data_buffer)
|
||||
{
|
||||
free(data_buffer);
|
||||
data_buffer = NULL;
|
||||
}
|
||||
|
||||
data_buffer_size = zs.data_buffer_size;
|
||||
data_buffer_alloced = zs.data_buffer_alloced;
|
||||
|
||||
if(!(data_buffer = (uint8*)malloc(data_buffer_alloced)))
|
||||
throw MDFN_Error(ErrnoHolder(errno));
|
||||
|
||||
memcpy(data_buffer, zs.data_buffer, data_buffer_size);
|
||||
|
||||
position = zs.position;
|
||||
}
|
||||
return(*this);
|
||||
}
|
||||
#endif
|
||||
|
||||
MemoryStream::~MemoryStream()
|
||||
{
|
||||
if(data_buffer)
|
||||
|
@ -25,14 +25,6 @@ class Stream
|
||||
};
|
||||
virtual uint64 attributes(void) = 0;
|
||||
|
||||
virtual uint8 *map(void) = 0; // Map the entirety of the stream data into the address space of the process, if possible, and return a pointer.
|
||||
// (the returned pointer must be cached, and returned on any subsequent calls to map() without an unmap()
|
||||
// in-between, to facilitate a sort of "feature-testing", to determine if an alternative like "MemoryStream"
|
||||
// should be used).
|
||||
|
||||
virtual void unmap(void) = 0; // Unmap the stream data from the address space. (Possibly invalidating the pointer returned from map()).
|
||||
// (must automatically be called, if necessary, from the destructor).
|
||||
|
||||
virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) = 0;
|
||||
virtual void write(const void *data, uint64 count) = 0;
|
||||
|
||||
|
@ -30,14 +30,6 @@
|
||||
#include "../tremor/ivorbisfile.h"
|
||||
#include "../mpcdec/mpcdec.h"
|
||||
|
||||
#ifdef HAVE_LIBSNDFILE
|
||||
#include <sndfile.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OPUSFILE
|
||||
#include "audioreader_opus.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
@ -433,130 +425,6 @@ int64 MPCReader::FrameCount(void)
|
||||
**
|
||||
*/
|
||||
|
||||
#ifdef HAVE_LIBSNDFILE
|
||||
class SFReader : public AudioReader
|
||||
{
|
||||
public:
|
||||
|
||||
SFReader(Stream *fp);
|
||||
~SFReader();
|
||||
|
||||
int64 Read_(int16 *buffer, int64 frames);
|
||||
bool Seek_(int64 frame_offset);
|
||||
int64 FrameCount(void);
|
||||
|
||||
private:
|
||||
SNDFILE *sf;
|
||||
SF_INFO sfinfo;
|
||||
SF_VIRTUAL_IO sfvf;
|
||||
|
||||
Stream *fw;
|
||||
};
|
||||
|
||||
static sf_count_t isf_get_filelen(void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
return fw->size();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static sf_count_t isf_seek(sf_count_t offset, int whence, void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
fw->seek(offset, whence);
|
||||
return fw->tell();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static sf_count_t isf_read(void *ptr, sf_count_t count, void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
return fw->read(ptr, count);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
static sf_count_t isf_write(const void *ptr, sf_count_t count, void *user_data)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
static sf_count_t isf_tell(void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
return fw->tell();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
SFReader::SFReader(Stream *fp) : fw(fp)
|
||||
{
|
||||
fp->seek(0, SEEK_SET);
|
||||
|
||||
memset(&sfvf, 0, sizeof(sfvf));
|
||||
sfvf.get_filelen = isf_get_filelen;
|
||||
sfvf.seek = isf_seek;
|
||||
sfvf.read = isf_read;
|
||||
sfvf.write = isf_write;
|
||||
sfvf.tell = isf_tell;
|
||||
|
||||
memset(&sfinfo, 0, sizeof(sfinfo));
|
||||
if(!(sf = sf_open_virtual(&sfvf, SFM_READ, &sfinfo, (void*)fp)))
|
||||
throw(0);
|
||||
}
|
||||
|
||||
SFReader::~SFReader()
|
||||
{
|
||||
sf_close(sf);
|
||||
}
|
||||
|
||||
int64 SFReader::Read_(int16 *buffer, int64 frames)
|
||||
{
|
||||
return(sf_read_short(sf, (short*)buffer, frames * 2) / 2);
|
||||
}
|
||||
|
||||
bool SFReader::Seek_(int64 frame_offset)
|
||||
{
|
||||
// FIXME error condition
|
||||
if(sf_seek(sf, frame_offset, SEEK_SET) != frame_offset)
|
||||
return(false);
|
||||
return(true);
|
||||
}
|
||||
|
||||
int64 SFReader::FrameCount(void)
|
||||
{
|
||||
return(sfinfo.frames);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
AudioReader *AR_Open(Stream *fp)
|
||||
{
|
||||
try
|
||||
@ -567,16 +435,6 @@ AudioReader *AR_Open(Stream *fp)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPUSFILE
|
||||
try
|
||||
{
|
||||
return new OpusReader(fp);
|
||||
}
|
||||
catch(int i)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
try
|
||||
{
|
||||
return new OggVorbisReader(fp);
|
||||
@ -585,16 +443,6 @@ AudioReader *AR_Open(Stream *fp)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBSNDFILE
|
||||
try
|
||||
{
|
||||
return new SFReader(fp);
|
||||
}
|
||||
catch(int i)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
@ -1,185 +0,0 @@
|
||||
/* Mednafen - Multi-system Emulator
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "../mednafen.h"
|
||||
#include "audioreader.h"
|
||||
#include "audioreader_opus.h"
|
||||
|
||||
// OPUS SUPPORT NOT DONE YET!!!
|
||||
/*
|
||||
|
||||
(int64)op_pcm_total() * 44100 / 48000
|
||||
|
||||
resampling vs seek, filter delay, etc. to consider
|
||||
*/
|
||||
|
||||
static size_t iop_read_func(void *ptr, size_t size, size_t nmemb, void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
if(!size)
|
||||
return(0);
|
||||
|
||||
try
|
||||
{
|
||||
return fw->read(ptr, size * nmemb, false) / size;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
static int iop_seek_func(void *user_data, opus_int64 offset, int whence)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
fw->seek(offset, whence);
|
||||
return(0);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static int iop_close_func(void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
fw->close();
|
||||
return(0);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
|
||||
static opus_int64 iop_tell_func(void *user_data)
|
||||
{
|
||||
Stream *fw = (Stream*)user_data;
|
||||
|
||||
try
|
||||
{
|
||||
return fw->tell();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Error strings copied from libopusfile header file comments. */
|
||||
static const char *op_errstring(int error)
|
||||
{
|
||||
static const struct
|
||||
{
|
||||
int code;
|
||||
const char *str;
|
||||
} error_table[] =
|
||||
{
|
||||
{ OP_EREAD, gettext_noop("OP_EREAD: An underlying read, seek, or tell operation failed when it should have succeeded.") },
|
||||
{ OP_EFAULT, gettext_noop("OP_EFAULT: A NULL pointer was passed where one was unexpected, or an internal memory allocation failed, or an internal library error was encountered.") },
|
||||
{ OP_EIMPL, gettext_noop("OP_EIMPL: The stream used a feature that is not implemented, such as an unsupported channel family.") },
|
||||
{ OP_EINVAL, gettext_noop("OP_EINVAL: One or more parameters to a function were invalid.") },
|
||||
{ OP_ENOTFORMAT, gettext_noop("OP_ENOTFORMAT: A purported Ogg Opus stream did not begin with an Ogg page, or a purported header packet did not start with one of the required strings, \"OpusHead\" or \"OpusTags\".") },
|
||||
{ OP_EBADHEADER, gettext_noop("OP_EBADHEADER: A required header packet was not properly formatted, contained illegal values, or was missing altogether.") },
|
||||
{ OP_EVERSION, gettext_noop("OP_EVERSION: The ID header contained an unrecognized version number.") },
|
||||
{ OP_EBADPACKET, gettext_noop("OP_EBADPACKET: An audio packet failed to decode properly.") },
|
||||
{ OP_EBADLINK, gettext_noop("OP_EBADLINK: We failed to find data we had seen before, or the bitstream structure was sufficiently malformed that seeking to the target destination was impossible.") },
|
||||
{ OP_ENOSEEK, gettext_noop("OP_ENOSEEK: An operation that requires seeking was requested on an unseekable stream.") },
|
||||
{ OP_EBADTIMESTAMP, gettext_noop("OP_EBADTIMESTAMP: The first or last granule position of a link failed basic validity checks.") },
|
||||
};
|
||||
|
||||
for(unsigned i = 0; i < sizeof(error_table) / sizeof(error_table[0]); i++)
|
||||
{
|
||||
if(error_table[i].code == error)
|
||||
{
|
||||
return _(error_table[i].str);
|
||||
}
|
||||
}
|
||||
|
||||
return _("Unknown");
|
||||
}
|
||||
|
||||
OggOpusReader::OggOpusReader(Stream *fp) : fw(fp)
|
||||
{
|
||||
OpusFileCallbacks cb;
|
||||
int error = 0;
|
||||
|
||||
memset(&cb, 0, sizeof(cb));
|
||||
cb.read_func = iop_read_func;
|
||||
cb.seek_func = iop_seek_func;
|
||||
cb.close_func = iop_close_func;
|
||||
cb.tell_func = iop_tell_func;
|
||||
|
||||
fp->seek(0, SEEK_SET);
|
||||
|
||||
if(!(opfile = op_open_callbacks((void*)fp, &cb, NULL, 0, &error)))
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
default:
|
||||
throw MDFN_Error(0, _("opusfile: error code: %d(%s)", error, op_errstring(error)));
|
||||
break;
|
||||
|
||||
case OP_ENOTFORMAT:
|
||||
throw(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OggOpusReader::~OggOpusReader()
|
||||
{
|
||||
op_free(opfile);
|
||||
}
|
||||
|
||||
int64 OggOpusReader::Read_(int16 *buffer, int64 frames)
|
||||
{
|
||||
int16 *tr_buffer = buffer;
|
||||
int64 tr_count = frames * 2;
|
||||
|
||||
while(tr_count > 0)
|
||||
{
|
||||
int64 didread = op_read(opfile, tr_buffer, tr_count, NULL);
|
||||
|
||||
if(didread == 0)
|
||||
break;
|
||||
|
||||
tr_buffer += didread * 2;
|
||||
tr_count -= didread * 2;
|
||||
}
|
||||
|
||||
return(frames - (tr_count / 2));
|
||||
}
|
||||
|
||||
bool OggOpusReader::Seek_(int64 frame_offset)
|
||||
{
|
||||
op_pcm_seek(opfile, frame_offset);
|
||||
return(true);
|
||||
}
|
||||
|
||||
int64 OggOpusReader::FrameCount(void)
|
||||
{
|
||||
return(op_pcm_total(pvfile, -1));
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
#ifndef __MDFN_AUDIOREADER_OPUS_H
|
||||
#define __MDFN_AUDIOREADER_OPUS_H
|
||||
|
||||
#include <opus/opusfile.h>
|
||||
|
||||
class OggOpusReader : public AudioReader
|
||||
{
|
||||
public:
|
||||
OggOpusReader(Stream *fp);
|
||||
~OggOpusReader();
|
||||
|
||||
int64 Read_(int16 *buffer, int64 frames);
|
||||
bool Seek_(int64 frame_offset);
|
||||
int64 FrameCount(void);
|
||||
|
||||
private:
|
||||
OggOpus_File *opfile;
|
||||
Stream *fw;
|
||||
};
|
||||
|
||||
#endif
|
@ -391,49 +391,6 @@ char *MDFNFILE::fgets(char *s, int buffer_size)
|
||||
}
|
||||
|
||||
static INLINE bool MDFN_DumpToFileReal(const char *filename, int compress, const std::vector<PtrLengthPair> &pearpairs)
|
||||
{
|
||||
if(MDFN_GetSettingB("filesys.disablesavegz"))
|
||||
compress = 0;
|
||||
|
||||
if(compress)
|
||||
{
|
||||
char mode[64];
|
||||
gzFile gp;
|
||||
|
||||
trio_snprintf(mode, 64, "wb%d", compress);
|
||||
|
||||
gp = gzopen(filename, mode);
|
||||
|
||||
if(!gp)
|
||||
{
|
||||
ErrnoHolder ene(errno);
|
||||
|
||||
MDFN_PrintError(_("Error opening \"%s\": %s"), filename, ene.StrError());
|
||||
return(0);
|
||||
}
|
||||
|
||||
for(unsigned int i = 0; i < pearpairs.size(); i++)
|
||||
{
|
||||
const void *data = pearpairs[i].GetData();
|
||||
const int64 length = pearpairs[i].GetLength();
|
||||
|
||||
if(gzwrite(gp, data, length) != length)
|
||||
{
|
||||
int errnum;
|
||||
|
||||
MDFN_PrintError(_("Error writing to \"%s\": %s"), filename, gzerror(gp, &errnum));
|
||||
gzclose(gp);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
if(gzclose(gp) != Z_OK) // FIXME: Huhm, how should we handle this?
|
||||
{
|
||||
MDFN_PrintError(_("Error closing \"%s\""), filename);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FILE *fp = fopen(filename, "wb");
|
||||
if(!fp)
|
||||
@ -466,7 +423,7 @@ static INLINE bool MDFN_DumpToFileReal(const char *filename, int compress, const
|
||||
MDFN_PrintError(_("Error closing \"%s\": %s"), filename, ene.StrError());
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
@ -90,29 +90,9 @@ class MDFNFILE
|
||||
|
||||
int64 location;
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
bool is_mmap;
|
||||
#endif
|
||||
|
||||
bool MakeMemWrapAndClose(void *tz, int type);
|
||||
};
|
||||
|
||||
#if 0
|
||||
MDFNFILE *MDFN_fopen(const char *path, const char *ipsfn, const char *mode, const FileExtensionSpecStruct *known_ext);
|
||||
int MDFN_fclose(MDFNFILE*);
|
||||
uint64 MDFN_fread(void *ptr, size_t size, size_t nmemb, MDFNFILE*);
|
||||
uint64 MDFN_fwrite(void *ptr, size_t size, size_t nmemb, MDFNFILE*);
|
||||
int MDFN_fseek(MDFNFILE*, int64 offset, int whence);
|
||||
uint64 MDFN_ftell(MDFNFILE*);
|
||||
void MDFN_rewind(MDFNFILE*);
|
||||
int MDFN_read32le(uint32 *Bufo, MDFNFILE*);
|
||||
int MDFN_read16le(uint16 *Bufo, MDFNFILE*);
|
||||
int MDFN_fgetc(MDFNFILE*);
|
||||
uint64 MDFN_fgetsize(MDFNFILE*);
|
||||
int MDFN_fisarchive(MDFNFILE*);
|
||||
char *MDFN_fgets(char *s, int size, MDFNFILE *);
|
||||
#endif
|
||||
|
||||
class PtrLengthPair
|
||||
{
|
||||
public:
|
||||
|
@ -116,35 +116,6 @@ void MDFNI_DiskSelect();
|
||||
void MDFNI_DiskInsert();
|
||||
void MDFNI_DiskEject();
|
||||
|
||||
// New removable media interface(TODO!)
|
||||
//
|
||||
#if 0
|
||||
|
||||
struct MediumInfoStruct
|
||||
{
|
||||
const char *name; // More descriptive name, "Al Gore's Grand Adventure, Disk 1 of 7" ???
|
||||
// (remember, Do utf8->utf32->utf8 for truncation for display)
|
||||
const char *set_member_name; // "Disk 1 of 4, Side A", "Disk 3 of 4, Side B", "Disc 2 of 5" ???? (Disk M of N, where N is related to the number of entries
|
||||
// in the structure???)
|
||||
};
|
||||
|
||||
struct DriveInfoStruct
|
||||
{
|
||||
const char *name;
|
||||
const char *description;
|
||||
const MediumInfoStruct *possible_media;
|
||||
//bool
|
||||
//const char *eject_state_name; // Like "Lid Open", or "Tray Ejected"
|
||||
//const char *insert_state_name; // Like "
|
||||
};
|
||||
|
||||
// Entry point
|
||||
DriveInfoStruct *Drives;
|
||||
|
||||
void MDFNI_SetDriveMedium(unsigned drive_index, unsigned int medium_index, unsigned state_id);
|
||||
#endif
|
||||
|
||||
|
||||
bool MDFNI_StartAVRecord(const char *path, double SoundRate);
|
||||
void MDFNI_StopAVRecord(void);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user