summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/lib/formats/cassimg.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/lib/formats/cassimg.h')
-rw-r--r--trunk/src/lib/formats/cassimg.h230
1 files changed, 230 insertions, 0 deletions
diff --git a/trunk/src/lib/formats/cassimg.h b/trunk/src/lib/formats/cassimg.h
new file mode 100644
index 00000000000..cdbaff04ca6
--- /dev/null
+++ b/trunk/src/lib/formats/cassimg.h
@@ -0,0 +1,230 @@
+/*********************************************************************
+
+ cassimg.h
+
+ Cassette tape image abstraction code
+
+*********************************************************************/
+
+#ifndef CASSIMG_H
+#define CASSIMG_H
+
+#include "osdcore.h"
+#include "pool.h"
+#include "ioprocs.h"
+
+#ifndef LOG_FORMATS
+#define LOG_FORMATS if (0) printf
+#endif
+
+/***************************************************************************
+
+ Constants
+
+***************************************************************************/
+
+#define CASSETTE_FLAG_READWRITE 0
+#define CASSETTE_FLAG_READONLY 1
+#define CASSETTE_FLAG_NOSAVEONEXIT 0
+#define CASSETTE_FLAG_SAVEONEXIT 2
+
+#define CASSETTE_WAVEFORM_8BIT 0
+#define CASSETTE_WAVEFORM_16BIT 2
+#define CASSETTE_WAVEFORM_16BIT_FLIP 3
+#define CASSETTE_WAVEFORM_32BIT 4
+#define CASSETTE_WAVEFORM_32BIT_FLIP 5
+#define CASSETTE_WAVEFORM_ENDIAN_FLIP 1
+
+#define CASSETTE_MODULATION_SQUAREWAVE 0
+#define CASSETTE_MODULATION_SINEWAVE 1
+
+
+#ifdef LSB_FIRST
+#define CASSETTE_WAVEFORM_16BITBE CASSETTE_WAVEFORM_16BIT_FLIP
+#define CASSETTE_WAVEFORM_16BITLE CASSETTE_WAVEFORM_16BIT
+#define CASSETTE_WAVEFORM_32BITBE CASSETTE_WAVEFORM_32BIT_FLIP
+#define CASSETTE_WAVEFORM_32BITLE CASSETTE_WAVEFORM_32BIT
+#else
+#define CASSETTE_WAVEFORM_16BITBE CASSETTE_WAVEFORM_16BIT
+#define CASSETTE_WAVEFORM_16BITLE CASSETTE_WAVEFORM_16BIT_FLIP
+#define CASSETTE_WAVEFORM_32BITBE CASSETTE_WAVEFORM_32BIT
+#define CASSETTE_WAVEFORM_32BITLE CASSETTE_WAVEFORM_32BIT_FLIP
+#endif
+
+
+/***************************************************************************
+
+ Type definitions
+
+***************************************************************************/
+
+typedef enum
+{
+ CASSETTE_ERROR_SUCCESS, /* no error */
+ CASSETTE_ERROR_INTERNAL, /* fatal internal error */
+ CASSETTE_ERROR_UNSUPPORTED, /* this operation is unsupported */
+ CASSETTE_ERROR_OUTOFMEMORY, /* ran out of memory */
+ CASSETTE_ERROR_INVALIDIMAGE, /* invalid image */
+ CASSETTE_ERROR_INVALIDARG
+}
+casserr_t;
+
+struct sample_block
+{
+ INT32 *block;
+ size_t sample_count;
+};
+
+struct CassetteOptions
+{
+ int channels;
+ int bits_per_sample;
+ UINT32 sample_frequency;
+};
+
+struct CassetteInfo
+{
+ int channels;
+ int bits_per_sample;
+ UINT32 sample_frequency;
+ size_t sample_count;
+};
+
+struct _cassette_image
+{
+ const struct CassetteFormat *format;
+ struct io_generic io;
+ object_pool *pool;
+
+ int channels;
+ int flags;
+ UINT32 sample_frequency;
+
+ struct sample_block *blocks;
+ size_t block_count;
+ size_t sample_count;
+};
+
+typedef struct _cassette_image cassette_image;
+
+struct CassetteFormat
+{
+ const char *extensions;
+ casserr_t (*identify)(cassette_image *cassette, struct CassetteOptions *opts);
+ casserr_t (*load)(cassette_image *cassette);
+ casserr_t (*save)(cassette_image *cassette, const struct CassetteInfo *info);
+};
+
+/* used for the core modulation code */
+struct CassetteModulation
+{
+ int flags;
+ double zero_frequency_low;
+ double zero_frequency_cannonical;
+ double zero_frequency_high;
+ double one_frequency_low;
+ double one_frequency_cannonical;
+ double one_frequency_high;
+};
+
+/* code to adapt existing legacy fill_wave functions */
+struct CassetteLegacyWaveFiller
+{
+ int (*fill_wave)(INT16 *, int, UINT8 *);
+ int chunk_size;
+ int chunk_samples;
+ int (*chunk_sample_calc)(const UINT8 *bytes, int length);
+ UINT32 sample_frequency;
+ int header_samples;
+ int trailer_samples;
+};
+
+/* builtin formats */
+extern const struct CassetteFormat wavfile_format;
+
+/* macros for specifying format lists */
+#define CASSETTE_FORMATLIST_EXTERN(name) \
+ extern const struct CassetteFormat *const name[]
+
+#define CASSETTE_FORMATLIST_START(name) \
+ const struct CassetteFormat *const name[] = \
+ { \
+ &wavfile_format, \
+
+#define CASSETTE_FORMAT(name) \
+ &(name), \
+
+#define CASSETTE_FORMATLIST_END \
+ NULL \
+ };
+
+CASSETTE_FORMATLIST_EXTERN(cassette_default_formats);
+
+/***************************************************************************
+
+ Prototypes
+
+***************************************************************************/
+
+casserr_t cassette_open(void *file, const struct io_procs *procs,
+ const struct CassetteFormat *format, int flags, cassette_image **outcassette);
+casserr_t cassette_open_choices(void *file, const struct io_procs *procs, const char *extension,
+ const struct CassetteFormat *const *formats, int flags, cassette_image **outcassette);
+casserr_t cassette_create(void *file, const struct io_procs *procs, const struct CassetteFormat *format,
+ const struct CassetteOptions *opts, int flags, cassette_image **outcassette);
+casserr_t cassette_save(cassette_image *cassette);
+void cassette_close(cassette_image *cassette);
+void cassette_change(cassette_image *cassette, void *file, const struct io_procs *procs, const struct CassetteFormat *format, int flags);
+void cassette_get_info(cassette_image *cassette, struct CassetteInfo *info);
+
+/* calls for accessing the raw cassette image */
+void cassette_image_read(cassette_image *cassette, void *buffer, UINT64 offset, size_t length);
+void cassette_image_write(cassette_image *cassette, const void *buffer, UINT64 offset, size_t length);
+UINT64 cassette_image_size(cassette_image *cassette);
+
+/* waveform accesses */
+casserr_t cassette_get_samples(cassette_image *cassette, int channel,
+ double time_index, double sample_period, size_t sample_count, size_t sample_bytes,
+ void *samples, int waveform_flags);
+casserr_t cassette_put_samples(cassette_image *cassette, int channel,
+ double time_index, double sample_period, size_t sample_count, size_t sample_bytes,
+ const void *samples, int waveform_flags);
+casserr_t cassette_get_sample(cassette_image *cassette, int channel,
+ double time_index, double sample_period, INT32 *sample);
+casserr_t cassette_put_sample(cassette_image *cassette, int channel,
+ double time_index, double sample_period, INT32 sample);
+
+/* waveform accesses to/from the raw image */
+casserr_t cassette_read_samples(cassette_image *cassette, int channels, double time_index,
+ double sample_period, size_t sample_count, UINT64 offset, int waveform_flags);
+casserr_t cassette_write_samples(cassette_image *cassette, int channels, double time_index,
+ double sample_period, size_t sample_count, UINT64 offset, int waveform_flags);
+
+/* modulation support */
+casserr_t cassette_modulation_identify(cassette_image *cassette, const struct CassetteModulation *modulation,
+ struct CassetteOptions *opts);
+casserr_t cassette_put_modulated_data(cassette_image *cassette, int channel, double time_index,
+ const void *data, size_t data_length, const struct CassetteModulation *modulation,
+ double *time_displacement);
+casserr_t cassette_put_modulated_filler(cassette_image *cassette, int channel, double time_index,
+ UINT8 filler, size_t filler_length, const struct CassetteModulation *modulation,
+ double *time_displacement);
+casserr_t cassette_read_modulated_data(cassette_image *cassette, int channel, double time_index,
+ UINT64 offset, UINT64 length, const struct CassetteModulation *modulation,
+ double *time_displacement);
+casserr_t cassette_put_modulated_data_bit(cassette_image *cassette, int channel, double time_index,
+ UINT8 data, const struct CassetteModulation *modulation,
+ double *time_displacement);
+
+/* debug calls */
+void cassette_dump(cassette_image *image, const char *filename);
+
+/* legacy code support */
+#define CODE_HEADER ((UINT8*)-1)
+#define CODE_TRAILER ((UINT8*)-2)
+casserr_t cassette_legacy_identify(cassette_image *cassette, struct CassetteOptions *opts,
+ const struct CassetteLegacyWaveFiller *legacy_args);
+casserr_t cassette_legacy_construct(cassette_image *cassette,
+ const struct CassetteLegacyWaveFiller *legacy_args);
+
+#endif /* CASSIMG_H */