X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Foss.c;h=709cb3717b639c64132dd3d0616bbe5c07c60e93;hp=f4dd215ddeb90e1499440e237bb12f7d3ad29128;hb=92ca1ba64e939942ab05aaa3d578f0d165634275;hpb=ef79bbde537d6b9c745a7d86cb9df1d04c35590d diff --git a/plugins/dfsound/oss.c b/plugins/dfsound/oss.c index f4dd215d..709cb371 100644 --- a/plugins/dfsound/oss.c +++ b/plugins/dfsound/oss.c @@ -15,11 +15,14 @@ * * ***************************************************************************/ -#include "stdafx.h" - -#define _IN_OSS - -#include "externals.h" +#include +#include +#include +#include +#include +#include +#include +#include "out.h" //////////////////////////////////////////////////////////////////////// // oss globals @@ -37,7 +40,7 @@ extern int errno; // SETUP SOUND //////////////////////////////////////////////////////////////////////// -void SetupSound(void) +static int oss_init(void) { int pspeed=44100; int pstereo; @@ -46,33 +49,32 @@ void SetupSound(void) int myfrag; int oss_speed, oss_stereo; - if(iDisStereo) pstereo=OSS_MODE_MONO; - else pstereo=OSS_MODE_STEREO; - + pstereo = OSS_MODE_STEREO; oss_speed = pspeed; oss_stereo = pstereo; if((oss_audio_fd=open("/dev/dsp",O_WRONLY,0))==-1) { - printf("Sound device not available!\n"); - return; + printf("OSS device not available\n"); + return -1; } if(ioctl(oss_audio_fd,SNDCTL_DSP_RESET,0)==-1) { printf("Sound reset failed\n"); - return; + return -1; } // we use 64 fragments with 1024 bytes each + // rearmed: now using 10*4096 for better latency - fragsize=10; - myfrag=(63<<16)|fragsize; + fragsize=12; + myfrag=(10<<16)|fragsize; if(ioctl(oss_audio_fd,SNDCTL_DSP_SETFRAGMENT,&myfrag)==-1) { printf("Sound set fragment failed!\n"); - return; + return -1; } format = AFMT_S16_NE; @@ -80,44 +82,41 @@ void SetupSound(void) if(ioctl(oss_audio_fd,SNDCTL_DSP_SETFMT,&format) == -1) { printf("Sound format not supported!\n"); - return; + return -1; } if(format!=AFMT_S16_NE) { printf("Sound format not supported!\n"); - return; + return -1; } - if(ioctl(oss_audio_fd,SNDCTL_DSP_STEREO,&oss_stereo)==-1) + if(ioctl(oss_audio_fd,SNDCTL_DSP_STEREO,&oss_stereo)==-1 || !oss_stereo) { printf("Stereo mode not supported!\n"); - return; - } - - if(oss_stereo!=1) - { - iDisStereo=1; + return -1; } if(ioctl(oss_audio_fd,SNDCTL_DSP_SPEED,&oss_speed)==-1) { printf("Sound frequency not supported\n"); - return; + return -1; } if(oss_speed!=pspeed) { printf("Sound frequency not supported\n"); - return; + return -1; } + + return 0; } //////////////////////////////////////////////////////////////////////// // REMOVE SOUND //////////////////////////////////////////////////////////////////////// -void RemoveSound(void) +static void oss_finish(void) { if(oss_audio_fd != -1 ) { @@ -127,21 +126,21 @@ void RemoveSound(void) } //////////////////////////////////////////////////////////////////////// -// GET BYTES BUFFERED +// GET BUFFERED STATUS //////////////////////////////////////////////////////////////////////// -unsigned long SoundGetBytesBuffered(void) +static int oss_busy(void) { audio_buf_info info; unsigned long l; - if(oss_audio_fd == -1) return SOUNDSIZE; + if(oss_audio_fd == -1) return 1; if(ioctl(oss_audio_fd,SNDCTL_DSP_GETOSPACE,&info)==-1) l=0; else { if(info.fragments<(info.fragstotal>>1)) // can we write in at least the half of fragments? - l=SOUNDSIZE; // -> no? wait + l=1; // -> no? wait else l=0; // -> else go on } @@ -152,8 +151,17 @@ unsigned long SoundGetBytesBuffered(void) // FEED SOUND DATA //////////////////////////////////////////////////////////////////////// -void SoundFeedStreamData(unsigned char* pSound,long lBytes) +static void oss_feed(void *buf, int bytes) { if(oss_audio_fd == -1) return; - write(oss_audio_fd,pSound,lBytes); + write(oss_audio_fd, buf, bytes); +} + +void out_register_oss(struct out_driver *drv) +{ + drv->name = "oss"; + drv->init = oss_init; + drv->finish = oss_finish; + drv->busy = oss_busy; + drv->feed = oss_feed; }