2
#include "PortAudioDriver.h"
4
#ifdef PORTAUDIO_SUPPORT
8
#include <hydrogen/Preferences.h>
12
int portAudioCallback(
15
unsigned long framesPerBuffer,
20
PortAudioDriver *pDriver = ( PortAudioDriver* )userData;
21
pDriver->m_processCallback( pDriver->m_nBufferSize, NULL );
23
float *out = ( float* )outputBuffer;
25
for ( unsigned i = 0; i < framesPerBuffer; i++ ) {
26
*out++ = pDriver->m_pOut_L[ i ];
27
*out++ = pDriver->m_pOut_R[ i ];
34
PortAudioDriver::PortAudioDriver( audioProcessCallback processCallback )
35
: AudioOutput( "PortAudioDriver" )
36
, m_processCallback( processCallback )
41
m_nBufferSize = Preferences::get_instance()->m_nBufferSize;
42
m_nSampleRate = Preferences::get_instance()->m_nSampleRate;
46
PortAudioDriver::~PortAudioDriver()
51
int PortAudioDriver::init( unsigned nBufferSize )
60
// return 1: Generic error
62
int PortAudioDriver::connect()
64
INFOLOG( "[connect]" );
66
m_pOut_L = new float[ m_nBufferSize ];
67
m_pOut_R = new float[ m_nBufferSize ];
69
int err = Pa_Initialize();
72
if ( err != paNoError ) {
73
ERRORLOG( "Portaudio error in Pa_Initialize: " + QString( Pa_GetErrorText( err ) ) );
77
err = Pa_OpenDefaultStream(
78
&m_pStream, /* passes back stream pointer */
79
0, /* no input channels */
80
2, /* stereo output */
81
paFloat32, /* 32 bit floating point output */
82
m_nSampleRate, // sample rate
83
m_nBufferSize, // frames per buffer
84
0, // number of buffers, if zero then use default minimum
85
portAudioCallback, /* specify our custom callback */
86
this ); /* pass our data through to callback */
89
if ( err != paNoError ) {
90
ERRORLOG( "Portaudio error in Pa_OpenDefaultStream: " + QString( Pa_GetErrorText( err ) ) );
94
err = Pa_StartStream( m_pStream );
97
if ( err != paNoError ) {
98
ERRORLOG( "Portaudio error in Pa_StartStream: " + QString( Pa_GetErrorText( err ) ) );
104
void PortAudioDriver::disconnect()
106
int err = Pa_StopStream( m_pStream );
109
if ( err != paNoError ) {
110
ERRORLOG( "Err: " + QString( Pa_GetErrorText( err ) ) );
113
err = Pa_CloseStream( m_pStream );
116
if ( err != paNoError ) {
117
ERRORLOG( "Err: " + QString( Pa_GetErrorText( err ) ) );
129
unsigned PortAudioDriver::getBufferSize()
131
return m_nBufferSize;
134
unsigned PortAudioDriver::getSampleRate()
136
return m_nSampleRate;
139
float* PortAudioDriver::getOut_L()
144
float* PortAudioDriver::getOut_R()
149
void PortAudioDriver::updateTransportInfo()
153
void PortAudioDriver::play()
155
m_transport.m_status = TransportInfo::ROLLING;
158
void PortAudioDriver::stop()
160
m_transport.m_status = TransportInfo::STOPPED;
163
void PortAudioDriver::locate( unsigned long nFrame )
165
m_transport.m_nFrames = nFrame;
168
void PortAudioDriver::setBpm( float fBPM )
170
m_transport.m_nBPM = fBPM;