#include "portaudio.h"
#include "jpa_tools.h"
+#ifndef FALSE
+#define FALSE (0)
+#endif
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+
/*
* Class: com_portaudio_BlockingStream
* Method: getReadAvailable
/*
* Class: com_portaudio_BlockingStream
* Method: writeFloats
- * Signature: ([FI)V
+ * Signature: ([FI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_writeFloats
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeFloats
(JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames)
{
jfloat *carr;
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"null stream buffer");
- return;
+ return FALSE;
}
carr = (*env)->GetFloatArrayElements(env, buffer, NULL);
if (carr == NULL)
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"invalid stream buffer");
- return;
+ return FALSE;
}
err = Pa_WriteStream( stream, carr, numFrames );
(*env)->ReleaseFloatArrayElements(env, buffer, carr, 0);
- jpa_CheckError( env, err );
+ if( err == paOutputUnderflowed )
+ {
+ return TRUE;
+ }
+ else
+ {
+ jpa_CheckError( env, err );
+ return FALSE;
+ }
}
/*
* Class: com_portaudio_BlockingStream
* Method: readFloats
- * Signature: ([FI)V
+ * Signature: ([FI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_readFloats
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readFloats
(JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames)
{
jfloat *carr;
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"null stream buffer");
- return;
+ return FALSE;
}
carr = (*env)->GetFloatArrayElements(env, buffer, NULL);
if (carr == NULL)
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"invalid stream buffer");
- return;
+ return FALSE;
}
err = Pa_ReadStream( stream, carr, numFrames );
(*env)->ReleaseFloatArrayElements(env, buffer, carr, 0);
- jpa_CheckError( env, err );
+ if( err == paInputOverflowed )
+ {
+ return TRUE;
+ }
+ else
+ {
+ jpa_CheckError( env, err );
+ return FALSE;
+ }
}
+
/*
* Class: com_portaudio_BlockingStream
* Method: writeShorts
- * Signature: ([FI)V
+ * Signature: ([SI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_writeShorts
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeShorts
(JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames)
{
jshort *carr;
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"null stream buffer");
- return;
+ return FALSE;
}
carr = (*env)->GetShortArrayElements(env, buffer, NULL);
if (carr == NULL)
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"invalid stream buffer");
- return;
+ return FALSE;
}
err = Pa_WriteStream( stream, carr, numFrames );
(*env)->ReleaseShortArrayElements(env, buffer, carr, 0);
- jpa_CheckError( env, err );
+ if( err == paOutputUnderflowed )
+ {
+ return TRUE;
+ }
+ else
+ {
+ jpa_CheckError( env, err );
+ return FALSE;
+ }
}
/*
* Class: com_portaudio_BlockingStream
* Method: readShorts
- * Signature: ([FI)V
+ * Signature: ([SI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_readShorts
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readShorts
(JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames)
{
jshort *carr;
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"null stream buffer");
- return;
+ return FALSE;
}
carr = (*env)->GetShortArrayElements(env, buffer, NULL);
if (carr == NULL)
{
(*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"),
"invalid stream buffer");
- return;
+ return FALSE;
}
err = Pa_ReadStream( stream, carr, numFrames );
(*env)->ReleaseShortArrayElements(env, buffer, carr, 0);
- jpa_CheckError( env, err );
+ if( err == paInputOverflowed )
+ {
+ return TRUE;
+ }
+ else
+ {
+ jpa_CheckError( env, err );
+ return FALSE;
+ }
}
/*
/*
* Class: com_portaudio_BlockingStream
* Method: readFloats
- * Signature: ([FI)V
+ * Signature: ([FI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_readFloats
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readFloats
(JNIEnv *, jobject, jfloatArray, jint);
/*
* Class: com_portaudio_BlockingStream
* Method: writeFloats
- * Signature: ([FI)V
+ * Signature: ([FI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_writeFloats
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeFloats
(JNIEnv *, jobject, jfloatArray, jint);
/*
* Class: com_portaudio_BlockingStream
* Method: readShorts
- * Signature: ([SI)V
+ * Signature: ([SI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_readShorts
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readShorts
(JNIEnv *, jobject, jshortArray, jint);
/*
* Class: com_portaudio_BlockingStream
* Method: writeShorts
- * Signature: ([SI)V
+ * Signature: ([SI)Z
*/
-JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_writeShorts
+JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeShorts
(JNIEnv *, jobject, jshortArray, jint);
/*
*/
public native int getWriteAvailable();
- private native void readFloats( float[] buffer, int numFrames );
+ private native boolean readFloats( float[] buffer, int numFrames );
- private native void writeFloats( float[] buffer, int numFrames );
+ private native boolean writeFloats( float[] buffer, int numFrames );
/**
* Read 32-bit floating point data from the stream into the array.
* @param buffer
* @param numFrames
* number of frames to read
+ * @return true if an input overflow occurred
*/
- public void read( float[] buffer, int numFrames )
+ public boolean read( float[] buffer, int numFrames )
{
if( inputFormat != PortAudio.FORMAT_FLOAT_32 )
{
throw new RuntimeException(
"Tried to read float samples from a non float stream." );
}
- readFloats( buffer, numFrames );
+ return readFloats( buffer, numFrames );
}
/**
* @param buffer
* @param numFrames
* number of frames to write
+ * @return true if an output underflow occurred
*/
- public void write( float[] buffer, int numFrames )
+ public boolean write( float[] buffer, int numFrames )
{
if( outputFormat != PortAudio.FORMAT_FLOAT_32 )
{
throw new RuntimeException(
"Tried to write float samples to a non float stream." );
}
- writeFloats( buffer, numFrames );
+ return writeFloats( buffer, numFrames );
}
- private native void readShorts( short[] buffer, int numFrames );
+ private native boolean readShorts( short[] buffer, int numFrames );
- private native void writeShorts( short[] buffer, int numFrames );
+ private native boolean writeShorts( short[] buffer, int numFrames );
/**
* Read 16-bit integer data to the stream from the array.
* @param buffer
* @param numFrames
* number of frames to write
+ * @return true if an input overflow occurred
*/
- public void read( short[] buffer, int numFrames )
+ public boolean read( short[] buffer, int numFrames )
{
if( inputFormat != PortAudio.FORMAT_INT_16 )
{
throw new RuntimeException(
"Tried to read short samples from a non short stream." );
}
- readShorts( buffer, numFrames );
+ return readShorts( buffer, numFrames );
}
/**
* @param buffer
* @param numFrames
* number of frames to write
+ * @return true if an output underflow occurred
*/
- public void write( short[] buffer, int numFrames )
+ public boolean write( short[] buffer, int numFrames )
{
if( outputFormat != PortAudio.FORMAT_INT_16 )
{
throw new RuntimeException(
"Tried to write short samples from a non short stream." );
}
- writeShorts( buffer, numFrames );
+ return writeShorts( buffer, numFrames );
}
/**