Skip to content

Commit 30829f0

Browse files
authored
Update Android JNI audio dev to use 16bit PCM only (#3945)
1 parent 24ac587 commit 30829f0

File tree

1 file changed

+33
-29
lines changed

1 file changed

+33
-29
lines changed

pjmedia/src/pjmedia-audiodev/android_jni_dev.c

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ static int AndroidRecorderCallback(void *userData)
150150
{
151151
struct android_aud_stream *stream = (struct android_aud_stream *)userData;
152152
jmethodID read_method=0, record_method=0, stop_method=0;
153-
int size = stream->rec_buf_size;
154-
jbyteArray inputBuffer;
155-
jbyte *buf;
153+
int size = stream->rec_buf_size / 2;
154+
jshortArray inputBuffer;
155+
jshort *buf;
156156
JNIEnv *jni_env = 0;
157157
pj_bool_t attached = attach_jvm(&jni_env);
158158

@@ -166,7 +166,7 @@ static int AndroidRecorderCallback(void *userData)
166166

167167
/* Get methods ids */
168168
read_method = (*jni_env)->GetMethodID(jni_env, stream->record_class,
169-
"read", "([BII)I");
169+
"read", "([SII)I");
170170
record_method = (*jni_env)->GetMethodID(jni_env, stream->record_class,
171171
"startRecording", "()V");
172172
stop_method = (*jni_env)->GetMethodID(jni_env, stream->record_class,
@@ -177,7 +177,7 @@ static int AndroidRecorderCallback(void *userData)
177177
}
178178

179179
/* Create a buffer for frames read */
180-
inputBuffer = (*jni_env)->NewByteArray(jni_env, size);
180+
inputBuffer = (*jni_env)->NewShortArray(jni_env, size);
181181
if (inputBuffer == 0) {
182182
PJ_LOG(3, (THIS_FILE, "Unable to allocate input buffer"));
183183
goto on_return;
@@ -190,7 +190,7 @@ static int AndroidRecorderCallback(void *userData)
190190
while (!stream->quit_flag) {
191191
pjmedia_frame frame;
192192
pj_status_t status;
193-
int bytesRead;
193+
int shortRead;
194194

195195
if (!stream->running) {
196196
(*jni_env)->CallVoidMethod(jni_env, stream->record, stop_method);
@@ -200,25 +200,25 @@ static int AndroidRecorderCallback(void *userData)
200200
(*jni_env)->CallVoidMethod(jni_env, stream->record, record_method);
201201
}
202202

203-
bytesRead = (*jni_env)->CallIntMethod(jni_env, stream->record,
203+
shortRead = (*jni_env)->CallIntMethod(jni_env, stream->record,
204204
read_method, inputBuffer,
205205
0, size);
206-
if (bytesRead <= 0 || bytesRead != size) {
206+
if (shortRead <= 0 || shortRead != size) {
207207
PJ_LOG (4, (THIS_FILE, "Record thread : error %d reading data",
208-
bytesRead));
208+
shortRead));
209209
continue;
210210
}
211211

212-
buf = (*jni_env)->GetByteArrayElements(jni_env, inputBuffer, 0);
212+
buf = (*jni_env)->GetShortArrayElements(jni_env, inputBuffer, 0);
213213
frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
214-
frame.size = size;
214+
frame.size = stream->rec_buf_size;
215215
frame.bit_info = 0;
216216
frame.buf = (void *)buf;
217217
frame.timestamp.u64 = stream->rec_timestamp.u64;
218218

219219
status = (*stream->rec_cb)(stream->user_data, &frame);
220-
(*jni_env)->ReleaseByteArrayElements(jni_env, inputBuffer, buf,
221-
JNI_ABORT);
220+
(*jni_env)->ReleaseShortArrayElements(jni_env, inputBuffer, buf,
221+
JNI_ABORT);
222222
if (status != PJ_SUCCESS || stream->quit_flag)
223223
break;
224224

@@ -241,9 +241,9 @@ static int AndroidTrackCallback(void *userData)
241241
{
242242
struct android_aud_stream *stream = (struct android_aud_stream*) userData;
243243
jmethodID write_method=0, play_method=0, stop_method=0, flush_method=0;
244-
int size = stream->play_buf_size;
245-
jbyteArray outputBuffer;
246-
jbyte *buf;
244+
int size = stream->play_buf_size / 2;
245+
jshortArray outputBuffer;
246+
jshort *buf;
247247
JNIEnv *jni_env = 0;
248248
pj_bool_t attached = attach_jvm(&jni_env);
249249

@@ -255,7 +255,7 @@ static int AndroidTrackCallback(void *userData)
255255

256256
/* Get methods ids */
257257
write_method = (*jni_env)->GetMethodID(jni_env, stream->track_class,
258-
"write", "([BII)I");
258+
"write", "([SII)I");
259259
play_method = (*jni_env)->GetMethodID(jni_env, stream->track_class,
260260
"play", "()V");
261261
stop_method = (*jni_env)->GetMethodID(jni_env, stream->track_class,
@@ -269,12 +269,12 @@ static int AndroidTrackCallback(void *userData)
269269
goto on_return;
270270
}
271271

272-
outputBuffer = (*jni_env)->NewByteArray(jni_env, size);
272+
outputBuffer = (*jni_env)->NewShortArray(jni_env, size);
273273
if (outputBuffer == 0) {
274274
PJ_LOG(3, (THIS_FILE, "Unable to allocate output buffer"));
275275
goto on_return;
276276
}
277-
buf = (*jni_env)->GetByteArrayElements(jni_env, outputBuffer, 0);
277+
buf = (*jni_env)->GetShortArrayElements(jni_env, outputBuffer, 0);
278278

279279
/* Start playing */
280280
pj_thread_set_prio(NULL, THREAD_PRIORITY_URGENT_AUDIO);
@@ -283,7 +283,7 @@ static int AndroidTrackCallback(void *userData)
283283
while (!stream->quit_flag) {
284284
pjmedia_frame frame;
285285
pj_status_t status;
286-
int bytesWritten;
286+
int shortWritten;
287287

288288
if (!stream->running) {
289289
(*jni_env)->CallVoidMethod(jni_env, stream->track, stop_method);
@@ -295,7 +295,7 @@ static int AndroidTrackCallback(void *userData)
295295
}
296296

297297
frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
298-
frame.size = size;
298+
frame.size = stream->play_buf_size;
299299
frame.buf = (void *)buf;
300300
frame.timestamp.u64 = stream->play_timestamp.u64;
301301
frame.bit_info = 0;
@@ -307,24 +307,24 @@ static int AndroidTrackCallback(void *userData)
307307
if (frame.type != PJMEDIA_FRAME_TYPE_AUDIO)
308308
pj_bzero(frame.buf, frame.size);
309309

310-
(*jni_env)->ReleaseByteArrayElements(jni_env, outputBuffer, buf,
310+
(*jni_env)->ReleaseShortArrayElements(jni_env, outputBuffer, buf,
311311
JNI_COMMIT);
312312

313313
/* Write to the device output. */
314-
bytesWritten = (*jni_env)->CallIntMethod(jni_env, stream->track,
314+
shortWritten = (*jni_env)->CallIntMethod(jni_env, stream->track,
315315
write_method, outputBuffer,
316316
0, size);
317-
if (bytesWritten <= 0 || bytesWritten != size) {
317+
if (shortWritten <= 0 || shortWritten != size) {
318318
PJ_LOG(4, (THIS_FILE, "Player thread: Error %d writing data",
319-
bytesWritten));
319+
shortWritten));
320320
continue;
321321
}
322322

323323
stream->play_timestamp.u64 += stream->param.samples_per_frame /
324324
stream->param.channel_count;
325325
};
326326

327-
(*jni_env)->ReleaseByteArrayElements(jni_env, outputBuffer, buf, 0);
327+
(*jni_env)->ReleaseShortArrayElements(jni_env, outputBuffer, buf, 0);
328328
(*jni_env)->DeleteLocalRef(jni_env, outputBuffer);
329329

330330
on_return:
@@ -476,7 +476,8 @@ static pj_status_t android_create_stream(pjmedia_aud_dev_factory *f,
476476

477477
PJ_ASSERT_RETURN(param->channel_count >= 1 && param->channel_count <= 2,
478478
PJ_EINVAL);
479-
PJ_ASSERT_RETURN(param->bits_per_sample==8 || param->bits_per_sample==16,
479+
PJ_ASSERT_RETURN(/* param->bits_per_sample==8 || */
480+
param->bits_per_sample==16,
480481
PJ_EINVAL);
481482
PJ_ASSERT_RETURN(play_cb && rec_cb && p_aud_strm, PJ_EINVAL);
482483

@@ -500,8 +501,11 @@ static pj_status_t android_create_stream(pjmedia_aud_dev_factory *f,
500501
12 /*CHANNEL_IN_STEREO*/;
501502
channelOutCfg = (param->channel_count == 1)? 4 /*CHANNEL_OUT_MONO*/:
502503
12 /*CHANNEL_OUT_STEREO*/;
503-
sampleFormat = (param->bits_per_sample == 8)? 3 /*ENCODING_PCM_8BIT*/:
504-
2 /*ENCODING_PCM_16BIT*/;
504+
505+
// The 8bit/byte read/write methods no longer support 16bit
506+
//sampleFormat = (param->bits_per_sample == 8)? 3 /*ENCODING_PCM_8BIT*/:
507+
// 2 /*ENCODING_PCM_16BIT*/;
508+
sampleFormat = 2 /*ENCODING_PCM_16BIT*/;
505509

506510
attached = attach_jvm(&jni_env);
507511

0 commit comments

Comments
 (0)