Exemplo n.º 1
0
void playCDDA(void)
{
#ifdef DEBUG_ANALYSIS
	dbg_anacnt_CDR_playCDDA++;
#endif
	long			d, i, s;
	unsigned char	tmp;

	if (playing) {

		if (subChanMixed) {
			s = 0;

			for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) {
				// read one sector
				d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle);
				if (d < CD_FRAMESIZE_RAW) {
					break;
				}

				s += d;

				// skip the subchannel data
				fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR);
			}
		}
		else {
			s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle);
		}

		if (s == 0) {
			playing = 0;
			fclose(cddaHandle);
			cddaHandle = NULL;
			initial_offset = 0;
			return;
		}

		if (!cdr.Muted && playing) {
			if (cddaBigEndian) {
				for (i = 0; i < s / 2; i++) {
					tmp = sndbuffer[i * 2];
					sndbuffer[i * 2] = sndbuffer[i * 2 + 1];
					sndbuffer[i * 2 + 1] = tmp;
				}
			}

			SPU_playCDDAchannel((unsigned char *)sndbuffer, s);
		}

		cdda_file_offset += s;
	}
}
Exemplo n.º 2
0
static void *playthread(void *param)
#endif
{
	long osleep, d, t, i, s;
	unsigned char	tmp;
	int ret = 0, sector_offs;

	t = GetTickCount();

	while (playing) {
		s = 0;
		for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) {
			sector_offs = cdda_cur_sector - cdda_first_sector;
			if (sector_offs < 0) {
				d = CD_FRAMESIZE_RAW;
				memset(sndbuffer + s, 0, d);
			}
			else {
				d = cdimg_read_func(cddaHandle, cdda_file_offset,
					sndbuffer + s, sector_offs);
				if (d < CD_FRAMESIZE_RAW)
					break;
			}

			s += d;
			cdda_cur_sector++;
		}

		if (s == 0) {
			playing = FALSE;
			initial_offset = 0;
			break;
		}

		if (!cdr.Muted && playing) {
			if (cddaBigEndian) {
				for (i = 0; i < s / 2; i++) {
					tmp = sndbuffer[i * 2];
					sndbuffer[i * 2] = sndbuffer[i * 2 + 1];
					sndbuffer[i * 2 + 1] = tmp;
				}
			}

			// can't do it yet due to readahead..
			//cdrAttenuate((short *)sndbuffer, s / 4, 1);
			do {
				ret = SPU_playCDDAchannel((short *)sndbuffer, s);
				if (ret == 0x7761)
					usleep(6 * 1000);
			} while (ret == 0x7761 && playing); // rearmed_wait
		}

		if (ret != 0x676f) { // !rearmed_go
			// do approx sleep
			long now;

			// HACK: stop feeding data while emu is paused
			extern int stop;
			while (stop && playing)
				usleep(10000);

			now = GetTickCount();
			osleep = t - now;
			if (osleep <= 0) {
				osleep = 1;
				t = now;
			}
			else if (osleep > CDDA_FRAMETIME) {
				osleep = CDDA_FRAMETIME;
				t = now;
			}

			usleep(osleep * 1000);
			t += CDDA_FRAMETIME;
		}

	}

#ifdef _WIN32
	_endthread();
#else
	pthread_exit(0);
	return NULL;
#endif
}
Exemplo n.º 3
0
static void *playthread(void *param)
#endif
{
	long			d, t, i, s;
	unsigned char	tmp;
	int sec;

	t = GetTickCount();

	iso_play_cdbuf = 0;
	iso_play_bufptr = 0;

	while (playing) {
		d = t - (long)GetTickCount();
		if (d <= 0) {
			d = 1;
		}
		else if (d > CDDA_FRAMETIME) {
			d = CDDA_FRAMETIME;
		}
#ifdef _WIN32
		Sleep(d);
#else
		usleep(d * 1000);
#endif

		t = GetTickCount() + CDDA_FRAMETIME;

		if (subChanMixed) {
			s = 0;

			for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) {
				// read one sector
				d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle);
				if (d < CD_FRAMESIZE_RAW) {
					break;
				}

				s += d;

				fread( subbuffer, 1, SUB_FRAMESIZE, cddaHandle );
			}
		}
		else {
			s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle);

			sec = cddaCurOffset / CD_FRAMESIZE_RAW;

			if (subHandle != NULL) {
				fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET);
				fread(subbuffer, 1, SUB_FRAMESIZE, subHandle);
			}
		}

		if (s == 0) {
			playing = FALSE;
			fclose(cddaHandle);
			cddaHandle = NULL;
			initial_offset = 0;
			break;
		}

		if (!cdr.Muted && playing) {
			if (cddaBigEndian) {
				for (i = 0; i < s / 2; i++) {
					tmp = sndbuffer[i * 2];
					sndbuffer[i * 2] = sndbuffer[i * 2 + 1];
					sndbuffer[i * 2 + 1] = tmp;
				}
			}

			// wipe data track
			if( subHandle || subChanMixed ) {
				if( ti[ ((struct SubQ *) subbuffer)->TrackNumber ].type == DATA )
					memset( sndbuffer, 0, s );
			}

			SPU_playCDDAchannel((short *)sndbuffer, s);
		}


		cddaCurOffset += s;

	
		// BIOS CD Player: Fast forward / reverse seek
		if( cdr.FastForward ) {
			// ~+0.25 sec
			cddaCurOffset += CD_FRAMESIZE_RAW * 75 * 3;

#if 0
			// Bad idea: too much static
			if( subChanInterleaved )
				fseek( cddaHandle, s * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET );
			else
				fseek( cddaHandle, s * CD_FRAMESIZE_RAW, SEEK_SET );
#endif
		}
		else if( cdr.FastBackward ) {
			// ~-0.25 sec
			cddaCurOffset -= CD_FRAMESIZE_RAW * 75 * 3;
			if( cddaCurOffset & 0x80000000 ) {
				cddaCurOffset = 0;
				cdr.FastBackward = 0;

				playing = 0;
				fclose(cddaHandle);
				cddaHandle = NULL;
				initial_offset = 0;
				break;
			}

#if 0
			// Bad idea: too much static
			if( subChanInterleaved )
				fseek( cddaHandle, s * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET );
			else
				fseek( cddaHandle, s * CD_FRAMESIZE_RAW, SEEK_SET );
#endif
		}

	
		// Vib Ribbon: decoded buffer IRQ
		iso_play_cdbuf = (u16 *)sndbuffer;
		iso_play_bufptr = 0;
	}

#ifdef _WIN32
	_endthread();
#else
	pthread_exit(0);
	return NULL;
#endif
}
Exemplo n.º 4
0
static void *playthread(void *param)
#endif
{
	long			d, t, i, s;
	unsigned char	tmp;

	t = GetTickCount();

	while (playing) {
		d = t - (long)GetTickCount();
		if (d <= 0) {
			d = 1;
		}
		else if (d > CDDA_FRAMETIME) {
			d = CDDA_FRAMETIME;
		}
#ifdef _WIN32
		Sleep(d);
#else
		usleep(d * 1000);
#endif
		// HACK: stop feeding data while emu is paused
		extern int stop;
		if (stop) {
			usleep(100000);
			continue;
		}

		t = GetTickCount() + CDDA_FRAMETIME;

		s = 0;
		for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) {
			d = cdimg_read_func(cddaHandle, sndbuffer + s, cdda_cur_sector, 0);
			if (d < CD_FRAMESIZE_RAW)
				break;

			s += d;
			cdda_cur_sector++;
		}

		if (subHandle != NULL) {
			fseek(subHandle, cdda_cur_sector * SUB_FRAMESIZE, SEEK_SET);
			fread(subbuffer, 1, SUB_FRAMESIZE, subHandle);

			if (subChanRaw) DecodeRawSubData();
		}

		if (s == 0) {
			playing = FALSE;
			initial_offset = 0;
			break;
		}

		if (!psxCdr.Muted && playing) {
			if (cddaBigEndian) {
				for (i = 0; i < s / 2; i++) {
					tmp = sndbuffer[i * 2];
					sndbuffer[i * 2] = sndbuffer[i * 2 + 1];
					sndbuffer[i * 2 + 1] = tmp;
				}
			}

			SPU_playCDDAchannel((short *)sndbuffer, s);
		}
	}

#ifdef _WIN32
	_endthread();
#else
	pthread_exit(0);
	return NULL;
#endif
}
Exemplo n.º 5
0
static void *playthread(void *param)
#endif
{
#ifdef DEBUG_ANALYSIS
	dbg_anacnt_CDR_playthread++;
#endif
	long			d, t, i, s;
	unsigned char	tmp;

	t = GetTickCount();

	while (playing) {
		d = t - (long)GetTickCount();
		if (d <= 0) {
			d = 1;
		}
		else if (d > CDDA_FRAMETIME) {
			d = CDDA_FRAMETIME;
		}
#ifdef _WIN32
		Sleep(d);
#else
		usleep(d * 1000);
#endif

		t = GetTickCount() + CDDA_FRAMETIME;

		if (subChanMixed) {
			s = 0;

			for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) {
				// read one sector
				d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle);
				if (d < CD_FRAMESIZE_RAW) {
					break;
				}

				s += d;

				// skip the subchannel data
				fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR);
			}
		}
		else {
			s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle);
		}

		if (s == 0) {
			playing = 0;
			fclose(cddaHandle);
			cddaHandle = NULL;
			initial_offset = 0;
			break;
		}

		if (!cdr.Muted && playing) {
			if (cddaBigEndian) {
				for (i = 0; i < s / 2; i++) {
					tmp = sndbuffer[i * 2];
					sndbuffer[i * 2] = sndbuffer[i * 2 + 1];
					sndbuffer[i * 2 + 1] = tmp;
				}
			}

			SPU_playCDDAchannel((unsigned char *)sndbuffer, s);
		}

		cdda_file_offset += s;
	}

#ifdef _WIN32
	_endthread();
#else
	pthread_exit(0);
	return NULL;
#endif
}