}
-static struct cdtoc *findtoc (struct cdunit *cdu, int *sectorp)
+static struct cdtoc *findtoc (struct cdunit *cdu, int *sectorp, bool data)
{
int i;
int sector;
}
t--;
sector -= t->address - t->index1;
- if (sector < t->pregap)
+ if (!data && sector < t->pregap)
return NULL; // pregap silence
*sectorp = sector;
return t;
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) {
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);
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);
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++;
memset (subbuf, 0, SUB_CHANNEL_SIZE);
- t = findtoc (cdu, §or);
+ t = findtoc (cdu, §or, false);
if (t) {
if (t->track != oldtrack) {
oldtrack = t->track;
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);
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);
}
}
-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;
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) {
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;
}
Sleep (10);
#endif
}
+
+bool cda_audio::isplaying(int bufnum)
+{
+ if (!active || !playing)
+ return false;
+ return (whdr[bufnum].dwFlags & WHDR_DONE) == 0;
+}