]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2336 -> 2352 conversion. CDA player is also used for CD32 FMV audio.
authorToni Wilen <twilen@winuae.net>
Thu, 10 Jul 2014 14:18:12 +0000 (17:18 +0300)
committerToni Wilen <twilen@winuae.net>
Thu, 10 Jul 2014 14:18:12 +0000 (17:18 +0300)
blkdev_cdimage.cpp
od-win32/blkdev_win32_ioctl.cpp
od-win32/cda_play.cpp
od-win32/cda_play.h

index 4480dadbbdfefb3e34268a39c3b216bc3c975ffa..2d0b79ab8bf60b18e1f08522379b22bf4c42f437 100644 (file)
@@ -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, &sector);
+                       t = findtoc (cdu, &sector, false);
                        if (!t) {
                                sector = cdu->cd_last_pos = cdda_pos + 2 * 75;
-                               t = findtoc (cdu, &sector);
+                               t = findtoc (cdu, &sector, 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, &sector);
+                       struct cdtoc *t1 = findtoc (cdu, &sector, 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, &sector);
+                               t = findtoc (cdu, &sector, 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, &sector);
-       int ssize = t->size + t->skipsize;
+       struct cdtoc *t = findtoc (cdu, &sector, 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, &sector);
+       struct cdtoc *t = findtoc (cdu, &sector, true);
        if (!t)
                return 0;
        cdda_stop (cdu);
index cc658d6e810459d436bc83c900daeba68dde474e..bba1d81c8ab85c375841e6e52a0e252c9f160362 100644 (file)
@@ -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) {
 
index 0f1a648b9cca024ce304a7419aa01b4ae58059a4..c2fe1d8208b6ad512f1fe1ab7301715603d950ce 100644 (file)
@@ -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;
+}
index 87a7ccd8b0b6f4c2a7b87ebb281f7ad0282fb747..320394144969055aedf2b4b4aeef392e29603010 100644 (file)
@@ -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);
 };