2010-01-17 11:19:01 +00:00
|
|
|
/* 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
|
2010-07-04 22:49:00 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
2010-01-17 11:19:01 +00:00
|
|
|
*/
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-01-17 11:19:01 +00:00
|
|
|
// PortAudio support implemented by Zedr0n.
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-01-17 11:19:01 +00:00
|
|
|
#include "PortAudio.h"
|
|
|
|
#include "Linux.h"
|
|
|
|
|
|
|
|
PaStream *stream;
|
|
|
|
|
|
|
|
#define FRAMES_PER_BUFFER 4096
|
|
|
|
|
|
|
|
int paSetupSound()
|
|
|
|
{
|
|
|
|
// initialize portaudio
|
|
|
|
PaError err = Pa_Initialize();
|
|
|
|
if( err != paNoError) {
|
|
|
|
ERROR_LOG("ZeroSPU2: Error initializing portaudio: %s\n", Pa_GetErrorText(err) );
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ERROR_LOG("ZeroSPU2: Initialized portaudio... \n");
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-01-17 11:19:01 +00:00
|
|
|
/* Open an audio I/O stream. */
|
|
|
|
err = Pa_OpenDefaultStream( &stream,
|
|
|
|
0, /* no input channels */
|
|
|
|
2, /* stereo output */
|
|
|
|
paInt16, /* 16 bit integer point output */
|
|
|
|
SAMPLE_RATE,
|
|
|
|
FRAMES_PER_BUFFER, /* frames per buffer, i.e. the number
|
|
|
|
of sample frames that PortAudio will
|
|
|
|
request from the callback. Many apps
|
|
|
|
may want to use
|
|
|
|
paFramesPerBufferUnspecified, which
|
|
|
|
tells PortAudio to pick the best,
|
|
|
|
possibly changing, buffer size.*/
|
|
|
|
NULL, /* this is your callback function */
|
|
|
|
NULL ); /*This is a pointer that will be passed to
|
|
|
|
your callback*/
|
|
|
|
if( err != paNoError )
|
|
|
|
{
|
|
|
|
ERROR_LOG("ZeroSPU2: Error opening sound stream...\n");
|
|
|
|
return -1;
|
|
|
|
}
|
2010-04-25 00:31:27 +00:00
|
|
|
else ERROR_LOG("ZeroSPU2: Created sound stream successfully...\n");
|
2010-01-17 11:19:01 +00:00
|
|
|
|
|
|
|
MaxBuffer = 0;
|
|
|
|
|
|
|
|
err = Pa_StartStream( stream );
|
|
|
|
if( err != paNoError )
|
|
|
|
{
|
|
|
|
ERROR_LOG("ZeroSPU2: Error starting sound stream...\n");
|
|
|
|
return -1;
|
|
|
|
}
|
2010-04-25 00:31:27 +00:00
|
|
|
else ERROR_LOG("ZeroSPU2: Started sound stream successfully...\n");
|
2010-01-17 11:19:01 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void paRemoveSound()
|
2010-04-25 00:31:27 +00:00
|
|
|
{
|
2010-01-17 11:19:01 +00:00
|
|
|
PaError err = Pa_StopStream( stream );
|
|
|
|
if( err != paNoError )
|
|
|
|
ERROR_LOG("ZeroSPU2: PortAudio error: %s\n", Pa_GetErrorText( err ) );
|
|
|
|
else
|
|
|
|
ERROR_LOG("ZeroSPU2: stream stopped... \n");
|
|
|
|
|
|
|
|
err = Pa_Terminate();
|
|
|
|
if( err != paNoError )
|
|
|
|
ERROR_LOG("PortAudio error: %s\n", Pa_GetErrorText( err ) );
|
|
|
|
else
|
|
|
|
ERROR_LOG("ZeroSPU2: portaudio terminated... \n");
|
|
|
|
}
|
|
|
|
|
|
|
|
int paSoundGetBytesBuffered()
|
|
|
|
{
|
2010-04-25 00:31:27 +00:00
|
|
|
unsigned long l = Pa_GetStreamWriteAvailable(stream);
|
|
|
|
if(MaxBuffer == 0) MaxBuffer = l;
|
|
|
|
return MaxBuffer - l;
|
2010-01-17 11:19:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void paSoundFeedVoiceData(unsigned char* pSound, long lBytes)
|
|
|
|
{
|
|
|
|
Pa_WriteStream(stream, (void*) pSound, (unsigned long) lBytes / 4);
|
|
|
|
}
|
|
|
|
|