From: notaz Date: Mon, 5 Jan 2015 21:50:33 +0000 (+0200) Subject: spu: don't block on audio X-Git-Tag: r21~7 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e541b8e06ff03a7fe7bd75b1bc0ad53f60b2d0de;p=pcsx_rearmed.git spu: don't block on audio --- diff --git a/plugins/dfsound/alsa.c b/plugins/dfsound/alsa.c index b5655a98..6b9f83ea 100644 --- a/plugins/dfsound/alsa.c +++ b/plugins/dfsound/alsa.c @@ -195,8 +195,21 @@ static void alsa_feed(void *pSound, int lBytes) snd_pcm_prepare(handle); snd_pcm_writei(handle, sbuf, sizeof(sbuf) / 4); snd_pcm_writei(handle, sbuf, sizeof(sbuf) / 4); + snd_pcm_writei(handle, sbuf, sizeof(sbuf) / 4); + } + else + { + int l = snd_pcm_avail(handle); + if (l < lBytes / 4) + { + if (l == 0) + return; + + lBytes = l * 4; + } } - snd_pcm_writei(handle,pSound, lBytes / 4); + + snd_pcm_writei(handle, pSound, lBytes / 4); } void out_register_alsa(struct out_driver *drv) diff --git a/plugins/dfsound/oss.c b/plugins/dfsound/oss.c index 8093ae41..6b1cb4a5 100644 --- a/plugins/dfsound/oss.c +++ b/plugins/dfsound/oss.c @@ -34,6 +34,9 @@ #define OSS_SPEED_44100 44100 +#define FRAGMENT_SHIFT 12 +#define FRAGMENT_SIZE (1 << FRAGMENT_SHIFT) + static int oss_audio_fd = -1; extern int errno; @@ -46,7 +49,6 @@ static int oss_init(void) int pspeed=44100; int pstereo; int format; - int fragsize = 0; int myfrag; int oss_speed, oss_stereo; @@ -69,8 +71,7 @@ static int oss_init(void) // we use 64 fragments with 1024 bytes each // rearmed: now using 10*4096 for better latency - fragsize=12; - myfrag=(10<<16)|fragsize; + myfrag = (10<<16) | FRAGMENT_SHIFT; if(ioctl(oss_audio_fd,SNDCTL_DSP_SETFRAGMENT,&myfrag)==-1) { @@ -160,11 +161,18 @@ static void oss_feed(void *buf, int bytes) if(oss_audio_fd == -1) return; if(ioctl(oss_audio_fd,SNDCTL_DSP_GETOSPACE,&info)==0) { + // for fast forward + if(bytes > info.fragments * FRAGMENT_SIZE) + bytes = info.fragments * FRAGMENT_SIZE; + if(bytes == 0) + return; + if(info.fragments==info.fragstotal) { memset(sbuf, 0, sizeof(sbuf)); write(oss_audio_fd, sbuf, sizeof(sbuf)); write(oss_audio_fd, sbuf, sizeof(sbuf)); + write(oss_audio_fd, sbuf, sizeof(sbuf)); } }