8
8
#define CONTEXT_POINTER "contextPointer"
10
10
typedef struct java_context {
15
15
extern JNIEnv* pulse_thread_env;
17
17
static void set_sink_input_volume_callback(pa_context* context, int success,
19
notifyWaitingOperations(pulse_thread_env);
19
notifyWaitingOperations(pulse_thread_env);
23
23
const char* getStringFromFormat(pa_sample_format_t format) {
27
if (format == PA_SAMPLE_U8) {
28
value = "PA_SAMPLE_U8";
29
} else if (format == PA_SAMPLE_ALAW) {
30
value = "PA_SAMPLE_ALAW";
31
} else if (format == PA_SAMPLE_ULAW) {
32
value = "PA_SAMPLE_ULAW";
33
} else if (format == PA_SAMPLE_S16BE) {
34
value = "PA_SAMPLE_S16BE";
35
} else if (format == PA_SAMPLE_S16LE) {
36
value = "PA_SAMPLE_S16LE";
37
} else if (format == PA_SAMPLE_S32BE) {
38
value = "PA_SAMPLE_S32BE";
39
} else if (format == PA_SAMPLE_S32LE) {
40
value = "PA_SAMPLE_S32LE";
42
value = "PA_SAMPLE_INVALID";
27
if (format == PA_SAMPLE_U8) {
28
value = "PA_SAMPLE_U8";
29
} else if (format == PA_SAMPLE_ALAW) {
30
value = "PA_SAMPLE_ALAW";
31
} else if (format == PA_SAMPLE_ULAW) {
32
value = "PA_SAMPLE_ULAW";
33
} else if (format == PA_SAMPLE_S16BE) {
34
value = "PA_SAMPLE_S16BE";
35
} else if (format == PA_SAMPLE_S16LE) {
36
value = "PA_SAMPLE_S16LE";
37
} else if (format == PA_SAMPLE_S32BE) {
38
value = "PA_SAMPLE_S32BE";
39
} else if (format == PA_SAMPLE_S32LE) {
40
value = "PA_SAMPLE_S32LE";
42
value = "PA_SAMPLE_INVALID";
48
48
pa_sample_format_t getFormatFromString(const char* encoding) {
50
pa_sample_format_t format;
52
if (strcmp(encoding, "PA_SAMPLE_U8") == 0) {
53
format = PA_SAMPLE_U8;
54
} else if (strcmp(encoding, "PA_SAMPLE_ALAW") == 0) {
55
format = PA_SAMPLE_ALAW;
56
} else if (strcmp(encoding, "PA_SAMPLE_ULAW;") == 0) {
57
format = PA_SAMPLE_ULAW;
58
} else if (strcmp(encoding, "PA_SAMPLE_S16BE") == 0) {
59
format = PA_SAMPLE_S16BE;
60
} else if (strcmp(encoding, "PA_SAMPLE_S16LE") == 0) {
61
format = PA_SAMPLE_S16LE;
62
} else if (strcmp(encoding, "PA_SAMPLE_S32BE") == 0) {
63
format = PA_SAMPLE_S32BE;
64
} else if (strcmp(encoding, "PA_SAMPLE_S32LE") == 0) {
65
format = PA_SAMPLE_S32LE;
67
format = PA_SAMPLE_INVALID;
50
pa_sample_format_t format;
52
if (strcmp(encoding, "PA_SAMPLE_U8") == 0) {
53
format = PA_SAMPLE_U8;
54
} else if (strcmp(encoding, "PA_SAMPLE_ALAW") == 0) {
55
format = PA_SAMPLE_ALAW;
56
} else if (strcmp(encoding, "PA_SAMPLE_ULAW;") == 0) {
57
format = PA_SAMPLE_ULAW;
58
} else if (strcmp(encoding, "PA_SAMPLE_S16BE") == 0) {
59
format = PA_SAMPLE_S16BE;
60
} else if (strcmp(encoding, "PA_SAMPLE_S16LE") == 0) {
61
format = PA_SAMPLE_S16LE;
62
} else if (strcmp(encoding, "PA_SAMPLE_S32BE") == 0) {
63
format = PA_SAMPLE_S32BE;
64
} else if (strcmp(encoding, "PA_SAMPLE_S32LE") == 0) {
65
format = PA_SAMPLE_S32LE;
67
format = PA_SAMPLE_INVALID;
73
73
static void stream_state_callback(pa_stream* stream, void *userdata) {
74
//printf("stream_state_callback called\n");
76
java_context* context = userdata;
82
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
83
callJavaVoidMethod(context->env, context->obj, "stateCallback");
85
callJavaVoidMethod(pulse_thread_env, context->obj, "stateCallback");
74
//printf("stream_state_callback called\n");
76
java_context* context = userdata;
82
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
83
callJavaVoidMethod(context->env, context->obj, "stateCallback");
85
callJavaVoidMethod(pulse_thread_env, context->obj, "stateCallback");
90
90
static void stream_write_callback(pa_stream *stream, size_t length,
92
// printf("stream_write_callback called\n");
94
java_context* context = userdata;
100
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
101
callJavaVoidMethod(context->env, context->obj, "writeCallback");
103
callJavaVoidMethod(pulse_thread_env, context->obj, "writeCallback");
92
// printf("stream_write_callback called\n");
94
java_context* context = userdata;
100
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
101
callJavaVoidMethod(context->env, context->obj, "writeCallback");
103
callJavaVoidMethod(pulse_thread_env, context->obj, "writeCallback");
107
107
static void stream_read_callback(pa_stream *stream, size_t length,
109
// printf("stream_read_callback called\n");
111
java_context* context = userdata;
114
assert(context->env);
115
assert(context->obj);
117
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
118
callJavaVoidMethod(context->env, context->obj, "readCallback");
120
callJavaVoidMethod(pulse_thread_env, context->obj, "readCallback");
109
// printf("stream_read_callback called\n");
111
java_context* context = userdata;
114
assert(context->env);
115
assert(context->obj);
117
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
118
callJavaVoidMethod(context->env, context->obj, "readCallback");
120
callJavaVoidMethod(pulse_thread_env, context->obj, "readCallback");
125
125
static void stream_overflow_callback(pa_stream *stream, void *userdata) {
126
//printf("stream_overflow_callback called\n");
128
java_context* context = userdata;
131
assert(context->env);
132
assert(context->obj);
134
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
135
callJavaVoidMethod(context->env, context->obj, "overflowCallback");
137
callJavaVoidMethod(pulse_thread_env, context->obj, "overflowCallback");
126
//printf("stream_overflow_callback called\n");
128
java_context* context = userdata;
131
assert(context->env);
132
assert(context->obj);
134
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
135
callJavaVoidMethod(context->env, context->obj, "overflowCallback");
137
callJavaVoidMethod(pulse_thread_env, context->obj, "overflowCallback");
141
141
static void stream_underflow_callback(pa_stream *stream, void *userdata) {
142
// printf("stream_underflow_callback called\n");
144
java_context* context = userdata;
147
assert(context->env);
148
assert(context->obj);
150
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
151
callJavaVoidMethod(context->env, context->obj, "underflowCallback");
153
callJavaVoidMethod(pulse_thread_env, context->obj, "underflowCallback");
142
// printf("stream_underflow_callback called\n");
144
java_context* context = userdata;
147
assert(context->env);
148
assert(context->obj);
150
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
151
callJavaVoidMethod(context->env, context->obj, "underflowCallback");
153
callJavaVoidMethod(pulse_thread_env, context->obj, "underflowCallback");
158
158
static void update_timing_info_callback(pa_stream* stream, int success, void* userdata) {
161
JNIEnv* env = pulse_thread_env;
164
notifyWaitingOperations(env);
167
throwByName(env, ILLEGAL_STATE_EXCEPTION, "drain failed");
161
JNIEnv* env = pulse_thread_env;
164
notifyWaitingOperations(env);
167
throwByName(env, ILLEGAL_STATE_EXCEPTION, "drain failed");
173
172
// requires pulseaudio 0.9.11 :(
174
173
static void stream_started_callback(pa_stream *stream, void *userdata) {
175
// printf("stream_started_callback called\n");
176
java_context* context = userdata;
179
assert(context->env);
180
assert(context->obj);
174
// printf("stream_started_callback called\n");
175
java_context* context = userdata;
178
assert(context->env);
179
assert(context->obj);
182
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
183
callJavaVoidMethod(context->env, context->obj,
184
"playbackStartedCallback");
186
callJavaVoidMethod(pulse_thread_env, context->obj,
187
"playbackStartedCallback");
181
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
182
callJavaVoidMethod(context->env, context->obj,
183
"playbackStartedCallback");
185
callJavaVoidMethod(pulse_thread_env, context->obj,
186
"playbackStartedCallback");
192
191
static void stream_latency_update_callback(pa_stream *stream, void *userdata) {
193
// printf("stream_latency_update_callback called\n");
195
java_context* context = userdata;
198
assert(context->env);
199
assert(context->obj);
201
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
202
callJavaVoidMethod(context->env, context->obj, "latencyUpdateCallback");
204
callJavaVoidMethod(pulse_thread_env, context->obj,
205
"latencyUpdateCallback");
192
// printf("stream_latency_update_callback called\n");
194
java_context* context = userdata;
197
assert(context->env);
198
assert(context->obj);
200
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
201
callJavaVoidMethod(context->env, context->obj, "latencyUpdateCallback");
203
callJavaVoidMethod(pulse_thread_env, context->obj,
204
"latencyUpdateCallback");
209
208
static void stream_moved_callback(pa_stream *stream, void *userdata) {
210
// printf("stream_moved_callback called\n");
212
java_context* context = userdata;
215
assert(context->env);
216
assert(context->obj);
218
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
219
callJavaVoidMethod(context->env, context->obj, "movedCallback");
221
callJavaVoidMethod(pulse_thread_env, context->obj, "movedCallback");
209
// printf("stream_moved_callback called\n");
211
java_context* context = userdata;
214
assert(context->env);
215
assert(context->obj);
217
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
218
callJavaVoidMethod(context->env, context->obj, "movedCallback");
220
callJavaVoidMethod(pulse_thread_env, context->obj, "movedCallback");
226
225
static void stream_suspended_callback(pa_stream *stream, void *userdata) {
227
// printf("stream_suspended_callback called\n");
229
java_context* context = userdata;
232
assert(context->env);
233
assert(context->obj);
235
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
236
callJavaVoidMethod(context->env, context->obj, "suspendedCallback");
238
callJavaVoidMethod(pulse_thread_env, context->obj, "suspendedCallback");
226
// printf("stream_suspended_callback called\n");
228
java_context* context = userdata;
231
assert(context->env);
232
assert(context->obj);
234
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
235
callJavaVoidMethod(context->env, context->obj, "suspendedCallback");
237
callJavaVoidMethod(pulse_thread_env, context->obj, "suspendedCallback");
242
static void buf_attr_changed_callback(pa_stream *stream, void *userdata) {
243
java_context* context = userdata;
246
assert(context->env);
247
assert(context->obj);
249
if (pa_stream_get_state(stream) == PA_STREAM_CREATING) {
250
callJavaVoidMethod(context->env, context->obj, "bufferAttrCallback");
252
callJavaVoidMethod(pulse_thread_env, context->obj, "bufferAttrCallback");
256
// used to set stream flags and states.
257
// The names in Stream.java have a {STATE_,FLAG_} prefix, but we don't want to
258
// add the underscore in every line in init_constants, so we add it here. If
259
// constants with no prefix are ever introduced (i.e. java_prefix is "",
260
// it's important to remove the ##_ )
261
#define SET_STREAM_ENUM(env, clz, java_prefix, state_name) \
262
SET_JAVA_STATIC_LONG_FIELD_TO_PA_ENUM(env, clz, java_prefix##_, STREAM, state_name)
265
* Class: org_classpath_icedtea_pulseaudio_Stream
266
* Method: init_constants
269
JNIEXPORT void JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_init_1constants
270
(JNIEnv *env, jclass clz) {
272
SET_STREAM_ENUM(env, clz, STATE, UNCONNECTED);
273
SET_STREAM_ENUM(env, clz, STATE, CREATING);
274
SET_STREAM_ENUM(env, clz, STATE, READY);
275
SET_STREAM_ENUM(env, clz, STATE, FAILED);
276
SET_STREAM_ENUM(env, clz, STATE, TERMINATED);
279
SET_STREAM_ENUM(env, clz, FLAG, NOFLAGS);
280
SET_STREAM_ENUM(env, clz, FLAG, START_CORKED);
281
SET_STREAM_ENUM(env, clz, FLAG, INTERPOLATE_TIMING);
282
SET_STREAM_ENUM(env, clz, FLAG, NOT_MONOTONIC);
283
SET_STREAM_ENUM(env, clz, FLAG, AUTO_TIMING_UPDATE);
284
SET_STREAM_ENUM(env, clz, FLAG, NO_REMAP_CHANNELS);
285
SET_STREAM_ENUM(env, clz, FLAG, NO_REMIX_CHANNELS);
286
SET_STREAM_ENUM(env, clz, FLAG, FIX_FORMAT);
287
SET_STREAM_ENUM(env, clz, FLAG, FIX_RATE);
288
SET_STREAM_ENUM(env, clz, FLAG, FIX_CHANNELS);
289
SET_STREAM_ENUM(env, clz, FLAG, DONT_MOVE);
290
SET_STREAM_ENUM(env, clz, FLAG, VARIABLE_RATE);
291
SET_STREAM_ENUM(env, clz, FLAG, PEAK_DETECT);
292
SET_STREAM_ENUM(env, clz, FLAG, START_MUTED);
293
SET_STREAM_ENUM(env, clz, FLAG, ADJUST_LATENCY);
294
SET_STREAM_ENUM(env, clz, FLAG, EARLY_REQUESTS);
295
SET_STREAM_ENUM(env, clz, FLAG, DONT_INHIBIT_AUTO_SUSPEND);
296
SET_STREAM_ENUM(env, clz, FLAG, START_UNMUTED);
297
SET_STREAM_ENUM(env, clz, FLAG, FAIL_ON_SUSPEND);
248
305
JNIEXPORT void JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1new
249
306
(JNIEnv* env, jobject obj, jbyteArray contextPointer, jstring nameString,
250
jstring encodingString, jint sampleRate, jint channels) {
252
// printf("creating a new PulseAudio stream\n");
254
java_context* j_context = malloc(sizeof(java_context));
256
j_context->env = env;
257
j_context->obj = (*env)->NewGlobalRef(env, obj);
259
pa_context* context = convertJavaPointerToNative(env, contextPointer);
262
const char* name = NULL;
264
name = (*env)->GetStringUTFChars(env,nameString, NULL);
266
(*env)->DeleteGlobalRef(env, obj);
268
return; // oome thrown
272
const char *encoding = (*env)->GetStringUTFChars(env, encodingString, NULL);
273
if( encoding == NULL) {
274
return; //oome thrown
277
pa_sample_spec sample_spec;
279
sample_spec.format = getFormatFromString(encoding);
280
sample_spec.rate = sampleRate;
281
sample_spec.channels = channels;
283
if ( !pa_sample_spec_valid(&sample_spec)) {
284
throwByName(env, "java/lang/IllegalArgumentException", "Invalid format");
285
(*env)->ReleaseStringUTFChars(env, encodingString, encoding);
287
(*env)->ReleaseStringUTFChars(env, nameString,name);
292
pa_stream* stream = pa_stream_new(context, name, &sample_spec, NULL);
295
(*env)->ReleaseStringUTFChars(env, nameString,name);
298
setJavaPointer(env, obj, "streamPointer", stream);
302
* The stream has been created; now setup the callbacks
303
* so we can do somethig about them
307
pa_stream_set_state_callback (stream, stream_state_callback, j_context);
308
pa_stream_set_write_callback (stream, stream_write_callback, j_context);
309
pa_stream_set_read_callback (stream, stream_read_callback, j_context);
310
pa_stream_set_overflow_callback (stream, stream_overflow_callback, j_context);
311
pa_stream_set_underflow_callback (stream, stream_underflow_callback, j_context);
312
pa_stream_set_started_callback (stream, stream_started_callback, j_context);
313
pa_stream_set_latency_update_callback (stream, stream_latency_update_callback, j_context);
314
pa_stream_set_moved_callback (stream, stream_moved_callback, j_context);
315
pa_stream_set_suspended_callback (stream, stream_suspended_callback, j_context);
307
jstring encodingString, jint sampleRate, jint channels) {
309
// printf("creating a new PulseAudio stream\n");
311
java_context* j_context = malloc(sizeof(java_context));
313
j_context->env = env;
314
j_context->obj = (*env)->NewGlobalRef(env, obj);
316
setJavaPointer(env, obj, CONTEXT_POINTER, j_context);
318
pa_context* context = convertJavaPointerToNative(env, contextPointer);
321
const char* name = NULL;
323
name = (*env)->GetStringUTFChars(env,nameString, NULL);
325
(*env)->DeleteGlobalRef(env, obj);
327
return; // oome thrown
331
const char *encoding = (*env)->GetStringUTFChars(env, encodingString, NULL);
332
if( encoding == NULL) {
333
return; //oome thrown
336
pa_sample_spec sample_spec;
338
sample_spec.format = getFormatFromString(encoding);
339
sample_spec.rate = sampleRate;
340
sample_spec.channels = channels;
342
if ( !pa_sample_spec_valid(&sample_spec)) {
343
throwByName(env, "java/lang/IllegalArgumentException", "Invalid format");
344
(*env)->ReleaseStringUTFChars(env, encodingString, encoding);
346
(*env)->ReleaseStringUTFChars(env, nameString,name);
351
pa_stream* stream = pa_stream_new(context, name, &sample_spec, NULL);
354
(*env)->ReleaseStringUTFChars(env, nameString,name);
357
setJavaPointer(env, obj, STREAM_POINTER, stream);
361
* The stream has been created; now setup the callbacks
362
* so we can do somethig about them
366
pa_stream_set_state_callback (stream, stream_state_callback, j_context);
367
pa_stream_set_write_callback (stream, stream_write_callback, j_context);
368
pa_stream_set_read_callback (stream, stream_read_callback, j_context);
369
pa_stream_set_overflow_callback (stream, stream_overflow_callback, j_context);
370
pa_stream_set_underflow_callback (stream, stream_underflow_callback, j_context);
371
pa_stream_set_started_callback (stream, stream_started_callback, j_context);
372
pa_stream_set_latency_update_callback (stream, stream_latency_update_callback, j_context);
373
pa_stream_set_moved_callback (stream, stream_moved_callback, j_context);
374
pa_stream_set_suspended_callback (stream, stream_suspended_callback, j_context);
375
pa_stream_set_buffer_attr_callback(stream, buf_attr_changed_callback, j_context);
414
480
JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1connect_1playback
415
481
(JNIEnv* env, jobject obj, jstring device, jint bufferMaxLength,
416
jint bufferTargetLength, jint bufferPreBuffering,
417
jint bufferMinimumRequest, jint bufferFragmentSize, jint flags,
418
jbyteArray volumePointer, jbyteArray sync_streamPointer) {
420
pa_stream *sync_stream;
421
if(sync_streamPointer != NULL) {
422
sync_stream = convertJavaPointerToNative(env, sync_streamPointer);
423
printf("Master stream is %p\n", sync_stream);
428
pa_stream* stream = (pa_stream*) getJavaPointer(env, obj, STREAM_POINTER);
430
pa_buffer_attr buffer_attr;
432
memset(&buffer_attr, 0, sizeof(buffer_attr));
434
buffer_attr.maxlength = (uint32_t) bufferMaxLength;
435
buffer_attr.tlength = (uint32_t) bufferTargetLength;
436
buffer_attr.prebuf = (uint32_t) bufferPreBuffering;
437
buffer_attr.minreq = (uint32_t) bufferMinimumRequest;
440
printf("buffer maxlength: %u\n", buffer_attr.maxlength);
441
printf("buffer tlength: %u\n", buffer_attr.tlength);
442
printf("buffer prebuf: %u\n", buffer_attr.prebuf);
443
printf("buffer minreq: %u\n", buffer_attr.minreq);
444
printf("buffer fragsize: %u\n", buffer_attr.fragsize);
447
const char* dev = NULL;
448
if (device != NULL) {
449
dev = (*env)->GetStringUTFChars(env, device, NULL);
451
return -1; // oome thrown
454
/* Set flags to 0 to fix problem with draining before calling start, might need to
455
be changed back to PA_STREAM_START_CORKED in the future, if we'll be able to implement
457
int value = pa_stream_connect_playback(stream, dev, &buffer_attr, PA_STREAM_START_CORKED, NULL, sync_stream);
460
(*env)->ReleaseStringUTFChars(env, device, dev);
482
jint bufferTargetLength, jint bufferPreBuffering,
483
jint bufferMinimumRequest, jint bufferFragmentSize, jlong flags,
484
jbyteArray volumePointer, jbyteArray sync_streamPointer) {
485
pa_stream *sync_stream;
486
if(sync_streamPointer != NULL) {
487
sync_stream = convertJavaPointerToNative(env, sync_streamPointer);
488
printf("Master stream is %p\n", sync_stream);
493
pa_stream* stream = (pa_stream*) getJavaPointer(env, obj, STREAM_POINTER);
495
pa_buffer_attr buffer_attr;
497
memset(&buffer_attr, 0, sizeof(buffer_attr));
499
buffer_attr.maxlength = (uint32_t) bufferMaxLength;
500
buffer_attr.tlength = (uint32_t) bufferTargetLength;
501
buffer_attr.prebuf = (uint32_t) bufferPreBuffering;
502
buffer_attr.minreq = (uint32_t) bufferMinimumRequest;
504
const char* dev = NULL;
505
if (device != NULL) {
506
dev = (*env)->GetStringUTFChars(env, device, NULL);
508
return -1; // oome thrown
512
int value = pa_stream_connect_playback(stream, dev, &buffer_attr,
513
(pa_stream_flags_t) flags, NULL, sync_stream);
516
(*env)->ReleaseStringUTFChars(env, device, dev);
893
936
JNIEXPORT jbyteArray JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1set_1buffer_1attr
894
937
(JNIEnv* env, jobject obj, jobject bufferAttributeObject) {
896
pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, STREAM_POINTER);
899
jclass cls = (*env)->GetObjectClass(env, bufferAttributeObject);
902
pa_buffer_attr buffer;
904
jmethodID getMaxLengthID = (*env)->GetMethodID(env,cls,"getMaxLength","()I");
905
assert(getMaxLengthID);
906
buffer.maxlength = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getMaxLengthID);
908
jmethodID getTargetLengthID = (*env)->GetMethodID(env,cls,"getTargetLength","()I");
909
assert(getTargetLengthID);
910
buffer.tlength = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getTargetLengthID);
912
jmethodID getPreBufferingID = (*env)->GetMethodID(env,cls,"getPreBuffering","()I");
913
assert(getPreBufferingID);
914
buffer.prebuf = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getPreBufferingID);
916
jmethodID getMinimumRequestID = (*env)->GetMethodID(env, cls, "getMinimumRequest", "()I");
917
assert(getMinimumRequestID);
918
buffer.minreq = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getMinimumRequestID );
920
jmethodID getFragmentSizeID = (*env)->GetMethodID(env,cls,"getFragmentSize","()I");
921
assert(getFragmentSizeID);
922
buffer.fragsize = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getFragmentSizeID );
925
const pa_buffer_attr* old_buffer = pa_stream_get_buffer_attr(stream);
927
printf("old buffer values: %u %u %u %u %u\n", old_buffer->maxlength, old_buffer->tlength, old_buffer->prebuf, old_buffer->minreq, old_buffer->fragsize);
929
printf("want these values: %u %u %u %u %u\n", buffer.maxlength, buffer.tlength, buffer.prebuf, buffer.minreq, buffer.fragsize);
932
pa_operation* operation = pa_stream_set_buffer_attr(stream, &buffer, set_buffer_attr_callback, NULL);
935
return convertNativePointerToJava(env,operation);
939
pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, STREAM_POINTER);
942
jclass cls = (*env)->GetObjectClass(env, bufferAttributeObject);
945
pa_buffer_attr buffer;
947
jmethodID getMaxLengthID = (*env)->GetMethodID(env,cls,"getMaxLength","()I");
948
assert(getMaxLengthID);
949
buffer.maxlength = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getMaxLengthID);
951
jmethodID getTargetLengthID = (*env)->GetMethodID(env,cls,"getTargetLength","()I");
952
assert(getTargetLengthID);
953
buffer.tlength = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getTargetLengthID);
955
jmethodID getPreBufferingID = (*env)->GetMethodID(env,cls,"getPreBuffering","()I");
956
assert(getPreBufferingID);
957
buffer.prebuf = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getPreBufferingID);
959
jmethodID getMinimumRequestID = (*env)->GetMethodID(env, cls, "getMinimumRequest", "()I");
960
assert(getMinimumRequestID);
961
buffer.minreq = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getMinimumRequestID );
963
jmethodID getFragmentSizeID = (*env)->GetMethodID(env,cls,"getFragmentSize","()I");
964
assert(getFragmentSizeID);
965
buffer.fragsize = (uint32_t) (*env)->CallIntMethod(env, bufferAttributeObject, getFragmentSizeID );
968
const pa_buffer_attr* old_buffer = pa_stream_get_buffer_attr(stream);
970
printf("old buffer values: %u %u %u %u %u\n", old_buffer->maxlength, old_buffer->tlength, old_buffer->prebuf, old_buffer->minreq, old_buffer->fragsize);
972
printf("want these values: %u %u %u %u %u\n", buffer.maxlength, buffer.tlength, buffer.prebuf, buffer.minreq, buffer.fragsize);
975
pa_operation* operation = pa_stream_set_buffer_attr(stream, &buffer, set_buffer_attr_callback, NULL);
978
return convertNativePointerToJava(env,operation);
938
981
static void update_sample_rate_callback(pa_stream* stream, int success,
941
JNIEnv* env = pulse_thread_env;
943
notifyWaitingOperations(env);
984
JNIEnv* env = pulse_thread_env;
986
notifyWaitingOperations(env);
946
throwByName(env, ILLEGAL_STATE_EXCEPTION, "update_sampl_rate failed");
989
throwByName(env, ILLEGAL_STATE_EXCEPTION, "update_sampl_rate failed");