pcsx2/plugins/zerospu2/Targets/OSS.cpp

125 lines
2.7 KiB
C++

/* ZeroSPU2
* Copyright (C) 2006-2010 zerofrog
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
// Modified by arcum42@gmail.com
#include "Linux.h"
#include "OSS.h"
static int oss_audio_fd = -1;
extern int errno;
// use OSS for sound
int OSSSetupSound()
{
int pspeed = SAMPLE_RATE;
int pstereo;
int format;
int fragsize = 0;
int myfrag;
int oss_speed, oss_stereo;
int err;
pstereo=OSS_MODE_STEREO;
oss_speed = pspeed;
oss_stereo = pstereo;
oss_audio_fd=open("/dev/dsp",O_WRONLY,0);
if (oss_audio_fd == -1)
{
ERROR_LOG("Sound device not available!\n");
return -1;
}
err= ioctl(oss_audio_fd,SNDCTL_DSP_RESET,0);
if (err == -1)
{
ERROR_LOG("Sound reset failed\n");
return -1;
}
// we use 64 fragments with 1024 bytes each
fragsize = 10;
myfrag = (63 << 16) | fragsize;
err = ioctl(oss_audio_fd,SNDCTL_DSP_SETFRAGMENT,&myfrag);
if (err == -1)
{
ERROR_LOG("Sound set fragment failed!\n");
return -1;
}
format = AFMT_S16_LE;
err = ioctl(oss_audio_fd,SNDCTL_DSP_SETFMT,&format);
if ((err == -1) || (format!=AFMT_S16_LE))
{
ERROR_LOG("Sound format not supported!\n");
return -1;
}
err = ioctl(oss_audio_fd,SNDCTL_DSP_STEREO,&oss_stereo);
if (err == -1)
{
ERROR_LOG("Stereo mode not supported!\n");
return -1;
}
err = ioctl(oss_audio_fd,SNDCTL_DSP_SPEED,&oss_speed);
if ((err == -1) || (oss_speed!=pspeed))
{
ERROR_LOG("Sound frequency not supported\n");
return -1;
}
return 0;
}
// REMOVE SOUND
void OSSRemoveSound()
{
if(oss_audio_fd != -1 ) {
close(oss_audio_fd);
oss_audio_fd = -1;
}
}
int OSSSoundGetBytesBuffered()
{
audio_buf_info info;
unsigned long l;
if(oss_audio_fd == -1)
return SOUNDSIZE;
if(ioctl(oss_audio_fd,SNDCTL_DSP_GETOSPACE,&info)==-1)
return 0;
else {
// can we write in at least the half of fragments?
if(info.fragments<(info.fragstotal>>1))
return SOUNDSIZE;
}
return 0;
}
// FEED SOUND DATA
void OSSSoundFeedVoiceData(unsigned char* pSound,long lBytes)
{
if(oss_audio_fd == -1) return;
write(oss_audio_fd,pSound,lBytes);
}