From f4eb6bff5e7f7aba90841e12b4c6699c62a8c917 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 10 Jul 2014 17:18:12 +0300 Subject: [PATCH] 2336 -> 2352 conversion. CDA player is also used for CD32 FMV audio. --- blkdev_cdimage.cpp | 45 +++++++++++++++++++++++---------- od-win32/blkdev_win32_ioctl.cpp | 2 +- od-win32/cda_play.cpp | 18 +++++++++---- od-win32/cda_play.h | 4 ++- 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 4480dadb..2d0b79ab 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -118,7 +118,7 @@ static struct cdunit *unitisopen (int unitnum) } -static struct cdtoc *findtoc (struct cdunit *cdu, int *sectorp) +static struct cdtoc *findtoc (struct cdunit *cdu, int *sectorp, bool data) { int i; int sector; @@ -135,7 +135,7 @@ static struct cdtoc *findtoc (struct cdunit *cdu, int *sectorp) } t--; sector -= t->address - t->index1; - if (sector < t->pregap) + if (!data && sector < t->pregap) return NULL; // pregap silence *sectorp = sector; return t; @@ -425,7 +425,7 @@ static void *cdda_play_func (void *v) bufon[0] = bufon[1] = 0; bufnum = 0; - cda_audio *cda = new cda_audio (num_sectors); + cda_audio *cda = new cda_audio (num_sectors, 2352); while (cdu->cdda_play > 0) { @@ -441,10 +441,10 @@ static void *cdda_play_func (void *v) cdda_pos = cdu->cdda_start; oldplay = cdu->cdda_play; sector = cdu->cd_last_pos = cdda_pos; - t = findtoc (cdu, §or); + t = findtoc (cdu, §or, false); if (!t) { sector = cdu->cd_last_pos = cdda_pos + 2 * 75; - t = findtoc (cdu, §or); + t = findtoc (cdu, §or, false); if (!t) { write_log (_T("IMAGE CDDA: illegal sector number %d\n"), cdu->cdda_start); setstate (cdu, AUDIO_STATUS_PLAY_ERROR); @@ -469,7 +469,7 @@ static void *cdda_play_func (void *v) bool seenindex = false; for (sector = cdda_pos - 200; sector < cdda_pos; sector++) { int sec = sector; - t = findtoc (cdu, &sec); + t = findtoc (cdu, &sec, false); if (t) { uae_u8 subbuf[SUB_CHANNEL_SIZE]; getsub_deinterleaved (subbuf, cdu, t, sector); @@ -499,13 +499,13 @@ static void *cdda_play_func (void *v) setstate (cdu, AUDIO_STATUS_IN_PROGRESS); sector = cdda_pos; - struct cdtoc *t1 = findtoc (cdu, §or); + struct cdtoc *t1 = findtoc (cdu, §or, false); int tsector = cdda_pos + 2 * 75; - struct cdtoc *t2 = findtoc (cdu, &tsector); + struct cdtoc *t2 = findtoc (cdu, &tsector, false); if (t1 != t2) { for (sector = cdda_pos; sector < cdda_pos + 2 * 75; sector++) { int sec = sector; - t = findtoc (cdu, &sec); + t = findtoc (cdu, &sec, false); if (t == t2) break; silentframes++; @@ -540,7 +540,7 @@ static void *cdda_play_func (void *v) memset (subbuf, 0, SUB_CHANNEL_SIZE); - t = findtoc (cdu, §or); + t = findtoc (cdu, §or, false); if (t) { if (t->track != oldtrack) { oldtrack = t->track; @@ -786,15 +786,32 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int if (!cdu) return 0; int asector = sector; - struct cdtoc *t = findtoc (cdu, §or); - int ssize = t->size + t->skipsize; + struct cdtoc *t = findtoc (cdu, §or, true); + int ssize; if (!t) goto end; + ssize = t->size + t->skipsize; cdda_stop (cdu); if (sectorsize > 0) { - if (sectorsize == 2352 && t->size == 2048) { + if (sectorsize == 2352 && t->size == 2336) { + // 2336 -> 2352 + while (size-- > 0) { + int address = asector + 150; + data[0] = 0x00; + memset(data + 1, 0xff, 11); + data[12] = tobcd((uae_u8)(address / (60 * 75))); + data[13] = tobcd((uae_u8)((address / 75) % 60)); + data[14] = tobcd((uae_u8)(address % 75)); + data[15] = 2; /* MODE2 */ + do_read(cdu, t, data + 16, sector, 0, t->size); + sector++; + asector++; + data += sectorsize; + ret += sectorsize; + } + } else if (sectorsize == 2352 && t->size == 2048) { // 2048 -> 2352 while (size-- > 0) { memset (data, 0, 16); @@ -898,7 +915,7 @@ static int command_read (int unitnum, uae_u8 *data, int sector, int numsectors) struct cdunit *cdu = unitisopen (unitnum); if (!cdu) return 0; - struct cdtoc *t = findtoc (cdu, §or); + struct cdtoc *t = findtoc (cdu, §or, true); if (!t) return 0; cdda_stop (cdu); diff --git a/od-win32/blkdev_win32_ioctl.cpp b/od-win32/blkdev_win32_ioctl.cpp index cc658d6e..bba1d81c 100644 --- a/od-win32/blkdev_win32_ioctl.cpp +++ b/od-win32/blkdev_win32_ioctl.cpp @@ -502,7 +502,7 @@ static void *cdda_play (void *v) bufnum = 0; buffered = 0; - cda_audio *cda = new cda_audio (num_sectors); + cda_audio *cda = new cda_audio (num_sectors, 2352); while (ciw->cdda_play > 0) { diff --git a/od-win32/cda_play.cpp b/od-win32/cda_play.cpp index 0f1a648b..c2fe1d82 100644 --- a/od-win32/cda_play.cpp +++ b/od-win32/cda_play.cpp @@ -52,15 +52,16 @@ cda_audio::~cda_audio() } } -cda_audio::cda_audio(int num_sectors) +cda_audio::cda_audio(int num_sectors, int sectorsize) { active = false; playing = false; volume[0] = volume[1] = 0; - bufsize = num_sectors * 2352; + bufsize = num_sectors * sectorsize; + this->sectorsize = sectorsize; for (int i = 0; i < 2; i++) { - buffers[i] = xcalloc (uae_u8, num_sectors * 4096); + buffers[i] = xcalloc (uae_u8, num_sectors * ((bufsize + 4095) & ~4095)); } WAVEFORMATEX wav; @@ -152,7 +153,7 @@ cda_audio::cda_audio(int num_sectors) this->num_sectors = num_sectors; for (int i = 0; i < 2; i++) { memset (&whdr[i], 0, sizeof WAVEHDR); - whdr[i].dwBufferLength = 2352 * num_sectors; + whdr[i].dwBufferLength = sectorsize * num_sectors; whdr[i].lpData = (LPSTR)buffers[i]; mmr = waveOutPrepareHeader (wavehandle, &whdr[i], sizeof (WAVEHDR)); if (mmr != MMSYSERR_NOERROR) { @@ -215,7 +216,7 @@ bool cda_audio::play(int bufnum) return true; #else uae_s16 *p = (uae_s16*)(buffers[bufnum]); - for (int i = 0; i < num_sectors * 2352 / 4; i++) { + for (int i = 0; i < num_sectors * sectorsize / 4; i++) { p[i * 2 + 0] = p[i * 2 + 0] * volume[0] / 32768; p[i * 2 + 1] = p[i * 2 + 1] * volume[1] / 32768; } @@ -239,3 +240,10 @@ void cda_audio::wait(int bufnum) Sleep (10); #endif } + +bool cda_audio::isplaying(int bufnum) +{ + if (!active || !playing) + return false; + return (whdr[bufnum].dwFlags & WHDR_DONE) == 0; +} diff --git a/od-win32/cda_play.h b/od-win32/cda_play.h index 87a7ccd8..32039414 100644 --- a/od-win32/cda_play.h +++ b/od-win32/cda_play.h @@ -11,6 +11,7 @@ private: HWAVEOUT wavehandle; WAVEHDR whdr[2]; int num_sectors; + int sectorsize; int volume[2]; LPDIRECTSOUND8 ds; LPDIRECTSOUNDBUFFER8 dsbuf; @@ -23,11 +24,12 @@ private: public: uae_u8 *buffers[2]; - cda_audio(int num_sectors); + cda_audio(int num_sectors, int sectorsize); ~cda_audio(); void setvolume(int master, int left, int right); bool play(int bufnum); void wait(void); void wait(int bufnum); + bool isplaying(int bufnum); }; -- 2.47.3