[Core/MCD] added support for external VORBIS library

This commit is contained in:
EkeEke 2015-04-26 21:54:22 +02:00
parent ea1924d747
commit d57d03e222
2 changed files with 39 additions and 29 deletions

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* CD drive processor & CD-DA fader * CD drive processor & CD-DA fader
* *
* Copyright (C) 2012-2014 Eke-Eke (Genesis Plus GX) * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -37,7 +37,7 @@
****************************************************************************************/ ****************************************************************************************/
#include "shared.h" #include "shared.h"
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#define SUPPORTED_EXT 20 #define SUPPORTED_EXT 20
#else #else
#define SUPPORTED_EXT 10 #define SUPPORTED_EXT 10
@ -126,7 +126,7 @@ static const unsigned char waveHeader[32] =
/* supported WAVE file extensions */ /* supported WAVE file extensions */
static const char extensions[SUPPORTED_EXT][16] = static const char extensions[SUPPORTED_EXT][16] =
{ {
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
"%02d.ogg", "%02d.ogg",
" %02d.ogg", " %02d.ogg",
"-%02d.ogg", "-%02d.ogg",
@ -150,7 +150,7 @@ static const char extensions[SUPPORTED_EXT][16] =
" - %d.wav" " - %d.wav"
}; };
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
static void ogg_free(int i) static void ogg_free(int i)
{ {
@ -221,7 +221,7 @@ int cdd_context_load(uint8 *state)
int lba; int lba;
int bufferptr = 0; int bufferptr = 0;
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
/* close previous track VORBIS file structure to save memory */ /* close previous track VORBIS file structure to save memory */
if (cdd.toc.tracks[cdd.index].vf.datasource) if (cdd.toc.tracks[cdd.index].vf.datasource)
@ -255,7 +255,7 @@ int cdd_context_load(uint8 *state)
fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET); fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET);
} }
} }
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
else if (cdd.toc.tracks[cdd.index].vf.seekable) else if (cdd.toc.tracks[cdd.index].vf.seekable)
{ {
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
@ -479,7 +479,7 @@ int cdd_load(char *filename, char *header)
/* adjust current track file read offset with WAVE header length */ /* adjust current track file read offset with WAVE header length */
cdd.toc.tracks[cdd.toc.last].offset -= 44; cdd.toc.tracks[cdd.toc.last].offset -= 44;
} }
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
else if (!ov_open(cdd.toc.tracks[cdd.toc.last].fd,&cdd.toc.tracks[cdd.toc.last].vf,0,0)) else if (!ov_open(cdd.toc.tracks[cdd.toc.last].fd,&cdd.toc.tracks[cdd.toc.last].vf,0,0))
{ {
/* retrieve stream infos */ /* retrieve stream infos */
@ -576,7 +576,7 @@ int cdd_load(char *filename, char *header)
/* adjust file read offset with previous track end time */ /* adjust file read offset with previous track end time */
cdd.toc.tracks[cdd.toc.last].offset += cdd.toc.end * 2352; cdd.toc.tracks[cdd.toc.last].offset += cdd.toc.end * 2352;
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
if (cdd.toc.tracks[cdd.toc.last].vf.datasource) if (cdd.toc.tracks[cdd.toc.last].vf.datasource)
{ {
/* convert read offset to PCM sample offset */ /* convert read offset to PCM sample offset */
@ -709,7 +709,7 @@ int cdd_load(char *filename, char *header)
/* increment track number */ /* increment track number */
cdd.toc.last++; cdd.toc.last++;
} }
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
else if (!ov_open(fd,&cdd.toc.tracks[cdd.toc.last].vf,0,0)) else if (!ov_open(fd,&cdd.toc.tracks[cdd.toc.last].vf,0,0))
{ {
/* retrieve stream infos */ /* retrieve stream infos */
@ -744,7 +744,11 @@ int cdd_load(char *filename, char *header)
/* auto-detect PAUSE within audio files */ /* auto-detect PAUSE within audio files */
ov_pcm_seek(&cdd.toc.tracks[cdd.toc.last].vf, 100 * 588); ov_pcm_seek(&cdd.toc.tracks[cdd.toc.last].vf, 100 * 588);
#if defined(USE_LIBVORBIS)
ov_read(&cdd.toc.tracks[cdd.toc.last].vf, (char *)head, 32, 0, 2, 1, 0);
#else
ov_read(&cdd.toc.tracks[cdd.toc.last].vf, (char *)head, 32, 0); ov_read(&cdd.toc.tracks[cdd.toc.last].vf, (char *)head, 32, 0);
#endif
ov_pcm_seek(&cdd.toc.tracks[cdd.toc.last].vf, 0); ov_pcm_seek(&cdd.toc.tracks[cdd.toc.last].vf, 0);
if (*(int32 *)head == 0) if (*(int32 *)head == 0)
{ {
@ -891,7 +895,7 @@ void cdd_unload(void)
/* close CD tracks */ /* close CD tracks */
for (i=0; i<cdd.toc.last; i++) for (i=0; i<cdd.toc.last; i++)
{ {
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
if (cdd.toc.tracks[i].vf.datasource) if (cdd.toc.tracks[i].vf.datasource)
{ {
/* close VORBIS file (if still opened) */ /* close VORBIS file (if still opened) */
@ -962,7 +966,7 @@ void cdd_read_audio(unsigned int samples)
int endVol = scd.regs[0x34>>1].w >> 4; int endVol = scd.regs[0x34>>1].w >> 4;
/* read samples from current block */ /* read samples from current block */
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
if (cdd.toc.tracks[cdd.index].vf.datasource) if (cdd.toc.tracks[cdd.index].vf.datasource)
{ {
int len, done = 0; int len, done = 0;
@ -970,7 +974,11 @@ void cdd_read_audio(unsigned int samples)
samples = samples * 4; samples = samples * 4;
while (done < samples) while (done < samples)
{ {
#ifdef USE_LIBVORBIS
len = ov_read(&cdd.toc.tracks[cdd.index].vf, (char *)(cdc.ram + done), samples - done, 0, 2, 1, 0);
#else
len = ov_read(&cdd.toc.tracks[cdd.index].vf, (char *)(cdc.ram + done), samples - done, 0); len = ov_read(&cdd.toc.tracks[cdd.index].vf, (char *)(cdc.ram + done), samples - done, 0);
#endif
if (len <= 0) if (len <= 0)
{ {
done = samples; done = samples;
@ -1035,24 +1043,24 @@ void cdd_read_audio(unsigned int samples)
mul = (curVol & 0x7fc) ? (curVol & 0x7fc) : (curVol & 0x03); mul = (curVol & 0x7fc) ? (curVol & 0x7fc) : (curVol & 0x03);
/* left channel */ /* left channel */
#ifdef LSB_FIRST #ifdef LSB_FIRST
delta = ((ptr[0] * mul) / 1024) - l; delta = ((ptr[0] * mul) / 1024) - l;
ptr++; ptr++;
#else #else
delta = (((int16)((ptr[0] + ptr[1]*256)) * mul) / 1024) - l; delta = (((int16)((ptr[0] + ptr[1]*256)) * mul) / 1024) - l;
ptr += 2; ptr += 2;
#endif #endif
l += delta; l += delta;
blip_add_delta_fast(snd.blips[2][0], i, delta); blip_add_delta_fast(snd.blips[2][0], i, delta);
/* right channel */ /* right channel */
#ifdef LSB_FIRST #ifdef LSB_FIRST
delta = ((ptr[0] * mul) / 1024) - r; delta = ((ptr[0] * mul) / 1024) - r;
ptr++; ptr++;
#else #else
delta = (((int16)((ptr[0] + ptr[1]*256)) * mul) / 1024) - r; delta = (((int16)((ptr[0] + ptr[1]*256)) * mul) / 1024) - r;
ptr += 2; ptr += 2;
#endif #endif
r += delta; r += delta;
blip_add_delta_fast(snd.blips[2][1], i, delta); blip_add_delta_fast(snd.blips[2][1], i, delta);
@ -1168,7 +1176,7 @@ void cdd_update(void)
/* check end of current track */ /* check end of current track */
if (cdd.lba >= cdd.toc.tracks[cdd.index].end) if (cdd.lba >= cdd.toc.tracks[cdd.index].end)
{ {
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
/* close previous track VORBIS file structure to save memory */ /* close previous track VORBIS file structure to save memory */
if (cdd.toc.tracks[cdd.index].vf.datasource) if (cdd.toc.tracks[cdd.index].vf.datasource)
@ -1184,7 +1192,7 @@ void cdd_update(void)
scd.regs[0x36>>1].byte.h = 0x01; scd.regs[0x36>>1].byte.h = 0x01;
/* seek to next audio track start */ /* seek to next audio track start */
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
if (cdd.toc.tracks[cdd.index].vf.seekable) if (cdd.toc.tracks[cdd.index].vf.seekable)
{ {
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
@ -1211,7 +1219,7 @@ void cdd_update(void)
/* check current track limits */ /* check current track limits */
if (cdd.lba >= cdd.toc.tracks[cdd.index].end) if (cdd.lba >= cdd.toc.tracks[cdd.index].end)
{ {
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
/* close previous track VORBIS file structure to save memory */ /* close previous track VORBIS file structure to save memory */
if (cdd.toc.tracks[cdd.index].vf.datasource) if (cdd.toc.tracks[cdd.index].vf.datasource)
@ -1234,7 +1242,7 @@ void cdd_update(void)
} }
else if (cdd.lba < cdd.toc.tracks[cdd.index].start) else if (cdd.lba < cdd.toc.tracks[cdd.index].start)
{ {
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
/* close previous track VORBIS file structure to save memory */ /* close previous track VORBIS file structure to save memory */
if (cdd.toc.tracks[cdd.index].vf.datasource) if (cdd.toc.tracks[cdd.index].vf.datasource)
@ -1278,7 +1286,7 @@ void cdd_update(void)
/* DATA track */ /* DATA track */
fseek(cdd.toc.tracks[0].fd, cdd.lba * cdd.sectorSize, SEEK_SET); fseek(cdd.toc.tracks[0].fd, cdd.lba * cdd.sectorSize, SEEK_SET);
} }
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
else if (cdd.toc.tracks[cdd.index].vf.seekable) else if (cdd.toc.tracks[cdd.index].vf.seekable)
{ {
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
@ -1470,7 +1478,7 @@ void cdd_process(void)
/* get track index */ /* get track index */
while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++;
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
/* check if track index has changed */ /* check if track index has changed */
if (index != cdd.index) if (index != cdd.index)
@ -1505,7 +1513,7 @@ void cdd_process(void)
/* DATA track */ /* DATA track */
fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET); fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET);
} }
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
else if (cdd.toc.tracks[index].vf.seekable) else if (cdd.toc.tracks[index].vf.seekable)
{ {
/* VORBIS AUDIO track */ /* VORBIS AUDIO track */
@ -1562,7 +1570,7 @@ void cdd_process(void)
/* get current track index */ /* get current track index */
while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++;
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
#ifdef DISABLE_MANY_OGG_OPEN_FILES #ifdef DISABLE_MANY_OGG_OPEN_FILES
/* check if track index has changed */ /* check if track index has changed */
if (index != cdd.index) if (index != cdd.index)
@ -1597,7 +1605,7 @@ void cdd_process(void)
/* DATA track */ /* DATA track */
fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET); fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET);
} }
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
else if (cdd.toc.tracks[index].vf.seekable) else if (cdd.toc.tracks[index].vf.seekable)
{ {
/* VORBIS AUDIO track */ /* VORBIS AUDIO track */

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* CD drive processor & CD-DA fader * CD drive processor & CD-DA fader
* *
* Copyright (C) 2012-2014 Eke-Eke (Genesis Plus GX) * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -40,7 +40,9 @@
#include "blip_buf.h" #include "blip_buf.h"
#ifdef USE_LIBTREMOR #if defined(USE_LIBVORBIS)
#include <vorbis/vorbisfile.h>
#elif defined(USE_LIBTREMOR)
#include "tremor/ivorbisfile.h" #include "tremor/ivorbisfile.h"
#endif #endif
@ -65,7 +67,7 @@
typedef struct typedef struct
{ {
FILE *fd; FILE *fd;
#ifdef USE_LIBTREMOR #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS)
OggVorbis_File vf; OggVorbis_File vf;
#endif #endif
int offset; int offset;